source: liblaziness/lazy_op.h @ 16

Last change on this file since 16 was 4, checked in by artyom, 13 years ago

liblaziness

File size: 1.0 KB
RevLine 
[4]1#ifndef __LAZY_OP_H__
2#define __LAZY_OP_H__
3#include "lazy.h"
4
5template <typename T>
6class LazyOp
7{
8        public:
9                typedef Delegate1<LazyBase<T>, LazyBase<T>> D1;
10                typedef Delegate2<LazyBase<T>, LazyBase<T>, LazyBase<T>> D2;
11
12                static D1 inc;
13                static D1 sqr;
14
15                static D2 add;
16        private:
17                static D1 mkInc()
18                {
19                        return mkLFun1([] (Lazy<T> x) {
20                                return mkLazy(mkLFun([] (Lazy<T> x) {
21                                        return Ref::mk (*x + 1);
22                                }, x));
23                        });
24                }
25                static D1 mkSqr()
26                {
27                        return mkLFun1([] (Lazy<T> x) {
28                                return mkLazy(mkLFun([] (Lazy<T> x) {
29                                        auto val = *x;
30                                        return Ref::mk (val*val);
31                                }, x));
32                        });
33                }
34
35                static D2 mkAdd()
36                {
37                        return mkLFun2([] (Lazy<T> x, Lazy<T> y) {
38                                return mkLazy(mkLFun([] (Lazy<T> x, Lazy<T> y) {
39                                        return Ref::mk (*x + *y);
40                                }, x, y));
41                        });
42                }
43};
44
45template <typename T> typename LazyOp<T>::D1 LazyOp<T>::inc = LazyOp<T>::mkInc();
46template <typename T> typename LazyOp<T>::D1 LazyOp<T>::sqr = LazyOp<T>::mkSqr();
47template <typename T> typename LazyOp<T>::D2 LazyOp<T>::add = LazyOp<T>::mkAdd();
48
49#endif
Note: See TracBrowser for help on using the repository browser.