/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock

« back to all changes in this revision

Viewing changes to src/utility/functional

  • Committer: Dan
  • Date: 2011-11-02 22:15:18 UTC
  • Revision ID: dan@waxworlds.org-20111102221518-b5j2m5l2pd71f4t1
Added Test whilst testing

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
2
 
        This file is part of the uClibc++ Library.
3
 
        This library is free software; you can redistribute it and/or
4
 
        modify it under the terms of the GNU Lesser General Public
5
 
        License as published by the Free Software Foundation; either
6
 
        version 2.1 of the License, or (at your option) any later version.
7
 
 
8
 
        This library is distributed in the hope that it will be useful,
9
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11
 
        Lesser General Public License for more details.
12
 
 
13
 
        You should have received a copy of the GNU Lesser General Public
14
 
        License along with this library; if not, write to the Free Software
15
 
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
*/
17
 
 
18
 
 
19
 
#ifndef __STD_HEADER_FUNCTIONAL
20
 
#define __STD_HEADER_FUNCTIONAL 1
21
 
 
22
 
#include <basic_definitions>
23
 
 
24
 
#pragma GCC visibility push(default)
25
 
 
26
 
namespace std{
27
 
 
28
 
        template <class Arg, class Result> struct unary_function;
29
 
        template <class Arg1, class Arg2, class Result> struct binary_function;
30
 
 
31
 
        template <class T> struct plus;
32
 
        template <class T> struct minus;
33
 
        template <class T> struct multiplies;
34
 
        template <class T> struct divides;
35
 
        template <class T> struct modulus;
36
 
        template <class T> struct negate;
37
 
 
38
 
        template <class T> struct equal_to;
39
 
        template <class T> struct not_equal_to;
40
 
        template <class T> struct greater;
41
 
        template <class T> struct less;
42
 
        template <class T> struct greater_equal;
43
 
        template <class T> struct less_equal;
44
 
 
45
 
        template <class T> struct logical_and;
46
 
        template <class T> struct logical_or;
47
 
        template <class T> struct logical_not;
48
 
 
49
 
        template <class Predicate> struct unary_negate;
50
 
        template <class Predicate> unary_negate<Predicate>  not1(const Predicate&);
51
 
        template <class Predicate> struct binary_negate;
52
 
        template <class Predicate> binary_negate<Predicate> not2(const Predicate&);
53
 
 
54
 
 
55
 
        template <class Operation> class binder1st;
56
 
        template <class Operation, class T> binder1st<Operation> bind1st(const Operation&, const T&);
57
 
        template <class Operation> class binder2nd;
58
 
        template <class Operation, class T> binder2nd<Operation> bind2nd(const Operation&, const T&);
59
 
 
60
 
        template <class Arg, class Result> class pointer_to_unary_function;
61
 
        template <class Arg, class Result> pointer_to_unary_function<Arg,Result> ptr_fun(Result (*)(Arg));
62
 
        template <class Arg1, class Arg2, class Result> class pointer_to_binary_function;
63
 
        template <class Arg1, class Arg2, class Result> 
64
 
                pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*)(Arg1,Arg2));
65
 
 
66
 
        template<class S, class T> class mem_fun_t;
67
 
        template<class S, class T, class A> class mem_fun1_t;
68
 
        template<class S, class T> class const_mem_fun_t;
69
 
        template<class S, class T, class A> class const_mem_fun1_t;
70
 
        template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)());
71
 
        template<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A));
72
 
        template<class S, class T> class mem_fun_ref_t;
73
 
        template<class S, class T, class A> class mem_fun1_ref_t;
74
 
        template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)());
75
 
        template<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A));
76
 
 
77
 
        //Implementation
78
 
 
79
 
        template <class Arg, class Result> struct _UCXXEXPORT unary_function{
80
 
                typedef Arg argument_type;
81
 
                typedef Result result_type;
82
 
        };
83
 
 
84
 
 
85
 
        template <class Arg1, class Arg2, class Result> struct _UCXXEXPORT binary_function{
86
 
                typedef Arg1   first_argument_type;
87
 
                typedef Arg2   second_argument_type;
88
 
                typedef Result result_type;
89
 
        };
90
 
 
91
 
        template <class T> struct _UCXXEXPORT plus : binary_function<T,T,T>{
92
 
                T operator()(const T& x, const T& y) const{
93
 
                        return x + y;
94
 
                }
95
 
        };
96
 
 
97
 
        template <class T> struct _UCXXEXPORT minus : binary_function<T,T,T>{
98
 
                T operator()(const T& x, const T& y) const{
99
 
                        return x - y;
100
 
                }
101
 
        };
