|
Elm
2
ELM is a library providing generic data structures, OS-independent interface, plugins and XML.
|
21 #ifndef ELM_DATA_UTIL_H_
22 #define ELM_DATA_UTIL_H_
24 #include <elm/PreIterator.h>
25 #include <elm/data/Range.h>
27 #include <elm/type_info.h>
28 #include <elm/types.h>
37 inline T
operator()(
const T& a,
const T& b)
const {
return a + b; }
41 {
static inline T
zero(
void) {
return 0; } };
43 {
static inline T
zero(
void) {
return T::zero; } };
50 inline T
operator()(
const T& a,
const T& b)
const {
return a * b; }
54 {
static inline T
one(
void) {
return 1; } };
56 {
static inline T
one(
void) {
return T::zero; } };
64 template <
class C,
class P>
65 inline int count(
const C& c,
const P&
p)
66 {
int r = 0;
for(
const auto& i: c)
if(
p(i)) r++;
return r; }
70 template <
class C,
class P>
71 inline bool forall(
const C& c,
const P&
p)
72 {
for(
const auto& i: c)
if(!
p(i))
return false;
return true; }
76 template <
class C,
class P>
77 inline bool exists(
const C& c,
const P&
p)
78 {
for(
const auto& i: c)
if(
p(i))
return true;
return false; }
82 template <
class C,
class P>
83 inline typename C::Iter
find(
const C& c,
const P&
p)
84 {
typename C::Iter i = c.begin();
for(; i != c.end(); i++)
if(
p(*i))
break;
return i; }
88 template <
class C,
class F,
class D>
89 inline void map(
const C& c,
const F& f, D& d)
90 {
for(
const auto& i: c) d.add(f(i)); }
94 template <
class C,
class F>
95 inline void iter(
const C& c,
const F& f)
96 {
for(
const auto& i: c) f(i); }
100 template <
class C,
class F,
class T>
101 inline T
fold(
const C& c,
const F& f, T t)
102 {
for(
const auto& i: c) t = f(i, t);
return t; }
106 template <
class C1,
class C2>
107 inline bool equals(
const C1& c1,
const C2& c2) {
108 auto i2 = c2.begin();
110 if(i2 == c2.end() || i1 != *i2)
115 return i2 == c2.end();
120 template <
class C1,
class C2>
122 auto i1 = c1.begin();
123 auto i2 = c2.begin();
124 while(i1 != c1.end() && i2 != c2.end() && *i1 == *i2) {
131 template <
class C1,
class C2,
class P>
133 auto i1 = c1.begin();
134 auto i2 = c2.begin();
135 while(i1 != c1.end() && i2 != c2.end() &&
p(*i1, *i2)) {
144 inline void deleteAll(
const C& c) {
for(
auto i: c)
delete i; }
149 inline typename C::t
sum(
const C& c)
150 {
return fold(c, [](
const typename C::t& i,
const typename C::t& s) {
return i + s; },
typename C::t(0)); }
153 {
return fold(c, [](
const typename C::t& i,
const typename C::t&
p) {
return i *
p; },
typename C::t(1)); }
159 {
for(
int i = 0; i < n; i++) c.add(v); }
168 inline NumIter(T i, T j, T s = 1): _i(i), _j(j), _s(s) { }
169 inline bool ended()
const {
return _i <= _j; }
170 inline T
item()
const {
return _i; }
171 inline void next() { _i += _s; }
175 inline operator T()
const {
return item(); }
189 inline NumRange(T i, T j, T s = 1): _i(i), _j(j), _s(s) { }
199 template <
class I,
class P>
203 inline bool atEnd()
const {
return _i.atEnd(); }
204 inline const typename I::return_t&
item()
const {
return _i.item(); }
205 inline void next() { _i++; step(); }
208 inline void step() {
while(_i() && !_p(*_i)) _i++; }
212 template <
class I,
class P>
215 template <
class C,
class P>
222 typedef typename I::t
t;
224 inline const I&
begin()
const {
return b; }
225 inline const I&
end()
const {
return e; }
static T zero(void)
Definition: util.h:43
Printable< T, M > p(const T &data, const M &man)
Definition: Output.h:302
Range< SelectIter< typename C::Iter, P > > select(const C &c, const P &p)
Definition: util.h:216
void iter(const C &c, const F &f)
Definition: util.h:95
T y_t
Definition: util.h:36
Iterable< I > subiter(const I &b, const I &e)
Definition: util.h:231
bool equals(const SelectIter< I, P > &i) const
Definition: util.h:206
bool atEnd() const
Definition: util.h:203
NumIter & operator++()
Definition: util.h:177
T fold(const C &c, const F &f, T t)
Definition: util.h:101
Pair< T1, T2 > pair(const T1 &v1, const T2 &v2)
Definition: Pair.h:63
bool equals(const C1 &c1, const C2 &c2)
Definition: util.h:107
C::t product(const C &c)
Definition: util.h:152
T x_t
Definition: util.h:35
static T one(void)
Definition: util.h:56
void deleteAll(const C &c)
Definition: util.h:144
T operator()(const T &a, const T &b) const
Definition: util.h:50
Definition: type_info.h:56
NumIter< T > begin() const
Definition: util.h:190
const I & begin() const
Definition: util.h:224
T operator()(const T &a, const T &b) const
Definition: util.h:37
void map(const C &c, const F &f, D &d)
Definition: util.h:89
bool forall(const C &c, const P &p)
Definition: util.h:71
bool equals(const NumIter< T > &i) const
Definition: util.h:172
NumIter(T i, T j, T s=1)
Definition: util.h:168
C::Iter find(const C &c, const P &p)
Definition: util.h:83
NumIter operator++(int)
Definition: util.h:178
Range< I > range(const I &begin, const I &end)
Definition: Range.h:67
Iterable(const I &begin, const I &end)
Definition: util.h:223
T y_t
Definition: util.h:49
T x_t
Definition: util.h:48
static T one(void)
Definition: util.h:54
void next()
Definition: util.h:205
bool operator==(const NumIter &i) const
Definition: util.h:179
I::t t
Definition: util.h:222
NumIter< T > end() const
Definition: util.h:191
T item() const
Definition: util.h:170
T t
Definition: util.h:166
const I & end() const
Definition: util.h:225
NumRange< T > nrange(T i, T j, T s=1)
Definition: util.h:195
Pair< typename C1::Iter, typename C2::Iter > mismatch(const C1 &c1, const C2 &c2)
Definition: util.h:121
int count(const C &c, const P &p)
Definition: util.h:65
static T zero(void)
Definition: util.h:41
const I::return_t & item() const
Definition: util.h:204
void next()
Definition: util.h:171
bool exists(const C &c, const P &p)
Definition: util.h:77
bool operator!=(const NumIter &i) const
Definition: util.h:180
C::t sum(const C &c)
Definition: util.h:149
bool ended() const
Definition: util.h:169
SelectIter< I, P > select_iter(const I &i, const P &p)
Definition: util.h:213
SelectIter(const I &i, const P &p)
Definition: util.h:202
T t
Definition: util.h:188
void fill(C &c, int n, const typename C::t v=type_info< typename C::t >::null)
Definition: util.h:158
bool operator()(const T &v)
Definition: util.h:60
T operator*() const
Definition: util.h:176
NumRange(T i, T j, T s=1)
Definition: util.h:189