34 std::vector<std::pair<T, std::string>> get_channels()
const {
return channels_; }
36 std::vector<T> get_channel_numbers()
const {
37 std::vector<T> channel_numbers;
39 std::transform(channels_.begin(), channels_.end(), std::back_inserter(channel_numbers),
40 [](
auto const& pair) { return pair.first; });
42 return channel_numbers;
45 std::vector<std::string> get_labels()
const {
46 std::vector<std::string> labels;
48 std::transform(channels_.begin(), channels_.end(), std::back_inserter(labels),
49 [](
auto const& pair) { return pair.second; });
54 void add_channels(T channel, std::string label =
"") {
56 label = std::to_string(channel);
58 add_element(channel, label);
61 void add_channels(std::vector<T> channels, std::vector<std::string> labels = {}) {
62 channels_.insert(channels_.end(), channels.begin(), channels.end());
64 if (labels.size() == 0) {
65 for (
auto c : channels) {
66 add_element(c, std::to_string(c));
68 }
else if (labels.size() != channels.size()) {
69 throw std::length_error(
". channels and labels should have the same size.");
71 for (uint i = 0; i < channels.size(); i++) {
72 add_element(channels[i], labels[i]);
77 void add_channels(T range_min, T range_max) {
78 for (T channel = range_min; channel <= range_max; channel++) {
79 add_channels(channel);
83 void remove_channels(
double range_min,
double range_max) {
84 auto to_remove = std::remove_if(
85 channels_.begin(), channels_.end(),
86 [range_min, range_max](T x) { return x.first >= range_min and x.first <= range_max; });
88 channels_.erase(to_remove, channels_.end());
91 void remove_channels(std::vector<T> channels) {
92 auto to_remove = std::remove_if(channels_.begin(), channels_.end(), [channels](T x) {
93 return std::find(channels.begin(), channels.end(), x.first) != channels.end();
96 channels_.erase(to_remove, channels_.end());
99 void remove_channels(std::vector<std::string> labels) {
100 auto to_remove = std::remove_if(channels_.begin(), channels_.end(), [labels](T x) {
101 return std::find(labels.begin(), labels.end(), x.second) != labels.end();
104 channels_.erase(to_remove, channels_.end());
107 auto size()
const {
return channels_.size(); };
109 T& operator[](
size_t index) {
return channels_[index]; };
110 const T& operator[](
size_t index)
const {
return channels_[index]; };
112 auto begin()
const {
return channels_.begin(); };
113 auto end()
const {
return channels_.end(); };
115 auto begin() {
return channels_.begin(); };
116 auto end() {
return channels_.end(); };
126 std::string str =
"[";
127 if (!channels_.empty()) {
128 unsigned int index = 0;
129 bool inrange =
false;
131 while (index < channels_.size() - 1) {
132 if (channels_[index].first + 1 == channels_[index + 1].first) {
134 str += std::to_string(channels_[index].first) +
"-";
138 str += std::to_string(channels_[index].first) +
", ";
143 str += std::to_string(channels_[index].first);
157 for (
auto const& ch : channels_) {
158 if (ch.first >= range_max or ch.first < range_min) {
172 const auto subset_vec = get_channel_numbers();
173 const std::set<T> subset(subset_vec.begin(), subset_vec.end());
174 const std::set<T> channels(channels_vec.begin(), channels_vec.end());
176 return std::includes(channels.begin(), channels.end(), subset.begin(), subset.end());
185 bool is_subset(std::vector<std::string> labels_vec)
const {
186 const auto subset_vec = get_labels();
187 const std::set<std::string> subset(subset_vec.begin(), subset_vec.end());
188 const std::set<std::string> labels(labels_vec.begin(), labels_vec.end());
189 return std::includes(labels.begin(), labels.end(), subset.begin(), subset.end());
202 return std::is_sorted(
203 channels_.begin(), channels_.end(),
204 [](
const auto& lhs,
const auto& rhs) { return lhs.second < rhs.second; });
207 return std::is_sorted(channels_.begin(), channels_.end());
216 auto channels = get_channels();
217 std::sort(channels.begin(), channels.end());
218 return std::adjacent_find(channels.begin(), channels.end()) == channels.end();
232 void sort(
bool by_label =
false) {
234 std::sort(channels_.begin(), channels_.end(),
235 [](
const auto& lhs,
const auto& rhs) { return lhs.second < rhs.second; });
237 std::sort(channels_.begin(), channels_.end());
251 auto it = std::unique(channels_.begin(), channels_.end());
252 channels_.resize(std::distance(channels_.begin(), it));
256 void add_element(T channel, std::string label) {
258 channels_.begin(), channels_.end(),
259 [&label](
const std::pair<T, std::string>& ch) { return ch.second == label; })) {
260 throw std::invalid_argument(
". This label " + label +
261 " already exist in this channel list and should be unique");
264 channels_.push_back(std::make_pair(channel, label));
268 std::vector<std::pair<T, std::string>> channels_;