102
 
 
103
 
        template <class T> struct _UCXXEXPORT multiplies : binary_function<T,T,T>{
104
 
                T operator()(const T& x, const T& y) const{
105
 
                        return x * y;
106
 
                }
107
 
        };
108
 
 
109
 
        template <class T> struct _UCXXEXPORT divides : binary_function<T,T,T>{
110
 
                T operator()(const T& x, const T& y) const{
111
 
                        return x / y;
112
 
                }
113
 
        };
114
 
 
115
 
        template <class T> struct _UCXXEXPORT modulus : binary_function<T,T,T>{
116
 
                T operator()(const T& x, const T& y) const{
117
 
                        return x % y;
118
 
                }
119
 
        };
120
 
 
121
 
        template <class T> struct _UCXXEXPORT negate : unary_function<T,T>{
122
 
                T operator()(const T& x) const{
123
 
                        return -x;
124
 
                }
125
 
        };
126
 
 
127
 
        template <class T> struct _UCXXEXPORT equal_to : binary_function<T,T,bool>{
128
 
                bool operator()(const T& x, const T& y) const{
129
 
                        return (x == y);
130
 
                }
131
 
        };
132
 
 
133
 
        template <class T> struct _UCXXEXPORT not_equal_to : binary_function<T,T,bool>{
134
 
                bool operator()(const T& x, const T& y) const{
135
 
                        return (x != y);
136
 
                }
137
 
        };
138
 
 
139
 
        template <class T> struct _UCXXEXPORT greater : binary_function<T,T,bool>{
140
 
                bool operator()(const T& x, const T& y) const{
141
 
                        return (x > y);
142
 
                }
143
 
        };
144
 
 
145
 
        template <class T> struct _UCXXEXPORT less : binary_function<T,T,bool>{
146
 
                bool operator()(const T& x, const T& y) const{
147
 
                        return (x < y);
148
 
                }
149
 
        };
150
 
 
151
 
        template <class T> struct _UCXXEXPORT greater_equal : binary_function<T,T,bool>{
152
 
                bool operator()(const T& x, const T& y) const{
153
 
                        return (x >= y);
154
 
                }
155
 
        };
156
 
 
157
 
        template <class T> struct _UCXXEXPORT less_equal : binary_function<T,T,bool>{
158
 
                bool operator()(const T& x, const T& y) const{
159
 
                        return (x <= y);
160
 
                }
161
 
        };
162
 
 
163
 
        template <class T> struct _UCXXEXPORT logical_and : binary_function<T,T,bool> {
164
 
                bool operator()(const T& x, const T& y) const{
165
 
                        return (x && y);
166
 
                }
167
 
        };
168
 
        
169
 
        template <class T> struct _UCXXEXPORT logical_or : binary_function<T,T,bool> {
170
 
                bool operator()(const T& x, const T& y) const{
171
 
                        return (x || y);
172
 
                }
173
 
        };
174
 
 
175
 
        template <class T> struct _UCXXEXPORT logical_not : unary_function<T,bool> {
176
 
                bool operator()(const T& x) const{
177
 
                        return !x;
178
 
                }
179
 
        };
180
 
 
181
 
        template <class Predicate> class _UCXXEXPORT unary_negate
182
 
                : public unary_function<typename Predicate::argument_type,bool>
183
 
        {
184
 
        public:
185
 
                explicit unary_negate(const Predicate& pred) : p(pred) {  }
186
 
                bool operator()(const typename Predicate::argument_type& x) const{
187
 
                        return !p(x);
188
 
                }
189
 
        private:
190
 
                Predicate p;
191
 
        };
192
 
 
193
 
 
194
 
        template <class Predicate> _UCXXEXPORT unary_negate<Predicate> not1(const Predicate& pred){
195
 
                return unary_negate<Predicate>(pred);
196
 
        }
197
 
 
198
 
 
199
 
        template <class Predicate> class _UCXXEXPORT binary_negate : public
200
 
                binary_function<typename Predicate::first_argument_type,
201
 
                        typename Predicate::second_argument_type, bool>
202
 
        {
203
 
        public:
204
 
                explicit binary_negate(const Predicate& pred) : p(pred) {  }
205
 
                bool operator()(const typename Predicate::first_argument_type& x,
206
 
                        const typename Predicate::second_argument_type& y) const
207
 
                {
208
 
                        return !p(x, y);
209
 
                }
210
 
        private:
211
 
                Predicate p;
212
 
        };
213
 
 
214
 
 
215
 
        template <class Predicate> _UCXXEXPORT binary_negate<Predicate> not2(const Predicate& pred){
216
 
                return binary_negate<Predicate>(pred);
217
 
        }
