plll  1.0
arithmetic-gmp-rops.hpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2011-2014 University of Zurich
3 
4  Permission is hereby granted, free of charge, to any person obtaining a copy
5  of this software and associated documentation files (the "Software"), to deal
6  in the Software without restriction, including without limitation the rights
7  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  copies of the Software, and to permit persons to whom the Software is
9  furnished to do so, subject to the following conditions:
10 
11  The above copyright notice and this permission notice shall be included in
12  all copies or substantial portions of the Software.
13 
14  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  THE SOFTWARE.
21 */
22 
23 #ifndef PLLL_INCLUDE_GUARD__ARITHMETIC_GMP_REAL_OPS_HPP
24 #define PLLL_INCLUDE_GUARD__ARITHMETIC_GMP_REAL_OPS_HPP
25 
33 namespace plll
34 {
35  namespace arithmetic
36  {
37  namespace expressions
38  {
39  // Adding real and (un)signed long, double or Integer
40  template<class D>
41  void do_assign(arithmetic::Real & x,
42  const AddOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > > &,
43  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > & data)
44  {
45  add_ui(x, data.first.evaluate(), data.second.data().evaluate());
46  }
47 
48  template<class D>
49  void do_assign(arithmetic::Real & x,
50  const AddOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > > &,
51  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > & data)
52  {
53  add_si(x, data.first.evaluate(), data.second.data().evaluate());
54  }
55 
56  template<class D>
57  void do_assign(arithmetic::Real & x,
58  const AddOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > > &,
59  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > & data)
60  {
61  add_d(x, data.first.evaluate(), data.second.data().evaluate());
62  }
63 
64  template<class D1, class D2, template<typename, typename> class O2, class E>
65  void do_assign(arithmetic::Real & x,
66  const AddOp<RealContext, std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > > &,
67  const std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > & data)
68  {
69  add_z(x, data.first.evaluate(), data.second.data().evaluate());
70  }
71 
72  template<class D>
73  void do_assign(arithmetic::Real & x,
74  const AddOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> > &,
75  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> & data)
76  {
77  add_ui(x, data.second.evaluate(), data.first.data().evaluate());
78  }
79 
80  template<class D>
81  void do_assign(arithmetic::Real & x,
82  const AddOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> > &,
83  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> & data)
84  {
85  add_si(x, data.second.evaluate(), data.first.data().evaluate());
86  }
87 
88  template<class D>
89  void do_assign(arithmetic::Real & x,
90  const AddOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> > &,
91  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> & data)
92  {
93  add_d(x, data.second.evaluate(), data.first.data().evaluate());
94  }
95 
96  template<class D1, class D2, template<typename, typename> class O2, class E>
97  void do_assign(arithmetic::Real & x,
98  const AddOp<RealContext, std::pair<Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context>, D1> > &,
99  const std::pair<Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context>, D1> & data)
100  {
101  add_z(x, data.second.evaluate(), data.first.data().evaluate());
102  }
103 
104  // Subtracting real and (un)signed long, double or Integer
105  template<class D>
106  void do_assign(arithmetic::Real & x,
107  const SubOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > > &,
108  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > & data)
109  {
110  sub_ui(x, data.first.evaluate(), data.second.data().evaluate());
111  }
112 
113  template<class D>
114  void do_assign(arithmetic::Real & x,
115  const SubOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > > &,
116  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > & data)
117  {
118  sub_si(x, data.first.evaluate(), data.second.data().evaluate());
119  }
120 
121  template<class D>
122  void do_assign(arithmetic::Real & x,
123  const SubOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > > &,
124  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > & data)
125  {
126  sub_d(x, data.first.evaluate(), data.second.data().evaluate());
127  }
128 
129  template<class D1, class D2, template<typename, typename> class O2, class E>
130  void do_assign(arithmetic::Real & x,
131  const SubOp<RealContext, std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > > &,
132  const std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > & data)
133  {
134  sub_z(x, data.first.evaluate(), data.second.data().evaluate());
135  }
136 
137  template<class D>
138  void do_assign(arithmetic::Real & x,
139  const SubOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> > &,
140  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> & data)
141  {
142  ui_sub(x, data.first.data().evaluate(), data.second.evaluate());
143  }
144 
145  template<class D>
146  void do_assign(arithmetic::Real & x,
147  const SubOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> > &,
148  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> & data)
149  {
150  si_sub(x, data.first.data().evaluate(), data.second.evaluate());
151  }
152 
153  template<class D>
154  void do_assign(arithmetic::Real & x,
155  const SubOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> > &,
156  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> & data)
157  {
158  d_sub(x, data.first.data().evaluate(), data.second.evaluate());
159  }
160 
161  template<class D1, class D2, template<typename, typename> class O2, class E>
162  void do_assign(arithmetic::Real & x,
163  const SubOp<RealContext, std::pair<Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context>, D1> > &,
164  const std::pair<Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context>, D1> & data)
165  {
166  z_sub(x, data.first.data().evaluate(), data.second.evaluate());
167  }
168 
169  // Multiplyign real and (un)signed long, double or Integer
170  template<class D>
171  void do_assign(arithmetic::Real & x,
172  const MulOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > > &,
173  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > & data)
174  {
175  mul_ui(x, data.first.evaluate(), data.second.data().evaluate());
176  }
177 
178  template<class D>
179  void do_assign(arithmetic::Real & x,
180  const MulOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > > &,
181  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > & data)
182  {
183  mul_si(x, data.first.evaluate(), data.second.data().evaluate());
184  }
185 
186  template<class D>
187  void do_assign(arithmetic::Real & x,
188  const MulOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > > &,
189  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > & data)
190  {
191  mul_d(x, data.first.evaluate(), data.second.data().evaluate());
192  }
193 
194  template<class D1, class D2, template<typename, typename> class O2, class E>
195  void do_assign(arithmetic::Real & x,
196  const MulOp<RealContext, std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > > &,
197  const std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > & data)
198  {
199  mul_z(x, data.first.evaluate(), data.second.data().evaluate());
200  }
201 
202  template<class D>
203  void do_assign(arithmetic::Real & x,
204  const MulOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> > &,
205  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> & data)
206  {
207  mul_ui(x, data.second.evaluate(), data.first.data().evaluate());
208  }
209 
210  template<class D>
211  void do_assign(arithmetic::Real & x,
212  const MulOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> > &,
213  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> & data)
214  {
215  mul_si(x, data.second.evaluate(), data.first.data().evaluate());
216  }
217 
218  template<class D>
219  void do_assign(arithmetic::Real & x,
220  const MulOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> > &,
221  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> & data)
222  {
223  mul_d(x, data.second.evaluate(), data.first.data().evaluate());
224  }
225 
226  template<class D1, class D2, template<typename, typename> class O2, class E>
227  void do_assign(arithmetic::Real & x,
228  const MulOp<RealContext, std::pair<Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context>, D1> > &,
229  const std::pair<Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context>, D1> & data)
230  {
231  mul_z(x, data.second.evaluate(), data.first.data().evaluate());
232  }
233 
234  // Dividing real and (un)signed long, double or Integer
235  template<class D>
236  void do_assign(arithmetic::Real & x,
237  const DivOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > > &,
238  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> > & data)
239  {
240  div_ui(x, data.first.evaluate(), data.second.data().evaluate());
241  }
242 
243  template<class D>
244  void do_assign(arithmetic::Real & x,
245  const DivOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > > &,
246  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> > & data)
247  {
248  div_si(x, data.first.evaluate(), data.second.data().evaluate());
249  }
250 
251  template<class D>
252  void do_assign(arithmetic::Real & x,
253  const DivOp<RealContext, std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > > &,
254  const std::pair<D, expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> > & data)
255  {
256  div_d(x, data.first.evaluate(), data.second.data().evaluate());
257  }
258 
259  template<class D1, class D2, template<typename, typename> class O2, class E>
260  void do_assign(arithmetic::Real & x,
261  const DivOp<RealContext, std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > > &,
262  const std::pair<D1, Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> > & data)
263  {
264  div_z(x, data.first.evaluate(), data.second.data().evaluate());
265  }
266 
267  template<class D>
268  void do_assign(arithmetic::Real & x,
269  const DivOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> > &,
270  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context>, D> & data)
271  {
272  ui_div(x, data.first.data().evaluate(), data.second.evaluate());
273  }
274 
275  template<class D>
276  void do_assign(arithmetic::Real & x,
277  const DivOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> > &,
278  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context>, D> & data)
279  {
280  si_div(x, data.first.data().evaluate(), data.second.evaluate());
281  }
282 
283  template<class D>
284  void do_assign(arithmetic::Real & x,
285  const DivOp<RealContext, std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> > &,
286  const std::pair<expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context>, D> & data)
287  {
288  d_div(x, data.first.data().evaluate(), data.second.evaluate());
289  }
290 
291  /*
292  Disabled, since these interfere with other definitions from above, for example in the
293  case: a = convert() + c * d
294 
295  // Special add/subtract and multiplication mixes
296  template<class D1, class D2, template<typename, typename> class O2, class E>
297  void do_assign(arithmetic::Real & x,
298  const AddOp<RealContext, std::pair<D1, Expression<RealContext, D2, MulOp> > > &,
299  const std::pair<D1, Expression<RealContext, D2, MulOp> > & data)
300  {
301  addmul4(x, data.second.data().first.evaluate(), data.second.data().second.evaluate(), data.first.evaluate());
302  }
303 
304  template<class D1, class D2, template<typename, typename> class O2, class E>
305  void do_assign(arithmetic::Real & x,
306  const AddOp<RealContext, std::pair<Expression<RealContext, D2, MulOp>, D1> > &,
307  const std::pair<Expression<RealContext, D2, MulOp>, D1> & data)
308  {
309  addmul4(x, data.first.data().first.evaluate(), data.first.data().second.evaluate(), data.second.evaluate());
310  }
311 
312  template<class D1, class D2, template<typename, typename> class O2, class E>
313  void do_assign(arithmetic::Real & x,
314  const SubOp<RealContext, std::pair<D1, Expression<RealContext, D2, MulOp> > > &,
315  const std::pair<D1, Expression<RealContext, D2, MulOp> > & data)
316  {
317  submul4(x, data.second.data().first.evaluate(), data.second.data().second.evaluate(), data.first.evaluate());
318  neg(x, x);
319  }
320 
321  template<class D1, class D2, template<typename, typename> class O2, class E>
322  void do_assign(arithmetic::Real & x,
323  const SubOp<RealContext, std::pair<Expression<RealContext, D2, MulOp>, D1> > &,
324  const std::pair<Expression<RealContext, D2, MulOp>, D1> & data)
325  {
326  submul4(x, data.first.data().first.evaluate(), data.first.data().second.evaluate(), data.second.evaluate());
327  }
328  */
329  }
330 
341  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
352  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
353  expressions::Wrapper<RealContext> >,
354  expressions::AddOp> operator + (const Real & a, const Real & b)
357  expressions::AddOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
358  expressions::Wrapper<RealContext>(b))); }
366  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
367  expressions::Wrapper<RealContext> >,
368  expressions::SubOp> operator - (const Real & a, const Real & b)
371  expressions::SubOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
372  expressions::Wrapper<RealContext>(b))); }
380  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
381  expressions::Wrapper<RealContext> >,
382  expressions::MulOp> operator * (const Real & a, const Real & b)
385  expressions::MulOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
386  expressions::Wrapper<RealContext>(b))); }
394  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
395  expressions::Wrapper<RealContext> >,
396  expressions::DivOp> operator / (const Real & a, const Real & b)
399  expressions::DivOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
400  expressions::Wrapper<RealContext>(b))); }
408  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
409  expressions::Wrapper<RealContext> >,
410  expressions::ModOp> operator % (const Real & a, const Real & b)
413  expressions::ModOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
414  expressions::Wrapper<RealContext>(b))); }
424  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
425  expressions::Wrapper<RealContext> >,
426  expressions::ShLOp> operator << (const Real & a, const Real & b)
429  expressions::ShLOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
430  expressions::Wrapper<RealContext>(b))); }
441  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
442  expressions::Wrapper<RealContext> >,
443  expressions::ShROp> operator >> (const Real & a, const Real & b)
446  expressions::ShROp>(std::make_pair(expressions::Wrapper<RealContext>(a),
447  expressions::Wrapper<RealContext>(b))); }
456  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
457  expressions::ShiftCOp> operator << (const Real & a, signed long b)
468  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
469  expressions::ShiftCOp> operator >> (const Real & a, signed long b)
473 
474  // second operand is a expression
475  template<class A2, template<typename, typename> class O2>
476  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
477  expressions::Expression<RealContext, A2, O2> >,
478  expressions::AddOp> operator + (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
479  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
480  expressions::Expression<RealContext, A2, O2> >,
481  expressions::AddOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
482  template<class A2, template<typename, typename> class O2>
483  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
484  expressions::Expression<RealContext, A2, O2> >,
485  expressions::SubOp> operator - (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
486  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
487  expressions::Expression<RealContext, A2, O2> >,
488  expressions::SubOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
489  template<class A2, template<typename, typename> class O2>
490  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
491  expressions::Expression<RealContext, A2, O2> >,
492  expressions::MulOp> operator * (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
493  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
494  expressions::Expression<RealContext, A2, O2> >,
495  expressions::MulOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
496  template<class A2, template<typename, typename> class O2>
497  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
498  expressions::Expression<RealContext, A2, O2> >,
499  expressions::DivOp> operator / (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
500  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
501  expressions::Expression<RealContext, A2, O2> >,
502  expressions::DivOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
503  template<class A2, template<typename, typename> class O2>
504  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
505  expressions::Expression<RealContext, A2, O2> >,
506  expressions::ModOp> operator % (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
507  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
508  expressions::Expression<RealContext, A2, O2> >,
509  expressions::ModOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
510  template<class A2, template<typename, typename> class O2>
511  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
512  expressions::Expression<RealContext, A2, O2> >,
513  expressions::ShLOp> operator << (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
514  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
515  expressions::Expression<RealContext, A2, O2> >,
516  expressions::ShLOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
517  template<class A2, template<typename, typename> class O2>
518  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
519  expressions::Expression<RealContext, A2, O2> >,
520  expressions::ShROp> operator >> (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
521  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
522  expressions::Expression<RealContext, A2, O2> >,
523  expressions::ShROp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
524 
525  namespace expressions
526  {
527  // first operand is a expression
528  template<class A1, template<typename, typename> class O1>
529  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A1, O1>,
530  expressions::NegOp> operator - (const expressions::Expression<RealContext, A1, O1> & a)
531  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A1, O1>,
532  expressions::NegOp>(a); }
533  template<class A1, template<typename, typename> class O1>
534  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
535  expressions::Wrapper<RealContext> >,
536  expressions::AddOp> operator + (const expressions::Expression<RealContext, A1, O1> & a,
537  const arithmetic::Real & b)
538  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
539  expressions::Wrapper<RealContext> >,
540  expressions::AddOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
541  template<class A1, template<typename, typename> class O1>
542  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
543  expressions::Wrapper<RealContext> >,
544  expressions::SubOp> operator - (const expressions::Expression<RealContext, A1, O1> & a,
545  const arithmetic::Real & b)
546  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
547  expressions::Wrapper<RealContext> >,
548  expressions::SubOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
549  template<class A1, template<typename, typename> class O1>
550  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
551  expressions::Wrapper<RealContext> >,
552  expressions::MulOp> operator * (const expressions::Expression<RealContext, A1, O1> & a,
553  const arithmetic::Real & b)
554  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
555  expressions::Wrapper<RealContext> >,
556  expressions::MulOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
557  template<class A1, template<typename, typename> class O1>
558  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
559  expressions::Wrapper<RealContext> >,
560  expressions::DivOp> operator / (const expressions::Expression<RealContext, A1, O1> & a,
561  const arithmetic::Real & b)
562  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
563  expressions::Wrapper<RealContext> >,
564  expressions::DivOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
565  template<class A1, template<typename, typename> class O1>
566  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
567  expressions::Wrapper<RealContext> >,
568  expressions::ModOp> operator % (const expressions::Expression<RealContext, A1, O1> & a,
569  const arithmetic::Real & b)
570  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
571  expressions::Wrapper<RealContext> >,
572  expressions::ModOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
573  template<class A1, template<typename, typename> class O1>
574  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
575  expressions::Wrapper<RealContext> >,
576  expressions::ShLOp> operator << (const expressions::Expression<RealContext, A1, O1> & a,
577  const arithmetic::Real & b)
578  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
579  expressions::Wrapper<RealContext> >,
580  expressions::ShLOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
581  template<class A1, template<typename, typename> class O1>
582  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
583  expressions::Wrapper<RealContext> >,
584  expressions::ShROp> operator >> (const expressions::Expression<RealContext, A1, O1> & a,
585  const arithmetic::Real & b)
586  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
587  expressions::Wrapper<RealContext> >,
588  expressions::ShROp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
589  template<class A1, template<typename, typename> class O1>
590  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A1, O1>,
591  expressions::ShiftCOp> operator << (const expressions::Expression<RealContext, A1, O1> & a,
592  signed long b)
593  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A1, O1>,
594  expressions::ShiftCOp>(a, b); }
595  template<class A1, template<typename, typename> class O1>
596  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A1, O1>,
597  expressions::ShiftCOp> operator >> (const expressions::Expression<RealContext, A1, O1> & a,
598  signed long b)
599  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A1, O1>,
600  expressions::ShiftCOp>(a, -b); }
601 
602  // both operands are expressions
603  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
604  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
605  expressions::Expression<RealContext, A2, O2> >,
606  expressions::AddOp> operator + (const expressions::Expression<RealContext, A1, O1> & a,
607  const expressions::Expression<RealContext, A2, O2> & b)
608  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
609  expressions::Expression<RealContext, A2, O2> >,
610  expressions::AddOp>(std::make_pair(a, b)); }
611  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
612  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
613  expressions::Expression<RealContext, A2, O2> >,
614  expressions::SubOp> operator - (const expressions::Expression<RealContext, A1, O1> & a,
615  const expressions::Expression<RealContext, A2, O2> & b)
616  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
617  expressions::Expression<RealContext, A2, O2> >,
618  expressions::SubOp>(std::make_pair(a, b)); }
619  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
620  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
621  expressions::Expression<RealContext, A2, O2> >,
622  expressions::MulOp> operator * (const expressions::Expression<RealContext, A1, O1> & a,
623  const expressions::Expression<RealContext, A2, O2> & b)
624  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
625  expressions::Expression<RealContext, A2, O2> >,
626  expressions::MulOp>(std::make_pair(a, b)); }
627  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
628  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
629  expressions::Expression<RealContext, A2, O2> >,
630  expressions::DivOp> operator / (const expressions::Expression<RealContext, A1, O1> & a,
631  const expressions::Expression<RealContext, A2, O2> & b)
632  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
633  expressions::Expression<RealContext, A2, O2> >,
634  expressions::DivOp>(std::make_pair(a, b)); }
635  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
636  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
637  expressions::Expression<RealContext, A2, O2> >,
638  expressions::ModOp> operator % (const expressions::Expression<RealContext, A1, O1> & a,
639  const expressions::Expression<RealContext, A2, O2> & b)
640  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
641  expressions::Expression<RealContext, A2, O2> >,
642  expressions::ModOp>(std::make_pair(a, b)); }
643  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
644  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
645  expressions::Expression<RealContext, A2, O2> >,
646  expressions::ShLOp> operator << (const expressions::Expression<RealContext, A1, O1> & a,
647  const expressions::Expression<RealContext, A2, O2> & b)
648  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
649  expressions::Expression<RealContext, A2, O2> >,
650  expressions::ShLOp>(std::make_pair(a, b)); }
651  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
652  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
653  expressions::Expression<RealContext, A2, O2> >,
654  expressions::ShROp> operator >> (const expressions::Expression<RealContext, A1, O1> & a,
655  const expressions::Expression<RealContext, A2, O2> & b)
656  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A1, O1>,
657  expressions::Expression<RealContext, A2, O2> >,
658  expressions::ShROp>(std::make_pair(a, b)); }
659 
660  template<class A, template<typename, typename> class O>
661  inline bool isZero(const expressions::Expression<RealContext, A, O> & r)
662  {
663  return isZero(r.evaluate());
664  }
665 
666  template<class A, template<typename, typename> class O>
667  inline bool isOne(const expressions::Expression<RealContext, A, O> & r)
668  {
669  return isOne(r.evaluate());
670  }
671 
672  template<class A, template<typename, typename> class O>
673  inline bool isPositive(const expressions::Expression<RealContext, A, O> & r)
674  {
675  return isPositive(r.evaluate());
676  }
677 
678  template<class A, template<typename, typename> class O>
679  inline bool isNonNegative(const expressions::Expression<RealContext, A, O> & r)
680  {
681  return isNonNegative(r.evaluate());
682  }
683 
684  template<class A, template<typename, typename> class O>
685  inline bool isNegative(const expressions::Expression<RealContext, A, O> & r)
686  {
687  return isNegative(r.evaluate());
688  }
689 
690  template<class A, template<typename, typename> class O>
691  inline bool isNonPositive(const expressions::Expression<RealContext, A, O> & r)
692  {
693  return isZero(r.evaluate());
694  }
695 
696  template<class A, template<typename, typename> class O>
697  inline std::ostream & operator << (std::ostream & s, const expressions::Expression<RealContext, A, O> & r)
698  {
699  return s << r.evaluate();
700  }
701  }
702 
714  inline Real & operator -= (Real & cur, const Real & r)
715  {
716  sub(cur, cur, r);
717  return cur;
718  }
719 
730  template<class D>
732  {
733  submul(cur, E.data().first.evaluate(), E.data().second.evaluate());
734  return cur;
735  }
736 
744  inline Real & operator += (Real & cur, const Real & r)
745  {
746  add(cur, cur, r);
747  return cur;
748  }
749 
760  template<class D>
762  {
763  addmul(cur, E.data().first.evaluate(), E.data().second.evaluate());
764  return cur;
765  }
766 
774  inline Real & operator *= (Real & cur, const Real & r)
775  {
776  mul(cur, cur, r);
777  return cur;
778  }
779 
787  inline Real & operator /= (Real & cur, const Real & r)
788  {
789  div(cur, cur, r);
790  return cur;
791  }
792 
801  inline Real & operator %= (Real & cur, const Real & r)
802  {
803  mod(cur, cur, r);
804  return cur;
805  }
806 
816  inline Real & operator <<= (Real & cur, const Real & r)
817  {
818  shl(cur, cur, r);
819  return cur;
820  }
821 
831  inline Real & operator >>= (Real & cur, const Real & r)
832  {
833  shr(cur, cur, r);
834  return cur;
835  }
836 
844  inline Real & operator <<= (Real & cur, long r)
845  {
846  shl(cur, cur, r);
847  return cur;
848  }
849 
857  inline Real & operator >>= (Real & cur, long r)
858  {
859  shr(cur, cur, r);
860  return cur;
861  }
862 
864 
875  inline Real operator ++ (Real & cur, int)
876  {
877  Real r(cur, true);
878  increment(cur, cur);
879  return r;
880  }
881 
888  inline Real operator -- (Real & cur, int)
889  {
890  Real r(cur, true);
891  decrement(cur, cur);
892  return r;
893  }
894 
901  inline Real & operator ++ (Real & cur)
902  {
903  increment(cur, cur);
904  return cur;
905  }
906 
913  inline Real & operator -- (Real & cur)
914  {
915  decrement(cur, cur);
916  return cur;
917  }
918 
920 
932  inline bool operator == (const Real & a, const Real & b)
933  {
934  return mpfr_equal_p(a.d_value, b.d_value);
935  }
936 
944  inline bool operator != (const Real & a, const Real & b)
945  {
946  return !mpfr_equal_p(a.d_value, b.d_value);
947  }
948 
956  inline bool operator <= (const Real & a, const Real & b)
957  {
958  return mpfr_lessequal_p(a.d_value, b.d_value);
959  }
960 
968  inline bool operator >= (const Real & a, const Real & b)
969  {
970  return mpfr_greaterequal_p(a.d_value, b.d_value);
971  }
972 
980  inline bool operator < (const Real & a, const Real & b)
981  {
982  return mpfr_less_p(a.d_value, b.d_value);
983  }
984 
992  inline bool operator > (const Real & a, const Real & b)
993  {
994  return mpfr_greater_p(a.d_value, b.d_value);
995  }
996 
998 
999  // Second operand is expression: also make the first one an expression
1000  template<class A2, template<typename, typename> class O2>
1001  inline bool operator == (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1002  {
1003  return expressions::make_expression<RealContext>(a) == b;
1004  }
1005 
1006  template<class A2, template<typename, typename> class O2>
1007  inline bool operator != (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1008  {
1009  return expressions::make_expression<RealContext>(a) != b;
1010  }
1011 
1012  template<class A2, template<typename, typename> class O2>
1013  inline bool operator <= (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1014  {
1015  return expressions::make_expression<RealContext>(a) <= b;
1016  }
1017 
1018  template<class A2, template<typename, typename> class O2>
1019  inline bool operator >= (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1020  {
1021  return expressions::make_expression<RealContext>(a) >= b;
1022  }
1023 
1024  template<class A2, template<typename, typename> class O2>
1025  inline bool operator < (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1026  {
1027  return expressions::make_expression<RealContext>(a) < b;
1028  }
1029 
1030  template<class A2, template<typename, typename> class O2>
1031  inline bool operator > (const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1032  {
1033  return expressions::make_expression<RealContext>(a) > b;
1034  }
1035 
1036  namespace expressions
1037  {
1038  // First operand is expression: also make the second one an expression
1039  template<class A1, template<typename, typename> class O1>
1040  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a, const arithmetic::Real & b)
1041  {
1042  return a == expressions::make_expression<RealContext>(b);
1043  }
1044 
1045  template<class A1, template<typename, typename> class O1>
1046  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a, const arithmetic::Real & b)
1047  {
1048  return a != expressions::make_expression<RealContext>(b);
1049  }
1050 
1051  template<class A1, template<typename, typename> class O1>
1052  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a, const arithmetic::Real & b)
1053  {
1054  return a <= expressions::make_expression<RealContext>(b);
1055  }
1056 
1057  template<class A1, template<typename, typename> class O1>
1058  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a, const arithmetic::Real & b)
1059  {
1060  return a >= expressions::make_expression<RealContext>(b);
1061  }
1062 
1063  template<class A1, template<typename, typename> class O1>
1064  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a, const arithmetic::Real & b)
1065  {
1066  return a < expressions::make_expression<RealContext>(b);
1067  }
1068 
1069  template<class A1, template<typename, typename> class O1>
1070  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a, const arithmetic::Real & b)
1071  {
1072  return a > expressions::make_expression<RealContext>(b);
1073  }
1074 
1075  // Both operands are expressions
1076  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1077  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a, const expressions::Expression<RealContext, A2, O2> & b)
1078  {
1079  return a.evaluate() == b.evaluate();
1080  }
1081 
1082  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1083  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a, const expressions::Expression<RealContext, A2, O2> & b)
1084  {
1085  return a.evaluate() != b.evaluate();
1086  }
1087 
1088  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1089  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a, const expressions::Expression<RealContext, A2, O2> & b)
1090  {
1091  return a.evaluate() <= b.evaluate();
1092  }
1093 
1094  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1095  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a, const expressions::Expression<RealContext, A2, O2> & b)
1096  {
1097  return a.evaluate() >= b.evaluate();
1098  }
1099 
1100  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1101  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a, const expressions::Expression<RealContext, A2, O2> & b)
1102  {
1103  return a.evaluate() < b.evaluate();
1104  }
1105 
1106  template<class A1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1107  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a, const expressions::Expression<RealContext, A2, O2> & b)
1108  {
1109  return a.evaluate() > b.evaluate();
1110  }
1111 
1112  // First operand is integer/double/... conversion expression, second operand arbitrary expression
1113  template<class A2, template<typename, typename> class O2>
1114  inline bool operator == (const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & a,
1115  const expressions::Expression<RealContext, A2, O2> & b)
1116  { return compare_ui(b.evaluate(), a.data().evaluate()) == 0; }
1117  template<class A2, template<typename, typename> class O2>
1118  inline bool operator != (const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & a,
1119  const expressions::Expression<RealContext, A2, O2> & b)
1120  { return compare_ui(b.evaluate(), a.data().evaluate()) != 0; }
1121  template<class A2, template<typename, typename> class O2>
1122  inline bool operator <= (const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & a,
1123  const expressions::Expression<RealContext, A2, O2> & b)
1124  { return compare_ui(b.evaluate(), a.data().evaluate()) >= 0; }
1125  template<class A2, template<typename, typename> class O2>
1126  inline bool operator >= (const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & a,
1127  const expressions::Expression<RealContext, A2, O2> & b)
1128  { return compare_ui(b.evaluate(), a.data().evaluate()) <= 0; }
1129  template<class A2, template<typename, typename> class O2>
1130  inline bool operator < (const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & a,
1131  const expressions::Expression<RealContext, A2, O2> & b)
1132  { return compare_ui(b.evaluate(), a.data().evaluate()) > 0; }
1133  template<class A2, template<typename, typename> class O2>
1134  inline bool operator > (const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & a,
1135  const expressions::Expression<RealContext, A2, O2> & b)
1136  { return compare_ui(b.evaluate(), a.data().evaluate()) < 0; }
1137 
1138  template<class A2, template<typename, typename> class O2>
1139  inline bool operator == (const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & a,
1140  const expressions::Expression<RealContext, A2, O2> & b)
1141  { return compare_si(b.evaluate(), a.data().evaluate()) == 0; }
1142  template<class A2, template<typename, typename> class O2>
1143  inline bool operator != (const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & a,
1144  const expressions::Expression<RealContext, A2, O2> & b)
1145  { return compare_si(b.evaluate(), a.data().evaluate()) != 0; }
1146  template<class A2, template<typename, typename> class O2>
1147  inline bool operator <= (const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & a,
1148  const expressions::Expression<RealContext, A2, O2> & b)
1149  { return compare_si(b.evaluate(), a.data().evaluate()) >= 0; }
1150  template<class A2, template<typename, typename> class O2>
1151  inline bool operator >= (const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & a,
1152  const expressions::Expression<RealContext, A2, O2> & b)
1153  { return compare_si(b.evaluate(), a.data().evaluate()) <= 0; }
1154  template<class A2, template<typename, typename> class O2>
1155  inline bool operator < (const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & a,
1156  const expressions::Expression<RealContext, A2, O2> & b)
1157  { return compare_si(b.evaluate(), a.data().evaluate()) > 0; }
1158  template<class A2, template<typename, typename> class O2>
1159  inline bool operator > (const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & a,
1160  const expressions::Expression<RealContext, A2, O2> & b)
1161  { return compare_si(b.evaluate(), a.data().evaluate()) < 0; }
1162 
1163  template<class A2, template<typename, typename> class O2>
1164  inline bool operator == (const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & a,
1165  const expressions::Expression<RealContext, A2, O2> & b)
1166  { return compare_d(b.evaluate(), a.data().evaluate()) == 0; }
1167  template<class A2, template<typename, typename> class O2>
1168  inline bool operator != (const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & a,
1169  const expressions::Expression<RealContext, A2, O2> & b)
1170  { return compare_d(b.evaluate(), a.data().evaluate()) != 0; }
1171  template<class A2, template<typename, typename> class O2>
1172  inline bool operator <= (const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & a,
1173  const expressions::Expression<RealContext, A2, O2> & b)
1174  { return compare_d(b.evaluate(), a.data().evaluate()) >= 0; }
1175  template<class A2, template<typename, typename> class O2>
1176  inline bool operator >= (const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & a,
1177  const expressions::Expression<RealContext, A2, O2> & b)
1178  { return compare_d(b.evaluate(), a.data().evaluate()) <= 0; }
1179  template<class A2, template<typename, typename> class O2>
1180  inline bool operator < (const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & a,
1181  const expressions::Expression<RealContext, A2, O2> & b)
1182  { return compare_d(b.evaluate(), a.data().evaluate()) > 0; }
1183  template<class A2, template<typename, typename> class O2>
1184  inline bool operator > (const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & a,
1185  const expressions::Expression<RealContext, A2, O2> & b)
1186  { return compare_d(b.evaluate(), a.data().evaluate()) < 0; }
1187 
1188  template<class A2, template<typename, typename> class O2>
1189  inline bool operator == (const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & a,
1190  const expressions::Expression<RealContext, A2, O2> & b)
1191  { return compare_ld(b.evaluate(), a.data().evaluate()) == 0; }
1192  template<class A2, template<typename, typename> class O2>
1193  inline bool operator != (const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & a,
1194  const expressions::Expression<RealContext, A2, O2> & b)
1195  { return compare_ld(b.evaluate(), a.data().evaluate()) != 0; }
1196  template<class A2, template<typename, typename> class O2>
1197  inline bool operator <= (const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & a,
1198  const expressions::Expression<RealContext, A2, O2> & b)
1199  { return compare_ld(b.evaluate(), a.data().evaluate()) >= 0; }
1200  template<class A2, template<typename, typename> class O2>
1201  inline bool operator >= (const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & a,
1202  const expressions::Expression<RealContext, A2, O2> & b)
1203  { return compare_ld(b.evaluate(), a.data().evaluate()) <= 0; }
1204  template<class A2, template<typename, typename> class O2>
1205  inline bool operator < (const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & a,
1206  const expressions::Expression<RealContext, A2, O2> & b)
1207  { return compare_ld(b.evaluate(), a.data().evaluate()) > 0; }
1208  template<class A2, template<typename, typename> class O2>
1209  inline bool operator > (const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & a,
1210  const expressions::Expression<RealContext, A2, O2> & b)
1211  { return compare_ld(b.evaluate(), a.data().evaluate()) < 0; }
1212 
1213  template<class D1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1214  inline bool operator == (const Expression<RealContext, Expression<IntegerContext, D1, O1>, ConvertOp_Context> & a,
1215  const expressions::Expression<RealContext, A2, O2> & b)
1216  { return compare_z(b.evaluate(), a.data().evaluate()) == 0; }
1217  template<class D1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1218  inline bool operator != (const Expression<RealContext, Expression<IntegerContext, D1, O1>, ConvertOp_Context> & a,
1219  const expressions::Expression<RealContext, A2, O2> & b)
1220  { return compare_z(b.evaluate(), a.data().evaluate()) != 0; }
1221  template<class D1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1222  inline bool operator <= (const Expression<RealContext, Expression<IntegerContext, D1, O1>, ConvertOp_Context> & a,
1223  const expressions::Expression<RealContext, A2, O2> & b)
1224  { return compare_z(b.evaluate(), a.data().evaluate()) >= 0; }
1225  template<class D1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1226  inline bool operator >= (const Expression<RealContext, Expression<IntegerContext, D1, O1>, ConvertOp_Context> & a,
1227  const expressions::Expression<RealContext, A2, O2> & b)
1228  { return compare_z(b.evaluate(), a.data().evaluate()) <= 0; }
1229  template<class D1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1230  inline bool operator < (const Expression<RealContext, Expression<IntegerContext, D1, O1>, ConvertOp_Context> & a,
1231  const expressions::Expression<RealContext, A2, O2> & b)
1232  { return compare_z(b.evaluate(), a.data().evaluate()) > 0; }
1233  template<class D1, template<typename, typename> class O1, class A2, template<typename, typename> class O2>
1234  inline bool operator > (const Expression<RealContext, Expression<IntegerContext, D1, O1>, ConvertOp_Context> & a,
1235  const expressions::Expression<RealContext, A2, O2> & b)
1236  { return compare_z(b.evaluate(), a.data().evaluate()) < 0; }
1237 
1238  template<class A2, template<typename, typename> class O2>
1239  inline bool operator == (const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1240  expressions::ConvertOp_Context>, expressions::ShiftCOp> & a,
1241  const expressions::Expression<RealContext, A2, O2> & b)
1242  { return compare_ui2(b.evaluate(), a.data().data().evaluate(), a.op().shift()) == 0; }
1243  template<class A2, template<typename, typename> class O2>
1244  inline bool operator != (const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1245  expressions::ConvertOp_Context>, expressions::ShiftCOp> & a,
1246  const expressions::Expression<RealContext, A2, O2> & b)
1247  { return compare_ui2(b.evaluate(), a.data().data().evaluate(), a.op().shift()) != 0; }
1248  template<class A2, template<typename, typename> class O2>
1249  inline bool operator <= (const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1250  expressions::ConvertOp_Context>, expressions::ShiftCOp> & a,
1251  const expressions::Expression<RealContext, A2, O2> & b)
1252  { return compare_ui2(b.evaluate(), a.data().data().evaluate(), a.op().shift()) >= 0; }
1253  template<class A2, template<typename, typename> class O2>
1254  inline bool operator >= (const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1255  expressions::ConvertOp_Context>, expressions::ShiftCOp> & a,
1256  const expressions::Expression<RealContext, A2, O2> & b)
1257  { return compare_ui2(b.evaluate(), a.data().data().evaluate(), a.op().shift()) <= 0; }
1258  template<class A2, template<typename, typename> class O2>
1259  inline bool operator < (const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1260  expressions::ConvertOp_Context>, expressions::ShiftCOp> & a,
1261  const expressions::Expression<RealContext, A2, O2> & b)
1262  { return compare_ui2(b.evaluate(), a.data().data().evaluate(), a.op().shift()) > 0; }
1263  template<class A2, template<typename, typename> class O2>
1264  inline bool operator > (const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1265  expressions::ConvertOp_Context>, expressions::ShiftCOp> & a,
1266  const expressions::Expression<RealContext, A2, O2> & b)
1267  { return compare_ui2(b.evaluate(), a.data().data().evaluate(), a.op().shift()) < 0; }
1268 
1269  // First operand is arbitrary expression, Second operand is integer/double/... conversion expression
1270  template<class A1, template<typename, typename> class O1>
1271  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a,
1272  const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & b)
1273  { return compare_ui(a.evaluate(), b.data().evaluate()) == 0; }
1274  template<class A1, template<typename, typename> class O1>
1275  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a,
1276  const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & b)
1277  { return compare_ui(a.evaluate(), b.data().evaluate()) != 0; }
1278  template<class A1, template<typename, typename> class O1>
1279  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a,
1280  const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & b)
1281  { return compare_ui(a.evaluate(), b.data().evaluate()) <= 0; }
1282  template<class A1, template<typename, typename> class O1>
1283  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a,
1284  const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & b)
1285  { return compare_ui(a.evaluate(), b.data().evaluate()) >= 0; }
1286  template<class A1, template<typename, typename> class O1>
1287  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a,
1288  const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & b)
1289  { return compare_ui(a.evaluate(), b.data().evaluate()) < 0; }
1290  template<class A1, template<typename, typename> class O1>
1291  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a,
1292  const expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>, expressions::ConvertOp_Context> & b)
1293  { return compare_ui(a.evaluate(), b.data().evaluate()) > 0; }
1294 
1295  template<class A1, template<typename, typename> class O1>
1296  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a,
1297  const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & b)
1298  { return compare_si(a.evaluate(), b.data().evaluate()) == 0; }
1299  template<class A1, template<typename, typename> class O1>
1300  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a,
1301  const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & b)
1302  { return compare_si(a.evaluate(), b.data().evaluate()) != 0; }
1303  template<class A1, template<typename, typename> class O1>
1304  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a,
1305  const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & b)
1306  { return compare_si(a.evaluate(), b.data().evaluate()) <= 0; }
1307  template<class A1, template<typename, typename> class O1>
1308  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a,
1309  const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & b)
1310  { return compare_si(a.evaluate(), b.data().evaluate()) >= 0; }
1311  template<class A1, template<typename, typename> class O1>
1312  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a,
1313  const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & b)
1314  { return compare_si(a.evaluate(), b.data().evaluate()) < 0; }
1315  template<class A1, template<typename, typename> class O1>
1316  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a,
1317  const expressions::Expression<RealContext, expressions::ConversionWrapper<signed long>, expressions::ConvertOp_Context> & b)
1318  { return compare_si(a.evaluate(), b.data().evaluate()) > 0; }
1319 
1320  template<class A1, template<typename, typename> class O1>
1321  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a,
1322  const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & b)
1323  { return compare_d(a.evaluate(), b.data().evaluate()) == 0; }
1324  template<class A1, template<typename, typename> class O1>
1325  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a,
1326  const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & b)
1327  { return compare_d(a.evaluate(), b.data().evaluate()) != 0; }
1328  template<class A1, template<typename, typename> class O1>
1329  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a,
1330  const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & b)
1331  { return compare_d(a.evaluate(), b.data().evaluate()) <= 0; }
1332  template<class A1, template<typename, typename> class O1>
1333  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a,
1334  const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & b)
1335  { return compare_d(a.evaluate(), b.data().evaluate()) >= 0; }
1336  template<class A1, template<typename, typename> class O1>
1337  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a,
1338  const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & b)
1339  { return compare_d(a.evaluate(), b.data().evaluate()) < 0; }
1340  template<class A1, template<typename, typename> class O1>
1341  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a,
1342  const expressions::Expression<RealContext, expressions::ConversionWrapper<double>, expressions::ConvertOp_Context> & b)
1343  { return compare_d(a.evaluate(), b.data().evaluate()) > 0; }
1344 
1345  template<class A1, template<typename, typename> class O1>
1346  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a,
1347  const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & b)
1348  { return compare_ld(a.evaluate(), b.data().evaluate()) == 0; }
1349  template<class A1, template<typename, typename> class O1>
1350  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a,
1351  const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & b)
1352  { return compare_ld(a.evaluate(), b.data().evaluate()) != 0; }
1353  template<class A1, template<typename, typename> class O1>
1354  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a,
1355  const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & b)
1356  { return compare_ld(a.evaluate(), b.data().evaluate()) <= 0; }
1357  template<class A1, template<typename, typename> class O1>
1358  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a,
1359  const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & b)
1360  { return compare_ld(a.evaluate(), b.data().evaluate()) >= 0; }
1361  template<class A1, template<typename, typename> class O1>
1362  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a,
1363  const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & b)
1364  { return compare_ld(a.evaluate(), b.data().evaluate()) < 0; }
1365  template<class A1, template<typename, typename> class O1>
1366  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a,
1367  const expressions::Expression<RealContext, expressions::ConversionWrapper<long double>, expressions::ConvertOp_Context> & b)
1368  { return compare_ld(a.evaluate(), b.data().evaluate()) > 0; }
1369 
1370  template<class A1, template<typename, typename> class O1, class D2, template<typename, typename> class O2>
1371  inline bool operator == (const expressions::Expression<RealContext, A1, O1> & a,
1372  const Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> & b)
1373  { return compare_z(a.evaluate(), b.data().evaluate()) == 0; }
1374  template<class A1, template<typename, typename> class O1, class D2, template<typename, typename> class O2>
1375  inline bool operator != (const expressions::Expression<RealContext, A1, O1> & a,
1376  const Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> & b)
1377  { return compare_z(a.evaluate(), b.data().evaluate()) != 0; }
1378  template<class A1, template<typename, typename> class O1, class D2, template<typename, typename> class O2>
1379  inline bool operator <= (const expressions::Expression<RealContext, A1, O1> & a,
1380  const Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> & b)
1381  { return compare_z(a.evaluate(), b.data().evaluate()) <= 0; }
1382  template<class A1, template<typename, typename> class O1, class D2, template<typename, typename> class O2>
1383  inline bool operator >= (const expressions::Expression<RealContext, A1, O1> & a,
1384  const Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> & b)
1385  { return compare_z(a.evaluate(), b.data().evaluate()) >= 0; }
1386  template<class A1, template<typename, typename> class O1, class D2, template<typename, typename> class O2>
1387  inline bool operator < (const expressions::Expression<RealContext, A1, O1> & a,
1388  const Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> & b)
1389  { return compare_z(a.evaluate(), b.data().evaluate()) < 0; }
1390  template<class A1, template<typename, typename> class O1, class D2, template<typename, typename> class O2>
1391  inline bool operator > (const expressions::Expression<RealContext, A1, O1> & a,
1392  const Expression<RealContext, Expression<IntegerContext, D2, O2>, ConvertOp_Context> & b)
1393  { return compare_z(a.evaluate(), b.data().evaluate()) > 0; }
1394 
1395  template<class A2, template<typename, typename> class O2>
1396  inline bool operator == (const expressions::Expression<RealContext, A2, O2> & a,
1397  const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1398  expressions::ConvertOp_Context>, expressions::ShiftCOp> & b)
1399  { return compare_ui2(a.evaluate(), b.data().data().evaluate(), b.op().shift()) == 0; }
1400  template<class A2, template<typename, typename> class O2>
1401  inline bool operator != (const expressions::Expression<RealContext, A2, O2> & a,
1402  const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1403  expressions::ConvertOp_Context>, expressions::ShiftCOp> & b)
1404  { return compare_ui2(a.evaluate(), b.data().data().evaluate(), b.op().shift()) != 0; }
1405  template<class A2, template<typename, typename> class O2>
1406  inline bool operator <= (const expressions::Expression<RealContext, A2, O2> & a,
1407  const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1408  expressions::ConvertOp_Context>, expressions::ShiftCOp> & b)
1409  { return compare_ui2(a.evaluate(), b.data().data().evaluate(), b.op().shift()) <= 0; }
1410  template<class A2, template<typename, typename> class O2>
1411  inline bool operator >= (const expressions::Expression<RealContext, A2, O2> & a,
1412  const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1413  expressions::ConvertOp_Context>, expressions::ShiftCOp> & b)
1414  { return compare_ui2(a.evaluate(), b.data().data().evaluate(), b.op().shift()) >= 0; }
1415  template<class A2, template<typename, typename> class O2>
1416  inline bool operator < (const expressions::Expression<RealContext, A2, O2> & a,
1417  const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1418  expressions::ConvertOp_Context>, expressions::ShiftCOp> & b)
1419  { return compare_ui2(a.evaluate(), b.data().data().evaluate(), b.op().shift()) < 0; }
1420  template<class A2, template<typename, typename> class O2>
1421  inline bool operator > (const expressions::Expression<RealContext, A2, O2> & a,
1422  const expressions::Expression<RealContext, expressions::Expression<RealContext, expressions::ConversionWrapper<unsigned long>,
1423  expressions::ConvertOp_Context>, expressions::ShiftCOp> & b)
1424  { return compare_ui2(a.evaluate(), b.data().data().evaluate(), b.op().shift()) > 0; }
1425  }
1426 
1436  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1439  expressions::AbsOp>(expressions::Wrapper<RealContext>(i)); }
1446  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1449  expressions::SquareOp>(expressions::Wrapper<RealContext>(i)); }
1451 
1461  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1464  expressions::SinOp>(expressions::Wrapper<RealContext>(i)); }
1472  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1475  expressions::CosOp>(expressions::Wrapper<RealContext>(i)); }
1483  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1486  expressions::TanOp>(expressions::Wrapper<RealContext>(i)); }
1494  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1497  expressions::ASinOp>(expressions::Wrapper<RealContext>(i)); }
1505  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1508  expressions::ACosOp>(expressions::Wrapper<RealContext>(i)); }
1516  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1519  expressions::ATanOp>(expressions::Wrapper<RealContext>(i)); }
1529  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1530  expressions::Wrapper<RealContext> >,
1531  expressions::ATan2Op> atan2(const Real & y, const Real & x)
1533  expressions::Wrapper<RealContext> >,
1534  expressions::ATan2Op>(std::make_pair(expressions::Wrapper<RealContext>(y),
1535  expressions::Wrapper<RealContext>(x))); }
1537 
1547  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1550  expressions::ExpOp>(expressions::Wrapper<RealContext>(i)); }
1558  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1561  expressions::LogOp>(expressions::Wrapper<RealContext>(i)); }
1569  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1572  expressions::Log2Op>(expressions::Wrapper<RealContext>(i)); }
1580  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1583  expressions::Log10Op>(expressions::Wrapper<RealContext>(i)); }
1591  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1594  expressions::SqrtOp>(expressions::Wrapper<RealContext>(i)); }
1596 
1606  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1609  expressions::GammaOp>(expressions::Wrapper<RealContext>(i)); }
1618  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1621  expressions::LGammaOp>(expressions::Wrapper<RealContext>(i)); }
1632  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1635  expressions::LGamma2Op>(expressions::Wrapper<RealContext>(i), sign); }
1637 
1647  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1650  expressions::PowerCOp<signed long>::impl>(expressions::Wrapper<RealContext>(a), b); }
1658  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1661  expressions::PowerCOp<unsigned long>::impl>(expressions::Wrapper<RealContext>(a), b); }
1669  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1670  expressions::Wrapper<IntegerContext> >,
1671  expressions::PowerOp> power(const Real & a, const Integer & b)
1674  expressions::PowerOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
1675  expressions::Wrapper<IntegerContext>(b))); }
1684  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1685  expressions::Wrapper<RealContext> >,
1686  expressions::PowerOp> power(const Real & a, const Real & b)
1688  expressions::Wrapper<RealContext> >,
1689  expressions::PowerOp>(std::make_pair(expressions::Wrapper<RealContext>(a),
1690  expressions::Wrapper<RealContext>(b))); }
1692 
1693  template<class A2, template<typename, typename> class O2>
1694  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1695  expressions::Expression<RealContext, A2, O2> >,
1696  expressions::ATan2Op> atan2(const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1697  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1698  expressions::Expression<RealContext, A2, O2> >,
1699  expressions::ATan2Op>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
1700  template<class A2, template<typename, typename> class O2>
1701 
1702  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1703  expressions::Expression<RealContext, A2, O2> >,
1704  expressions::PowerOp> power(const Real & a, const expressions::Expression<RealContext, A2, O2> & b)
1705  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1706  expressions::Expression<RealContext, A2, O2> >,
1707  expressions::PowerOp>(std::make_pair(expressions::Wrapper<RealContext>(a), b)); }
1708 
1709  namespace expressions
1710  {
1711  template<class A, template<typename, typename> class O>
1712  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1713  expressions::AbsOp> abs(const expressions::Expression<RealContext, A, O> & b)
1714  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1715  expressions::AbsOp>(b); }
1716  template<class A, template<typename, typename> class O>
1717  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1718  expressions::SquareOp> square(const expressions::Expression<RealContext, A, O> & b)
1719  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1720  expressions::SquareOp>(b); }
1721  template<class A, template<typename, typename> class O>
1722  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1723  expressions::SinOp> sin(const expressions::Expression<RealContext, A, O> & b)
1724  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1725  expressions::SinOp>(b); }
1726  template<class A, template<typename, typename> class O>
1727  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1728  expressions::CosOp> cos(const expressions::Expression<RealContext, A, O> & b)
1729  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1730  expressions::CosOp>(b); }
1731  template<class A, template<typename, typename> class O>
1732  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1733  expressions::TanOp> tan(const expressions::Expression<RealContext, A, O> & b)
1734  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1735  expressions::TanOp>(b); }
1736  template<class A, template<typename, typename> class O>
1737  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1738  expressions::ASinOp> asin(const expressions::Expression<RealContext, A, O> & b)
1739  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1740  expressions::ASinOp>(b); }
1741  template<class A, template<typename, typename> class O>
1742  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1743  expressions::ACosOp> acos(const expressions::Expression<RealContext, A, O> & b)
1744  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1745  expressions::ACosOp>(b); }
1746  template<class A, template<typename, typename> class O>
1747  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1748  expressions::ATanOp> atan(const expressions::Expression<RealContext, A, O> & b)
1749  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1750  expressions::ATanOp>(b); }
1751  template<class A, template<typename, typename> class O, class A2, template<typename, typename> class O2>
1752  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1753  expressions::Expression<RealContext, A2, O2> >,
1754  expressions::ATan2Op> atan2(const expressions::Expression<RealContext, A, O> & a,
1755  const expressions::Expression<RealContext, A2, O2> & b)
1756  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1757  expressions::Expression<RealContext, A2, O2> >,
1758  expressions::ATan2Op>(std::make_pair(a, b)); }
1759  template<class A, template<typename, typename> class O>
1760  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1761  expressions::Wrapper<RealContext> >,
1762  expressions::ATan2Op> atan2(const expressions::Expression<RealContext, A, O> & a, const arithmetic::Real & b)
1763  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1764  expressions::Wrapper<RealContext> >,
1765  expressions::ATan2Op>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
1766  template<class A, template<typename, typename> class O>
1767  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1768  expressions::ExpOp> exp(const expressions::Expression<RealContext, A, O> & b)
1769  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1770  expressions::ExpOp>(b); }
1771  template<class A, template<typename, typename> class O>
1772  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1773  expressions::LogOp> log(const expressions::Expression<RealContext, A, O> & b)
1774  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1775  expressions::LogOp>(b); }
1776  template<class A, template<typename, typename> class O>
1777  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1778  expressions::Log2Op> log2(const expressions::Expression<RealContext, A, O> & b)
1779  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1780  expressions::Log2Op>(b); }
1781  template<class A, template<typename, typename> class O>
1782  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1783  expressions::Log10Op> log10(const expressions::Expression<RealContext, A, O> & b)
1784  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1785  expressions::Log10Op>(b); }
1786  template<class A, template<typename, typename> class O>
1787  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1788  expressions::SqrtOp> sqrt(const expressions::Expression<RealContext, A, O> & b)
1789  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1790  expressions::SqrtOp>(b); }
1791  template<class A, template<typename, typename> class O>
1792  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1793  expressions::GammaOp> gamma(const expressions::Expression<RealContext, A, O> & b)
1794  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1795  expressions::GammaOp>(b); }
1796  template<class A, template<typename, typename> class O>
1797  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1798  expressions::LGammaOp> lgamma(const expressions::Expression<RealContext, A, O> & b)
1799  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1800  expressions::LGammaOp>(b); }
1801  template<class A, template<typename, typename> class O>
1802  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1803  expressions::LGamma2Op> lgamma(int & sign, const expressions::Expression<RealContext, A, O> & b)
1804  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1805  expressions::LGamma2Op>(b, sign); }
1806  template<class A, template<typename, typename> class O>
1807  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1808  expressions::PowerCOp<signed long>::impl> power(const expressions::Expression<RealContext, A, O> & a, signed long b)
1809  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1810  expressions::PowerCOp<signed long>::impl>(a, b); }
1811  template<class A, template<typename, typename> class O>
1812  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1813  expressions::PowerCOp<unsigned long>::impl> power(const expressions::Expression<RealContext, A, O> & a, unsigned long b)
1814  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
1815  expressions::PowerCOp<unsigned long>::impl>(a, b); }
1816  template<class A, template<typename, typename> class O>
1817  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1818  expressions::Wrapper<IntegerContext> >,
1819  expressions::PowerOp> power(const expressions::Expression<RealContext, A, O> & a, const Integer & b)
1820  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1821  expressions::Wrapper<IntegerContext> >,
1822  expressions::PowerOp>(std::make_pair(a, expressions::Wrapper<IntegerContext>(b))); }
1823  template<class A, template<typename, typename> class O, class A2, template<typename, typename> class O2>
1824  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1825  expressions::Expression<RealContext, A2, O2> >,
1826  expressions::PowerOp> power(const expressions::Expression<RealContext, A, O> & a,
1827  const expressions::Expression<RealContext, A2, O2> & b)
1828  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1829  expressions::Expression<RealContext, A2, O2> >,
1830  expressions::PowerOp>(std::make_pair(a, b)); }
1831  template<class A, template<typename, typename> class O>
1832  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1833  expressions::Wrapper<RealContext> >,
1834  expressions::PowerOp> power(const expressions::Expression<RealContext, A, O> & a, const arithmetic::Real & b)
1835  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
1836  expressions::Wrapper<RealContext> >,
1837  expressions::PowerOp>(std::make_pair(a, expressions::Wrapper<RealContext>(b))); }
1838  }
1839 
1850  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1853  expressions::AbsOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1861  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1864  expressions::SquareOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1866 
1877  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1880  expressions::SinOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1889  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1892  expressions::CosOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1901  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1904  expressions::TanOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1913  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1916  expressions::ASinOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1925  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1928  expressions::ACosOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1937  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1940  expressions::ATanOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1951  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
1952  expressions::Wrapper<RealContext> >,
1953  expressions::ATan2Op_Context> atan2(const Real & y, const Real & x, const RealContext & rc)
1955  expressions::Wrapper<RealContext> >,
1956  expressions::ATan2Op_Context>(std::make_pair(expressions::Wrapper<RealContext>(y),
1957  expressions::Wrapper<RealContext>(x)), rc); }
1959 
1971  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1974  expressions::ExpOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1983  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1986  expressions::LogOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
1995  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
1998  expressions::Log2Op_Context>(expressions::Wrapper<RealContext>(i), rc); }
2007  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2010  expressions::Log10Op_Context>(expressions::Wrapper<RealContext>(i), rc); }
2019  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2022  expressions::SqrtOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
2024 
2035  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2038  expressions::GammaOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
2048  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2051  expressions::LGammaOp_Context>(expressions::Wrapper<RealContext>(i), rc); }
2063  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2066  expressions::LGamma2Op_Context>(expressions::Wrapper<RealContext>(i),
2067  expressions::LGamma2Op_Context<RealContext, expressions::Wrapper<RealContext> >(sign, rc)); }
2069 
2080  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2083  expressions::PowerCOp_Context<signed long>::impl>(expressions::Wrapper<RealContext>(a),
2084  expressions::PowerCOp_Context<signed long>::impl<RealContext, expressions::Wrapper<RealContext> >(b, rc)); }
2093  inline expressions::Expression<RealContext, expressions::Wrapper<RealContext>,
2096  expressions::PowerCOp_Context<unsigned long>::impl>(expressions::Wrapper<RealContext>(a),
2097  expressions::PowerCOp_Context<unsigned long>::impl<RealContext, expressions::Wrapper<RealContext> >(b, rc)); }
2106  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
2107  expressions::Wrapper<IntegerContext> >,
2108  expressions::PowerOp_Context> power(const Real & a, const Integer & b, const RealContext & rc)
2110  expressions::Wrapper<IntegerContext> >,
2111  expressions::PowerOp_Context>(std::make_pair(expressions::Wrapper<RealContext>(a),
2112  expressions::Wrapper<IntegerContext>(b)), rc); }
2122  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
2123  expressions::Wrapper<RealContext> >,
2124  expressions::PowerOp_Context> power(const Real & a, const Real & b, const RealContext & rc)
2126  expressions::Wrapper<RealContext> >,
2127  expressions::PowerOp_Context>(std::make_pair(expressions::Wrapper<RealContext>(a),
2128  expressions::Wrapper<RealContext>(b)), rc); }
2130 
2131  template<class A2, template<typename, typename> class O2>
2132  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
2133  expressions::Expression<RealContext, A2, O2> >,
2134  expressions::ATan2Op_Context> atan2(const Real & a, const expressions::Expression<RealContext, A2, O2> & b,
2135  const RealContext & rc)
2136  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
2137  expressions::Expression<RealContext, A2, O2> >,
2138  expressions::ATan2Op_Context>(std::make_pair(expressions::Wrapper<RealContext>(a), b), rc); }
2139  template<class A2, template<typename, typename> class O2>
2140  inline expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
2141  expressions::Expression<RealContext, A2, O2> >,
2142  expressions::PowerOp_Context> power(const Real & a, const expressions::Expression<RealContext, A2, O2> & b, const RealContext & rc)
2143  { return expressions::Expression<RealContext, std::pair<expressions::Wrapper<RealContext>,
2144  expressions::Expression<RealContext, A2, O2> >,
2145  expressions::PowerOp_Context>(std::make_pair(expressions::Wrapper<RealContext>(a), b), rc); }
2146 
2147  namespace implementation
2148  {
2149  namespace Real_impl
2150  {
2151  template<class A, template<typename, typename> class O>
2152  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2153  expressions::AbsOp_Context> abs(const expressions::Expression<RealContext, A, O> & b,
2154  const RealContext & rc)
2155  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2156  expressions::AbsOp_Context>(b, rc); }
2157  template<class A, template<typename, typename> class O>
2158  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2159  expressions::SquareOp_Context> square(const expressions::Expression<RealContext, A, O> & b,
2160  const RealContext & rc)
2161  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2162  expressions::SquareOp_Context>(b, rc); }
2163  template<class A, template<typename, typename> class O>
2164  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2165  expressions::SinOp_Context> sin(const expressions::Expression<RealContext, A, O> & b,
2166  const RealContext & rc)
2167  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2168  expressions::SinOp_Context>(b, rc); }
2169  template<class A, template<typename, typename> class O>
2170  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2171  expressions::CosOp_Context> cos(const expressions::Expression<RealContext, A, O> & b,
2172  const RealContext & rc)
2173  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2174  expressions::CosOp_Context>(b, rc); }
2175  template<class A, template<typename, typename> class O>
2176  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2177  expressions::TanOp_Context> tan(const expressions::Expression<RealContext, A, O> & b,
2178  const RealContext & rc)
2179  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2180  expressions::TanOp_Context>(b, rc); }
2181  template<class A, template<typename, typename> class O>
2182  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2183  expressions::ASinOp_Context> asin(const expressions::Expression<RealContext, A, O> & b,
2184  const RealContext & rc)
2185  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2186  expressions::ASinOp_Context>(b, rc); }
2187  template<class A, template<typename, typename> class O>
2188  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2189  expressions::ACosOp_Context> acos(const expressions::Expression<RealContext, A, O> & b,
2190  const RealContext & rc)
2191  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2192  expressions::ACosOp_Context>(b, rc); }
2193  template<class A, template<typename, typename> class O>
2194  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2195  expressions::ATanOp_Context> atan(const expressions::Expression<RealContext, A, O> & b,
2196  const RealContext & rc)
2197  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2198  expressions::ATanOp_Context>(b, rc); }
2199  template<class A, template<typename, typename> class O, class A2, template<typename, typename> class O2>
2200  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2201  expressions::Expression<RealContext, A2, O2> >,
2202  expressions::ATan2Op_Context> atan2(const expressions::Expression<RealContext, A, O> & a,
2203  const expressions::Expression<RealContext, A2, O2> & b,
2204  const RealContext & rc)
2205  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2206  expressions::Expression<RealContext, A2, O2> >,
2207  expressions::ATan2Op_Context>(std::make_pair(a, b), rc); }
2208  template<class A, template<typename, typename> class O>
2209  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2210  expressions::Wrapper<RealContext> >,
2211  expressions::ATan2Op_Context> atan2(const expressions::Expression<RealContext, A, O> & a,
2212  const arithmetic::Real & b, const RealContext & rc)
2213  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2214  expressions::Wrapper<RealContext> >,
2215  expressions::ATan2Op_Context>(std::make_pair(a, expressions::Wrapper<RealContext>(b)), rc); }
2216  template<class A, template<typename, typename> class O>
2217  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2218  expressions::ExpOp_Context> exp(const expressions::Expression<RealContext, A, O> & b,
2219  const RealContext & rc)
2220  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2221  expressions::ExpOp_Context>(b, rc); }
2222  template<class A, template<typename, typename> class O>
2223  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2224  expressions::LogOp_Context> log(const expressions::Expression<RealContext, A, O> & b,
2225  const RealContext & rc)
2226  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2227  expressions::LogOp_Context>(b, rc); }
2228  template<class A, template<typename, typename> class O>
2229  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2230  expressions::Log2Op_Context> log2(const expressions::Expression<RealContext, A, O> & b,
2231  const RealContext & rc)
2232  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2233  expressions::Log2Op_Context>(b, rc); }
2234  template<class A, template<typename, typename> class O>
2235  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2236  expressions::Log10Op_Context> log10(const expressions::Expression<RealContext, A, O> & b,
2237  const RealContext & rc)
2238  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2239  expressions::Log10Op_Context>(b, rc); }
2240  template<class A, template<typename, typename> class O>
2241  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2242  expressions::SqrtOp_Context> sqrt(const expressions::Expression<RealContext, A, O> & b,
2243  const RealContext & rc)
2244  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2245  expressions::SqrtOp_Context>(b, rc); }
2246  template<class A, template<typename, typename> class O>
2247  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2248  expressions::GammaOp_Context> gamma(const expressions::Expression<RealContext, A, O> & b,
2249  const RealContext & rc)
2250  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2251  expressions::GammaOp_Context>(b, rc); }
2252  template<class A, template<typename, typename> class O>
2253  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2254  expressions::LGammaOp_Context> lgamma(const expressions::Expression<RealContext, A, O> & b,
2255  const RealContext & rc)
2256  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2257  expressions::LGammaOp_Context>(b, rc); }
2258  template<class A, template<typename, typename> class O>
2259  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2260  expressions::PowerCOp_Context<signed long>::impl> power(const expressions::Expression<RealContext, A, O> & a,
2261  signed long b, const RealContext & rc)
2262  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2263  expressions::PowerCOp_Context<signed long>::impl>(a, expressions::PowerCOp_Context<signed long>::impl<RealContext, expressions::Expression<RealContext, A, O> >(b, rc)); }
2264  template<class A, template<typename, typename> class O>
2265  inline expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2266  expressions::PowerCOp_Context<unsigned long>::impl> power(const expressions::Expression<RealContext, A, O> & a,
2267  unsigned long b, const RealContext & rc)
2268  { return expressions::Expression<RealContext, expressions::Expression<RealContext, A, O>,
2269  expressions::PowerCOp_Context<unsigned long>::impl>(a, expressions::PowerCOp_Context<unsigned long>::impl<RealContext, expressions::Expression<RealContext, A, O> >(b, rc)); }
2270  template<class A, template<typename, typename> class O>
2271  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2272  expressions::Wrapper<IntegerContext> >,
2273  expressions::PowerOp_Context> power(const expressions::Expression<RealContext, A, O> & a,
2274  const Integer & b, const RealContext & rc)
2275  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2276  expressions::Wrapper<IntegerContext> >,
2277  expressions::PowerOp_Context>(std::make_pair(a, expressions::Wrapper<IntegerContext>(b)), rc); }
2278  template<class A, template<typename, typename> class O, class A2, template<typename, typename> class O2>
2279  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2280  expressions::Expression<RealContext, A2, O2> >,
2281  expressions::PowerOp_Context> power(const expressions::Expression<RealContext, A, O> & a,
2282  const expressions::Expression<RealContext, A2, O2> & b, const RealContext & rc)
2283  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2284  expressions::Expression<RealContext, A2, O2> >,
2285  expressions::PowerOp_Context>(std::make_pair(a, b), rc); }
2286  template<class A, template<typename, typename> class O>
2287  inline expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2288  expressions::Wrapper<RealContext> >,
2289  expressions::PowerOp_Context> power(const expressions::Expression<RealContext, A, O> & a,
2290  const arithmetic::Real & b, const RealContext & rc)
2291  { return expressions::Expression<RealContext, std::pair<expressions::Expression<RealContext, A, O>,
2292  expressions::Wrapper<RealContext> >,
2293  expressions::PowerOp_Context>(std::make_pair(a, expressions::Wrapper<RealContext>(b)), rc); }
2294  }
2295  }
2296  }
2297 }
2298 
2299 #endif
Returns the sum of the operands.
void submul(Integer &r, const Integer &a, const Integer &b)
Multiplies a and b and subtracts the result from r.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::ExpOp > exp(const Real &i)
Returns the exponential function evaluated at the given floating point number.
Implementation of raising to a power by a constant exponent.
Integer & operator<<=(Integer &cur, const Integer &i)
Computes the bitwise left shift of cur by i bits, and stores the result in cur.
Integer & operator+=(Integer &cur, const expressions::Expression< IntegerContext, D, expressions::MulOp > &E)
Adds the given multiplication expression to cur.
bool operator<(const Integer &a, const Integer &b)
Compares the current integer with the given one.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::ATanOp > atan(const Real &i)
Returns the arctangent of the given floating point number.
Integer & operator%=(Integer &cur, const Integer &i)
Divides cur by the given integer i and stores the remainder in cur.
Returns the tangent of the operand.
expressions::Expression< IntegerContext, expressions::Wrapper< IntegerContext >, expressions::NegOp > operator-(const Integer &a)
Negates the integer.
void shr(Integer &r, const Integer &a, long b)
Shifts a by b bits to the left and stores the result in r.
Returns the logarithm of the absolute value of the Gamma function evaluated of the operand together w...
Returns the tangent of the operand. Uses the context stored in the operator.
Returns the square root of the operand. Uses the context stored in the operator.
Returns the arcus tangent of the operand.
void do_assign(typename Context::Type &x, const Op &op, const Data &data)
Performs the assignment of the expression to x.
Returns the sine of the operand. Uses the context stored in the operator.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::TanOp > tan(const Real &i)
Returns the tangent of the given floating point number.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::GammaOp > gamma(const Real &i)
Returns the Gamma function evaluated at the given floating point number.
Returns the arcus cosine of the operand.
Returns the negative of the operand.
Returns the sine of the operand.
Integer & operator*=(Integer &cur, const Integer &i)
Multiplies the given integer i with cur.
Integer operator--(Integer &cur, int)
Decrements the integer by one and returns the previous value.
expressions::Expression< IntegerContext, expressions::Wrapper< IntegerContext >, expressions::AbsOp > abs(const Integer &i)
Computes and returns the absolute value of i.
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::ShLOp > operator<<(const Integer &a, const Integer &b)
Computes the bitwise left shift of the first integer by the number of bits given by the second intege...
Returns the square root of the operand.
Returns the arcus cosine of the operand. Uses the context stored in the operator. ...
Returns the arcus sine of the operand.
Returns the logarithm to base 2 of the operand.
expressions::Expression< RealContext, std::pair< expressions::Wrapper< RealContext >, expressions::Wrapper< RealContext > >, expressions::ATan2Op > atan2(const Real &y, const Real &x)
Returns the arctangent of , using the signs of x and y to determine the quadrant. ...
bool operator<=(const Integer &a, const Integer &b)
Compares the current integer with the given one.
Integer & operator-=(Integer &cur, const expressions::Expression< IntegerContext, D, expressions::MulOp > &E)
Subtracts the multiplication expression E from cur.
Returns the exponential of the operand. Uses the context stored in the operator.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::Log2Op > log2(const Real &i)
Returns the base-2 logarithm evaluated at the given floating point number.
Returns the operand multiplied by 2 to the power of a constant.
void mul(Integer &r, const Integer &a, const Integer &b)
Multiplies a with b and stores the result in r.
void div(Integer &r, const Integer &a, const Integer &b)
Divides a by b and stores the result in r.
Returns the natural logarithm of the operand. Uses the context stored in the operator.
Returns the quotient of the operands.
const Data & data() const
Allows to access the expression's data.
Returns the arcus tangent of the quotient of the operands.
Returns the absolute value of the operand. Uses the context stored in the operator.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::LogOp > log(const Real &i)
Returns the natural logarithm evaluated at the given floating point number.
void mod(Integer &r, const Integer &a, const Integer &b)
Takes the remainder of the division of a by b and stores it in r.
void increment(Integer &r, const Integer &a)
Increments a by one and stores the result in r.
bool operator==(const Integer &a, const Integer &b)
Compares the current integer with the given one for equality.
Integer & operator/=(Integer &cur, const Integer &i)
Divides cur by the given integer i.
Returns the cosine of the operand. Uses the context stored in the operator.
Returns the square of the operand. Uses the context stored in the operator.
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::MulOp > operator*(const Integer &a, const Integer &b)
Multiplies the two integers and returns the result.
Returns the arcus tangent of the quotient of the operands. Uses the context stored in the operator...
Returns the logarithm of the absolute value of the Gamma function evaluated of the operand together w...
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::PowerOp > power(const Integer &a, const Integer &b)
Computes and returns a raised to the power of b.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::SinOp > sin(const Real &i)
Returns the sine of the given floating point number.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::ASinOp > asin(const Real &i)
Returns the arcsine of the given floating point number.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::Log10Op > log10(const Real &i)
Returns the base-10 logarithm evaluated at the given floating point number.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::ACosOp > acos(const Real &i)
Returns the arccosine of the given floating point number.
Returns the product of the operands.
Represents an arbitrary precision floating point value.
int sign(const Integer &) PLLL_INTERNAL_NOTHROW_POSTFIX_INLINE
Returns the sign of the given integer.
Returns the natural logarithm of the operand.
Returns the logarithm to base 10 of the operand. Uses the context stored in the operator.
Integer operator++(Integer &cur, int)
Increments the integer by one and returns the previous value.
bool operator>(const Integer &a, const Integer &b)
Compares the current integer with the given one.
void shl(Integer &r, const Integer &a, long b)
Shifts a by b bits to the left and stores the result in r.
Returns the Gamma function evaluated of the operand. Uses the context stored in the operator...
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::CosOp > cos(const Real &i)
Returns the cosine of the given floating point number.
Returns the cosine of the operand.
Returns the logarithm of the absolute value of the Gamma function evaluated of the operand...
Returns the logarithm to base 2 of the operand. Uses the context stored in the operator.
Returns the remainder of the operands.
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::ShROp > operator>>(const Integer &a, const Integer &b)
Computes the bitwise right shift of the first integer by the number of bits given by the second integ...
Represents an arithmetic context for arbitrary precision floating point values.
Returns the power of the first operand to the second operand.
Returns the exponential of the operand.
void addmul(Integer &r, const Integer &a, const Integer &b)
Multiplies a and b and adds the result to r.
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::ModOp > operator%(const Integer &a, const Integer &b)
Divides the first by the second integer and returns the remainder.
Integer & operator>>=(Integer &cur, const Integer &i)
Computes the bitwise right shift of cur by i bits, and stores the result in cur.
Returns the Gamma function evaluated of the operand.
void add(Integer &r, const Integer &a, const Integer &b)
Adds a and b and stores the result in r.
Returns the logarithm to base 10 of the operand.
Returns the power of the first operand to the second operand. Uses the context stored in the operator...
Implementation of raising to a power by a constant exponent.
expressions::Expression< IntegerContext, expressions::Wrapper< IntegerContext >, expressions::SquareOp > square(const Integer &i)
Computes and returns the square of i.
Returns the logarithm of the absolute value of the Gamma function evaluated of the operand...
void decrement(Integer &r, const Integer &a)
Decrements a by one and stores the result in r.
Returns the absolute value of the operand.
Returns the square of the operand.
Returns the arcus sine of the operand. Uses the context stored in the operator.
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::AddOp > operator+(const Integer &a, const Integer &b)
Adds the two integers and returns the result.
expressions::Expression< IntegerContext, std::pair< expressions::Wrapper< IntegerContext >, expressions::Wrapper< IntegerContext > >, expressions::DivOp > operator/(const Integer &a, const Integer &b)
Divides the first by the second integer and returns the result.
Represents an arbitrary precision integer.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::SqrtOp > sqrt(const Real &i)
Returns the square root of the given floating point number.
Returns the first operand divided by 2 to the power of the second operand.
expressions::Expression< RealContext, expressions::Wrapper< RealContext >, expressions::LGammaOp > lgamma(const Real &i)
Returns the natural logarithm of the absolute value of the Gamma function evaluated at the given floa...
Returns the arcus tangent of the operand. Uses the context stored in the operator.
bool operator!=(const Integer &a, const Integer &b)
Compares the current integer with the given one for inequality.
Wraps a variable to behave similarly to an Expression<> object.
Returns the difference of the operands.
bool operator>=(const Integer &a, const Integer &b)
Compares the current integer with the given one.
Returns the first operand multiplied by 2 to the power of the second operand.
void sub(Integer &r, const Integer &a, const Integer &b)
Subtracts b from a and stores the result in r.