12 #include <tracking/trackFindingCDC/utilities/Range.h>
23 namespace TrackFindingCDC {
29 template <
class Ts,
class ACategoryFunction,
class ACategory>
30 ACategory common(
const Ts& items,
const ACategoryFunction& catFunc,
const ACategory defaultCat)
32 auto it = std::begin(items);
33 auto itEnd = std::end(items);
34 return common(it, itEnd, catFunc, defaultCat);
41 template <
class It,
class ACategoryFunction,
class ACategory>
42 ACategory common(It itBegin, It itEnd,
const ACategoryFunction& catFunc,
const ACategory defaultCat)
44 if (itBegin == itEnd)
return defaultCat;
45 const ACategory cat = catFunc(*itBegin);
46 for (It it = itBegin; it != itEnd; ++it) {
47 if (cat != catFunc(*it)) {
57 template <
class Ts,
class APredicate>
58 void erase_remove_if(Ts& ts,
const APredicate& predicate)
60 ts.erase(std::remove_if(std::begin(ts), std::end(ts), predicate), std::end(ts));
64 void only_best_N(Ts& ts,
const size_t N)
66 auto newEnd = std::next(ts.begin(), std::min(N, ts.size()));
67 ts.erase(newEnd, ts.end());
74 void erase_unique(Ts& ts)
76 ts.erase(std::unique(std::begin(ts), std::end(ts)), std::end(ts));
82 template <
class Ts,
class AEqual>
83 void erase_unique(Ts& ts,
const AEqual& equal)
85 ts.erase(std::unique(std::begin(ts), std::end(ts), equal), std::end(ts));
92 std::vector<std::pair<It, int> > unique_count(It itBegin, It itEnd)
94 std::vector<std::pair<It, int> > result;
95 if (itBegin == itEnd)
return result;
97 result.emplace_back(it, 1);
99 for (; it != itEnd; ++it) {
100 if (*it == *result.back().first) {
101 ++result.back().second;
103 result.emplace_back(it, 1);
112 template <
class It,
class AEqual>
113 std::vector<std::pair<It, int> > unique_count(It itBegin, It itEnd,
const AEqual& equal)
115 std::vector<std::pair<It, int> > result;
116 if (itBegin == itEnd)
return result;
118 result.emplace_back(it, 1);
120 for (; it != itEnd; ++it) {
121 if (
equal(*it, *result.back().first)) {
122 ++result.back().second;
124 result.emplace_back(it, 1);
134 std::vector<Range<It> > unique_ranges(It itBegin, It itEnd)
136 std::vector<std::pair<It, It> > result;
137 if (itBegin == itEnd)
return result;
139 It it2 = itBegin + 1;
140 result.emplace_back(it1, it2);
141 for (; it2 != itEnd; ++it1, ++it2) {
142 if (not(*it1 == *it2)) {
143 result.emplace_back(it2, it2);
145 ++result.back().second;
153 template <
class It,
class AEqual>
154 std::vector<Range<It> > unique_ranges(It itBegin, It itEnd,
const AEqual& equal)
156 std::vector<Range<It> > result;
157 if (itBegin == itEnd)
return result;
159 It it2 = itBegin + 1;
160 result.emplace_back(it1, it2);
161 for (; it2 != itEnd; ++it1, ++it2) {
162 if (not
equal(*it1, *it2)) {
163 result.emplace_back(it2, it2);
165 ++result.back().second;
173 template <
class It,
class ACategoryFunction>
174 std::vector<Range<It>> adjacent_groupby(It itBegin, It itEnd,
const ACategoryFunction& catFunc)
176 std::vector<Range<It>> result;
177 if (itBegin == itEnd)
return result;
179 It itFirstOfGroup = itBegin;
180 auto catOfGroup = catFunc(*itBegin);
182 for (It it = itBegin; it != itEnd; ++it) {
183 auto cat = catFunc(*it);
184 if (catOfGroup != cat) {
185 result.emplace_back(itFirstOfGroup, it);
190 result.emplace_back(itFirstOfGroup, itEnd);
198 template <
class AInputIterator,
class AOutputIterator,
class ABinaryOperation>
199 AOutputIterator transform_adjacent_pairs(AInputIterator itBegin,
200 AInputIterator itEnd,
201 AOutputIterator result,
202 const ABinaryOperation& map)
204 if (itBegin == itEnd)
return result;
206 AInputIterator second = itBegin;
208 while (second != itEnd) {
209 *result = map(*itBegin, *second);
221 template <
class AInputIterator,
class AOutputIterator,
class ATrinaryOperation>
222 AOutputIterator transform_adjacent_triples(AInputIterator itBegin,
223 AInputIterator itEnd,
224 AOutputIterator result,
225 const ATrinaryOperation& map)
227 if (not(itBegin != itEnd))
return result;
229 AInputIterator second = itBegin;
231 if (not(second != itEnd))
return result;
233 AInputIterator third = second;
235 while (third != itEnd) {
236 *result = map(*itBegin, *second, *third);
249 template <
class Ts,
class TCopyIfPredicate>
250 Ts copy_if(Ts
const& inputContainer, TCopyIfPredicate pred)
255 std::copy_if(inputContainer.begin(), inputContainer.end(), std::back_inserter(outputContainer), pred);
256 return outputContainer;
263 template <
class Ts,
class AUnaryPredicate>
264 bool any(
const Ts& ts,
const AUnaryPredicate& comparator)
266 return std::any_of(std::begin(ts), std::end(ts), comparator);
272 template <
class Ts,
class AItem>
273 bool is_in(
const AItem& item,
const Ts& ts)
275 return std::find(std::begin(ts), std::end(ts), item) != std::end(ts);
281 template <
class T,
class Ts>
282 std::vector<T*> as_pointers(Ts& ts)
286 std::size_t vsize = end(ts) - begin(ts);
287 std::vector<T*> result(vsize,
nullptr);
288 std::transform(begin(ts), end(ts), result.begin(), [](T & t) { return std::addressof<T>(t);});