218
 
 
219
 
 
220
 
        template <class Operation> class _UCXXEXPORT binder1st
221
 
                : public unary_function<typename Operation::second_argument_type, 
222
 
                        typename Operation::result_type>
223
 
        {
224
 
        protected:
225
 
                Operation                      op;
226
 
                typename Operation::first_argument_type value;
227
 
        public:
228
 
                binder1st(const Operation& x, const typename Operation::first_argument_type& y) : op(x), value(y){  }
229
 
                typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const{
230
 
                        return op(value,x);
231
 
                }
232
 
        };
233
 
 
234
 
        
235
 
        template <class Operation, class T> _UCXXEXPORT binder1st<Operation> bind1st(const Operation& op, const T& x){
236
 
                return binder1st<Operation>(op, typename Operation::first_argument_type(x));
237
 
        }
238
 
 
239
 
 
240
 
        template <class Operation> class _UCXXEXPORT binder2nd
241
 
                : public unary_function<typename Operation::first_argument_type,
242
 
                        typename Operation::result_type>
243
 
        {
244
 
        protected:
245
 
                Operation                       op;
246
 
                typename Operation::second_argument_type value;
247
 
        public:
248
 
                binder2nd(const Operation& x, const typename Operation::second_argument_type& y) : op(x), value(y) {  }
249
 
                typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const{
250
 
                        return op(x,value);
251
 
                }
252
 
        };
253
 
 
254
 
        
255
 
        template <class Operation, class T> _UCXXEXPORT 
256
 
                binder2nd<Operation> bind2nd(const Operation& op, const T& x)
257
 
        {
258
 
                return binder2nd<Operation>(op, typename Operation::second_argument_type(x));
259
 
        }
260
 
        
261
 
 
262
 
        template <class Arg, class Result> class _UCXXEXPORT 
263
 
                pointer_to_unary_function : public unary_function<Arg, Result>
264
 
        {
265
 
        protected:
266
 
                Result (*func)(Arg);
267
 
        public:
268
 
                explicit pointer_to_unary_function(Result (*f)(Arg)) : func(f) {  }
269
 
                Result operator()(Arg x) const{
270
 
                        return func(x);
271
 
                }
272
 
        };
273
 
 
274
 
        
275
 
        template <class Arg, class Result> _UCXXEXPORT pointer_to_unary_function<Arg, Result> ptr_fun(Result (*f)(Arg)){
276
 
                return pointer_to_unary_function<Arg, Result>(f);
277
 
        }
278
 
 
279
 
        
280
 
        template <class Arg1, class Arg2, class Result> class _UCXXEXPORT 
281
 
                pointer_to_binary_function : public binary_function<Arg1,Arg2,Result>
282
 
        {
283
 
        protected:
284
 
                Result (*func)(Arg1, Arg2);
285
 
        public:
286
 
                explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2)) : func(f) {  }
287
 
                Result operator()(Arg1 x, Arg2 y) const{
288
 
                        return func(x, y);
289
 
                }
290
 
        };
291
 
 
292
 
        template <class Arg1, class Arg2, class Result> _UCXXEXPORT 
293
 
                pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
294
 
        {
295
 
                return pointer_to_binary_function<Arg1,Arg2,Result>(f);
296
 
        }
297
 
 
298
 
        
299
 
        template <class S, class T> class _UCXXEXPORT mem_fun_t
300
 
                : public unary_function<T*, S>
301
 
        {
302
 
        public:
303
 
                explicit mem_fun_t(S (T::*p)()) : m(p) {  }
304
 
                S operator()(T* p) const { return (p->*m)(); }
305
 
        private:
306
 
                S (T::*m)();
307
 
        };
308
 
 
309
 
 
310
 
        template <class S, class T, class A> class _UCXXEXPORT mem_fun1_t
311
 
                : public binary_function<T*, A, S>
312
 
        {
313
 
        public:
314
 
                explicit mem_fun1_t(S (T::*p)(A)) : m(p) {  }
315
 
                S operator()(T* p, A x) const { return (p->*m)(x); }
316
 
        private:
317
 
                S (T::*m)(A);
318
 
        };
319
 
 
320
 
 
321
 
        template <class S, class T> class _UCXXEXPORT const_mem_fun_t
322
 
                : public unary_function<const T*, S>
323
 
        {
324
 
        public:
325
 
                explicit const_mem_fun_t(S (T::*p)() const) : m(p) {  }
326
 
                S operator()(const T* p) const { return (p->*m)(); }
327
 
        private:
328
 
                S (T::*m)() const;
329
 
        };
330
 
 
331
 
 
332
 
        template <class S, class T, class A> class _UCXXEXPORT const_mem_fun1_t
