-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxpr.cpp
More file actions
95 lines (80 loc) · 1.93 KB
/
Copy pathxpr.cpp
File metadata and controls
95 lines (80 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <vector>
#include <iterator>
namespace xpr
{
struct A
{
int value;
A(int val):value(val){std::cout << " Default constructor " << value << std::endl;}
int eval() const { return value; }
template<class Expr>
A(Expr expr):value(expr.eval()){}
};
template<class X, class Y> struct Add
{
const X& x;
const Y& y;
Add(const X& x_, const Y& y_):x(x_),y(y_){}
auto eval() const -> decltype (x.eval() + y.eval()) { return x.eval() + y.eval(); }
};
template<class X, class Y> Add<X,Y> operator+(const X& a, const Y& b)
{
return Add<X,Y>(a,b);
}
int test_expr()
{
A b(1),c(10),d(100),e(1000);
std::cout << "\n Evalutation " << std::endl;
A a = b + c + d + e;
std::cout << " result : " << (b + c + d + e).eval() << std::endl;
std::cout << " result : " << a.value << std::endl;
}
}
namespace vect
{
typedef std::vector<int> Vector;
template<class A, class B> struct Add
{
const A& a;
const B& b;
Add(const A& a_, const B& b_):a(a_),b(b_){}
size_t size() const { return a.size(); }
};
int eval(const Vector& a, size_t i)
{
return a[i];
}
template<class A, class B> int eval(const Add<A,B>& expr, size_t i)
{
return eval(expr.a,i) + eval(expr.b,i);
}
template<class A, class B> Add<A,B> operator+(const A& a, const B& b)
{
return Add<A,B>(a,b);
}
template<class Expr>
void assign(Vector& a, const Expr& expr)
{
a.resize(expr.size());
for(size_t i = 0 ; i < expr.size() ; ++i)
a[i] = eval(expr,i);
}
std::ostream& operator<<(std::ostream& o, const Vector& a)
{
std::copy(a.begin(),a.end(),std::ostream_iterator<Vector::value_type>(o," "));
return o;
}
void test_vect()
{
size_t n = 10;
Vector a(n,0),b(n,1),c(n,10),d(n,100),e(n,1000);
assign(a,b + c + d + e);
std::cout << a << std::endl;
}
}
int main()
{
xpr::test_expr();
vect::test_vect();
}