1 #pragma once
2 
3 #include <tuple>
4 
5 namespace pangolin {
6 
7 template<typename TPred, typename T>
all_of(TPred pred,const T & i)8 bool all_of(TPred pred, const T& i)
9 {
10     return pred(i);
11 }
12 
13 template<typename TPred, typename T, typename... Targs>
all_of(const TPred & pred,const T & i,const Targs &...ins)14 bool all_of(const TPred& pred, const T& i, const Targs& ... ins)
15 {
16     return pred(i) && all_of(pred, ins...);
17 }
18 
19 template<typename TPred, typename T>
any_of(TPred pred,const T & i)20 bool any_of(TPred pred, const T& i)
21 {
22     return pred(i);
23 }
24 
25 template<typename TPred, typename T, typename... Targs>
any_of(const TPred & pred,const T & i,Targs &...ins)26 bool any_of(const TPred& pred, const T& i, Targs& ... ins)
27 {
28     return pred(i) || any_of(pred, ins...);
29 }
30 
31 template<typename TContainer, typename... Targs>
all_found(const TContainer & c,const Targs &...its)32 bool all_found(const TContainer& c, const Targs& ... its)
33 {
34     using T1 = typename std::tuple_element<0, std::tuple<Targs...>>::type;
35     return all_of([&c](const T1& it){return it != c.end();}, its...);
36 }
37 
38 template<typename T, typename... Targs>
all_equal(const T & v1,const Targs &...its)39 bool all_equal(const T& v1, const Targs& ... its)
40 {
41     return all_of([v1](const T& o){return v1 == o;}, its...);
42 }
43 
44 }
45