333
 
                : public binary_function<T*, A, S>
334
 
        {
335
 
        public:
336
 
                explicit const_mem_fun1_t(S (T::*p)(A) const) : m(p) {  }
337
 
                S operator()(const T* p, A x) const { return (p->*m)(x); }
338
 
        private:
339
 
                S (T::*m)(A) const;
340
 
        };
341
 
 
342
 
 
343
 
        template<class S, class T> _UCXXEXPORT mem_fun_t<S,T> mem_fun(S (T::*f)()){
344
 
                return mem_fun_t<S, T>(f);
345
 
        }
346
 
 
347
 
        template<class S, class T> _UCXXEXPORT const_mem_fun_t<S,T> mem_fun(S (T::*f)() const){
348
 
                return const_mem_fun_t<S, T>(f);
349
 
        }
350
 
 
351
 
        template<class S, class T, class A> _UCXXEXPORT mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A)){
352
 
                return mem_fun1_t<S, T, A>(f);
353
 
        }
354
 
 
355
 
        template<class S, class T, class A> _UCXXEXPORT const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const){
356
 
                return const_mem_fun1_t<S, T, A>(f);
357
 
        }
358
 
 
359
 
        template <class S, class T> class _UCXXEXPORT mem_fun_ref_t
360
 
                : public unary_function<T, S>
361
 
        {
362
 
        public:
363
 
                explicit mem_fun_ref_t(S (T::*p)()) : mf(p) {  }
364
 
                S operator()(T& p) { return (p.*mf)(); } 
365
 
        private:
366
 
                S (T::*mf)();
367
 
        };
368
 
        
369
 
        template <class S, class T, class A> class _UCXXEXPORT mem_fun1_ref_t
370
 
                : public binary_function<T, A, S>
371
 
        {
372
 
        public:
373
 
                explicit mem_fun1_ref_t(S (T::*p)(A)) : mf(p) {  }
374
 
                S operator()(T& p, A x) { return (p.*mf)(x); }
375
 
        private:
376
 
                S (T::*mf)(A);
377
 
        };
378
 
 
379
 
        template<class S, class T> _UCXXEXPORT mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()){
380
 
                return mem_fun_ref_t<S,T>(f);
381
 
        }
382
 
 
383
 
        template<class S, class T, class A> _UCXXEXPORT mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A)){
384
 
                return mem_fun1_ref_t<S,T,A>(f);
385
 
        }
386
 
 
387
 
 
388
 
}
389
 
 
390
 
 
391
 
//These are SGI extensions which are checked for by some conformance checks.  They
392
 
// are *NOT* part of the C++ standard, however
393
 
 
394
 
template <class Op1, class Op2> class _UCXXEXPORT unary_compose :
395
 
        public std::unary_function<typename Op2::argument_type,
396
 
                typename Op1::result_type>
397
 
{
398
 
protected:
399
 
        Op1 mf1;
400
 
        Op2 mf2;
401
 
public:
402
 
        unary_compose(const Op1& x, const Op2& y) : mf1(x), mf2(y) {  }
403
 
        typename Op1::result_type operator()(const typename Op2::argument_type& x) const {
404
 
                return mf1(mf2(x));
405
 
        }
406
 
};
407
 
 
408
 
template <class Op1, class Op2> _UCXXEXPORT 
409
 
inline unary_compose<Op1, Op2>
410
 
compose1(const Op1& fn1, const Op2& fn2){
411
 
        return unary_compose<Op1, Op2>(fn1, fn2);
412
 
}
413
 
 
414
 
template <class Op1, class Op2, class Op3> class _UCXXEXPORT binary_compose : 
415
 
        public std::unary_function<typename Op2::argument_type, typename Op1::result_type>
416
 
{
417
 
protected:
418
 
        Op1 mf1;
419
 
        Op2 mf2;
420
 
        Op3 mf3;
421
 
public:
422
 
        binary_compose(const Op1 & x, const Op2 & y, const Op3 & z)
423
 
                : mf1(x), mf2(y), mf3(z){  }
424
 
        typename Op1::result_type operator()(const typename Op2::argument_type & x) const {
425
 
                return mf1(mf2(x), mf3(x));
426
 
        }
427
 
};
428
 
 
429
 
template <class Op1, class Op2, class Op3> inline _UCXXEXPORT binary_compose<Op1, Op2, Op3>
430
 
compose2(const Op1 & fn1, const Op2 & fn2, const Op3 & fn3){
431
 
        return binary_compose<Op1, Op2, Op3>(fn1, fn2, fn3);
432
 
}
433
 
 
434
 
#pragma GCC visibility pop
435
 
 
436
 
#endif
437
 
 
438
 
 
439