]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/bits/valarray_after.h
Update Copyright years for files modified in 2011 and/or 2012.
[thirdparty/gcc.git] / libstdc++-v3 / include / bits / valarray_after.h
CommitLineData
1d487aca 1// The template and inlines for the -*- C++ -*- internal _Meta class.
2
6bc9506f 3// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
71e45bc2 4// 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
1d487aca 5//
6// This file is part of the GNU ISO C++ Library. This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
6bc9506f 9// Free Software Foundation; either version 3, or (at your option)
1d487aca 10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16
6bc9506f 17// Under Section 7 of GPL version 3, you are granted additional
18// permissions described in the GCC Runtime Library Exception, version
19// 3.1, as published by the Free Software Foundation.
1d487aca 20
6bc9506f 21// You should have received a copy of the GNU General Public License and
22// a copy of the GCC Runtime Library Exception along with this program;
23// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24// <http://www.gnu.org/licenses/>.
1d487aca 25
5846aeac 26/** @file bits/valarray_after.h
7a472ef1 27 * This is an internal header file, included by other library headers.
5846aeac 28 * Do not attempt to use it directly. @headername{valarray}
7a472ef1 29 */
30
944beac5 31// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
32
5a64d8cf 33#ifndef _VALARRAY_AFTER_H
34#define _VALARRAY_AFTER_H 1
1d487aca 35
cd319190 36#pragma GCC system_header
37
2948dd21 38namespace std _GLIBCXX_VISIBILITY(default)
39{
40_GLIBCXX_BEGIN_NAMESPACE_VERSION
1069247d 41
7558da41 42 //
43 // gslice_array closure.
44 //
45 template<class _Dom>
46 class _GBase
47 {
1d487aca 48 public:
7558da41 49 typedef typename _Dom::value_type value_type;
50
51 _GBase (const _Dom& __e, const valarray<size_t>& __i)
52 : _M_expr (__e), _M_index(__i) {}
53
54 value_type
55 operator[] (size_t __i) const
56 { return _M_expr[_M_index[__i]]; }
57
58 size_t
59 size () const
60 { return _M_index.size(); }
bae9b8af 61
1d487aca 62 private:
7558da41 63 const _Dom& _M_expr;
64 const valarray<size_t>& _M_index;
1d487aca 65 };
bae9b8af 66
7558da41 67 template<typename _Tp>
68 class _GBase<_Array<_Tp> >
69 {
1d487aca 70 public:
7558da41 71 typedef _Tp value_type;
72
73 _GBase (_Array<_Tp> __a, const valarray<size_t>& __i)
74 : _M_array (__a), _M_index(__i) {}
75
76 value_type
77 operator[] (size_t __i) const
78 { return _M_array._M_data[_M_index[__i]]; }
79
80 size_t
81 size () const
82 { return _M_index.size(); }
bae9b8af 83
1d487aca 84 private:
7558da41 85 const _Array<_Tp> _M_array;
86 const valarray<size_t>& _M_index;
1d487aca 87 };
88
7558da41 89 template<class _Dom>
90 struct _GClos<_Expr, _Dom>
91 : _GBase<_Dom>
92 {
93 typedef _GBase<_Dom> _Base;
94 typedef typename _Base::value_type value_type;
95
96 _GClos (const _Dom& __e, const valarray<size_t>& __i)
97 : _Base (__e, __i) {}
1d487aca 98 };
99
7558da41 100 template<typename _Tp>
101 struct _GClos<_ValArray, _Tp>
102 : _GBase<_Array<_Tp> >
103 {
104 typedef _GBase<_Array<_Tp> > _Base;
105 typedef typename _Base::value_type value_type;
106
107 _GClos (_Array<_Tp> __a, const valarray<size_t>& __i)
108 : _Base (__a, __i) {}
1d487aca 109 };
110
7558da41 111 //
112 // indirect_array closure
113 //
114 template<class _Dom>
115 class _IBase
116 {
1d487aca 117 public:
7558da41 118 typedef typename _Dom::value_type value_type;
1d487aca 119
7558da41 120 _IBase (const _Dom& __e, const valarray<size_t>& __i)
121 : _M_expr (__e), _M_index (__i) {}
122
123 value_type
124 operator[] (size_t __i) const
125 { return _M_expr[_M_index[__i]]; }
126
95e89c24 127 size_t
128 size() const
129 { return _M_index.size(); }
bae9b8af 130
1d487aca 131 private:
7558da41 132 const _Dom& _M_expr;
133 const valarray<size_t>& _M_index;
1d487aca 134 };
135
7558da41 136 template<class _Dom>
137 struct _IClos<_Expr, _Dom>
138 : _IBase<_Dom>
139 {
140 typedef _IBase<_Dom> _Base;
141 typedef typename _Base::value_type value_type;
142
143 _IClos (const _Dom& __e, const valarray<size_t>& __i)
144 : _Base (__e, __i) {}
1d487aca 145 };
146
7558da41 147 template<typename _Tp>
148 struct _IClos<_ValArray, _Tp>
149 : _IBase<valarray<_Tp> >
150 {
151 typedef _IBase<valarray<_Tp> > _Base;
152 typedef _Tp value_type;
153
154 _IClos (const valarray<_Tp>& __a, const valarray<size_t>& __i)
155 : _Base (__a, __i) {}
1d487aca 156 };
7558da41 157
179fefb5 158 //
159 // class _Expr
bae9b8af 160 //
161 template<class _Clos, typename _Tp>
179fefb5 162 class _Expr
163 {
1d487aca 164 public:
179fefb5 165 typedef _Tp value_type;
bae9b8af 166
179fefb5 167 _Expr(const _Clos&);
bae9b8af 168
179fefb5 169 const _Clos& operator()() const;
bae9b8af 170
179fefb5 171 value_type operator[](size_t) const;
172 valarray<value_type> operator[](slice) const;
173 valarray<value_type> operator[](const gslice&) const;
174 valarray<value_type> operator[](const valarray<bool>&) const;
175 valarray<value_type> operator[](const valarray<size_t>&) const;
bae9b8af 176
7558da41 177 _Expr<_UnClos<__unary_plus, std::_Expr, _Clos>, value_type>
178 operator+() const;
1d487aca 179
7558da41 180 _Expr<_UnClos<__negate, std::_Expr, _Clos>, value_type>
181 operator-() const;
1d487aca 182
7558da41 183 _Expr<_UnClos<__bitwise_not, std::_Expr, _Clos>, value_type>
184 operator~() const;
1d487aca 185
7558da41 186 _Expr<_UnClos<__logical_not, std::_Expr, _Clos>, bool>
187 operator!() const;
1d487aca 188
179fefb5 189 size_t size() const;
190 value_type sum() const;
bae9b8af 191
179fefb5 192 valarray<value_type> shift(int) const;
193 valarray<value_type> cshift(int) const;
1d487aca 194
195 value_type min() const;
196 value_type max() const;
197
179fefb5 198 valarray<value_type> apply(value_type (*)(const value_type&)) const;
199 valarray<value_type> apply(value_type (*)(value_type)) const;
bae9b8af 200
1d487aca 201 private:
179fefb5 202 const _Clos _M_closure;
1d487aca 203 };
bae9b8af 204
179fefb5 205 template<class _Clos, typename _Tp>
1d487aca 206 inline
7558da41 207 _Expr<_Clos, _Tp>::_Expr(const _Clos& __c) : _M_closure(__c) {}
bae9b8af 208
179fefb5 209 template<class _Clos, typename _Tp>
1d487aca 210 inline const _Clos&
7558da41 211 _Expr<_Clos, _Tp>::operator()() const
1d487aca 212 { return _M_closure; }
213
179fefb5 214 template<class _Clos, typename _Tp>
1d487aca 215 inline _Tp
7558da41 216 _Expr<_Clos, _Tp>::operator[](size_t __i) const
1d487aca 217 { return _M_closure[__i]; }
218
179fefb5 219 template<class _Clos, typename _Tp>
1d487aca 220 inline valarray<_Tp>
7558da41 221 _Expr<_Clos, _Tp>::operator[](slice __s) const
0911e38f 222 {
223 valarray<_Tp> __v = valarray<_Tp>(*this)[__s];
224 return __v;
225 }
bae9b8af 226
179fefb5 227 template<class _Clos, typename _Tp>
1d487aca 228 inline valarray<_Tp>
7558da41 229 _Expr<_Clos, _Tp>::operator[](const gslice& __gs) const
0911e38f 230 {
231 valarray<_Tp> __v = valarray<_Tp>(*this)[__gs];
232 return __v;
233 }
bae9b8af 234
179fefb5 235 template<class _Clos, typename _Tp>
1d487aca 236 inline valarray<_Tp>
7558da41 237 _Expr<_Clos, _Tp>::operator[](const valarray<bool>& __m) const
0911e38f 238 {
239 valarray<_Tp> __v = valarray<_Tp>(*this)[__m];
240 return __v;
241 }
bae9b8af 242
179fefb5 243 template<class _Clos, typename _Tp>
1d487aca 244 inline valarray<_Tp>
7558da41 245 _Expr<_Clos, _Tp>::operator[](const valarray<size_t>& __i) const
0911e38f 246 {
247 valarray<_Tp> __v = valarray<_Tp>(*this)[__i];
248 return __v;
249 }
bae9b8af 250
179fefb5 251 template<class _Clos, typename _Tp>
1d487aca 252 inline size_t
7558da41 253 _Expr<_Clos, _Tp>::size() const
0911e38f 254 { return _M_closure.size(); }
1d487aca 255
256 template<class _Clos, typename _Tp>
179fefb5 257 inline valarray<_Tp>
258 _Expr<_Clos, _Tp>::shift(int __n) const
0911e38f 259 {
260 valarray<_Tp> __v = valarray<_Tp>(*this).shift(__n);
261 return __v;
262 }
1d487aca 263
264 template<class _Clos, typename _Tp>
179fefb5 265 inline valarray<_Tp>
266 _Expr<_Clos, _Tp>::cshift(int __n) const
0911e38f 267 {
268 valarray<_Tp> __v = valarray<_Tp>(*this).cshift(__n);
269 return __v;
270 }
1d487aca 271
272 template<class _Clos, typename _Tp>
179fefb5 273 inline valarray<_Tp>
274 _Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const
0911e38f 275 {
276 valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f);
277 return __v;
278 }
bae9b8af 279
1d487aca 280 template<class _Clos, typename _Tp>
179fefb5 281 inline valarray<_Tp>
282 _Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const
0911e38f 283 {
284 valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f);
285 return __v;
286 }
1d487aca 287
179fefb5 288 // XXX: replace this with a more robust summation algorithm.
289 template<class _Clos, typename _Tp>
1d487aca 290 inline _Tp
7558da41 291 _Expr<_Clos, _Tp>::sum() const
1d487aca 292 {
179fefb5 293 size_t __n = _M_closure.size();
bae9b8af 294 if (__n == 0)
179fefb5 295 return _Tp();
bae9b8af 296 else
179fefb5 297 {
298 _Tp __s = _M_closure[--__n];
299 while (__n != 0)
300 __s += _M_closure[--__n];
301 return __s;
1d487aca 302 }
303 }
304
305 template<class _Clos, typename _Tp>
179fefb5 306 inline _Tp
307 _Expr<_Clos, _Tp>::min() const
308 { return __valarray_min(_M_closure); }
1d487aca 309
310 template<class _Clos, typename _Tp>
179fefb5 311 inline _Tp
312 _Expr<_Clos, _Tp>::max() const
313 { return __valarray_max(_M_closure); }
bae9b8af 314
179fefb5 315 template<class _Dom, typename _Tp>
7558da41 316 inline _Expr<_UnClos<__logical_not, _Expr, _Dom>, bool>
317 _Expr<_Dom, _Tp>::operator!() const
1d487aca 318 {
7558da41 319 typedef _UnClos<__logical_not, std::_Expr, _Dom> _Closure;
5680197c 320 return _Expr<_Closure, bool>(_Closure(this->_M_closure));
1d487aca 321 }
322
acff9fb3 323#define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name) \
324 template<class _Dom, typename _Tp> \
7558da41 325 inline _Expr<_UnClos<_Name, std::_Expr, _Dom>, _Tp> \
326 _Expr<_Dom, _Tp>::operator _Op() const \
acff9fb3 327 { \
7558da41 328 typedef _UnClos<_Name, std::_Expr, _Dom> _Closure; \
329 return _Expr<_Closure, _Tp>(_Closure(this->_M_closure)); \
acff9fb3 330 }
1d487aca 331
179fefb5 332 _DEFINE_EXPR_UNARY_OPERATOR(+, __unary_plus)
333 _DEFINE_EXPR_UNARY_OPERATOR(-, __negate)
334 _DEFINE_EXPR_UNARY_OPERATOR(~, __bitwise_not)
1d487aca 335
336#undef _DEFINE_EXPR_UNARY_OPERATOR
337
1d487aca 338#define _DEFINE_EXPR_BINARY_OPERATOR(_Op, _Name) \
acff9fb3 339 template<class _Dom1, class _Dom2> \
7558da41 340 inline _Expr<_BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2>, \
341 typename __fun<_Name, typename _Dom1::value_type>::result_type> \
342 operator _Op(const _Expr<_Dom1, typename _Dom1::value_type>& __v, \
343 const _Expr<_Dom2, typename _Dom2::value_type>& __w) \
344 { \
345 typedef typename _Dom1::value_type _Arg; \
346 typedef typename __fun<_Name, _Arg>::result_type _Value; \
347 typedef _BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2> _Closure; \
348 return _Expr<_Closure, _Value>(_Closure(__v(), __w())); \
349 } \
1d487aca 350 \
7558da41 351 template<class _Dom> \
352 inline _Expr<_BinClos<_Name, _Expr, _Constant, _Dom, \
353 typename _Dom::value_type>, \
354 typename __fun<_Name, typename _Dom::value_type>::result_type> \
355 operator _Op(const _Expr<_Dom, typename _Dom::value_type>& __v, \
356 const typename _Dom::value_type& __t) \
357 { \
358 typedef typename _Dom::value_type _Arg; \
359 typedef typename __fun<_Name, _Arg>::result_type _Value; \
360 typedef _BinClos<_Name, _Expr, _Constant, _Dom, _Arg> _Closure; \
361 return _Expr<_Closure, _Value>(_Closure(__v(), __t)); \
362 } \
1d487aca 363 \
7558da41 364 template<class _Dom> \
365 inline _Expr<_BinClos<_Name, _Constant, _Expr, \
366 typename _Dom::value_type, _Dom>, \
367 typename __fun<_Name, typename _Dom::value_type>::result_type> \
368 operator _Op(const typename _Dom::value_type& __t, \
369 const _Expr<_Dom, typename _Dom::value_type>& __v) \
370 { \
371 typedef typename _Dom::value_type _Arg; \
372 typedef typename __fun<_Name, _Arg>::result_type _Value; \
373 typedef _BinClos<_Name, _Constant, _Expr, _Arg, _Dom> _Closure; \
374 return _Expr<_Closure, _Value>(_Closure(__t, __v())); \
375 } \
1d487aca 376 \
7558da41 377 template<class _Dom> \
378 inline _Expr<_BinClos<_Name, _Expr, _ValArray, \
379 _Dom, typename _Dom::value_type>, \
380 typename __fun<_Name, typename _Dom::value_type>::result_type> \
381 operator _Op(const _Expr<_Dom,typename _Dom::value_type>& __e, \
382 const valarray<typename _Dom::value_type>& __v) \
383 { \
384 typedef typename _Dom::value_type _Arg; \
385 typedef typename __fun<_Name, _Arg>::result_type _Value; \
386 typedef _BinClos<_Name, _Expr, _ValArray, _Dom, _Arg> _Closure; \
387 return _Expr<_Closure, _Value>(_Closure(__e(), __v)); \
388 } \
1d487aca 389 \
7558da41 390 template<class _Dom> \
391 inline _Expr<_BinClos<_Name, _ValArray, _Expr, \
392 typename _Dom::value_type, _Dom>, \
393 typename __fun<_Name, typename _Dom::value_type>::result_type> \
394 operator _Op(const valarray<typename _Dom::value_type>& __v, \
395 const _Expr<_Dom, typename _Dom::value_type>& __e) \
396 { \
397 typedef typename _Dom::value_type _Tp; \
398 typedef typename __fun<_Name, _Tp>::result_type _Value; \
399 typedef _BinClos<_Name, _ValArray, _Expr, _Tp, _Dom> _Closure; \
400 return _Expr<_Closure, _Value>(_Closure(__v, __e ())); \
401 }
1d487aca 402
acff9fb3 403 _DEFINE_EXPR_BINARY_OPERATOR(+, __plus)
404 _DEFINE_EXPR_BINARY_OPERATOR(-, __minus)
405 _DEFINE_EXPR_BINARY_OPERATOR(*, __multiplies)
406 _DEFINE_EXPR_BINARY_OPERATOR(/, __divides)
407 _DEFINE_EXPR_BINARY_OPERATOR(%, __modulus)
408 _DEFINE_EXPR_BINARY_OPERATOR(^, __bitwise_xor)
409 _DEFINE_EXPR_BINARY_OPERATOR(&, __bitwise_and)
410 _DEFINE_EXPR_BINARY_OPERATOR(|, __bitwise_or)
411 _DEFINE_EXPR_BINARY_OPERATOR(<<, __shift_left)
412 _DEFINE_EXPR_BINARY_OPERATOR(>>, __shift_right)
413 _DEFINE_EXPR_BINARY_OPERATOR(&&, __logical_and)
414 _DEFINE_EXPR_BINARY_OPERATOR(||, __logical_or)
415 _DEFINE_EXPR_BINARY_OPERATOR(==, __equal_to)
416 _DEFINE_EXPR_BINARY_OPERATOR(!=, __not_equal_to)
417 _DEFINE_EXPR_BINARY_OPERATOR(<, __less)
418 _DEFINE_EXPR_BINARY_OPERATOR(>, __greater)
419 _DEFINE_EXPR_BINARY_OPERATOR(<=, __less_equal)
420 _DEFINE_EXPR_BINARY_OPERATOR(>=, __greater_equal)
1d487aca 421
422#undef _DEFINE_EXPR_BINARY_OPERATOR
1d487aca 423
c58969ac 424#define _DEFINE_EXPR_UNARY_FUNCTION(_Name, _UName) \
acff9fb3 425 template<class _Dom> \
c58969ac 426 inline _Expr<_UnClos<_UName, _Expr, _Dom>, \
7558da41 427 typename _Dom::value_type> \
428 _Name(const _Expr<_Dom, typename _Dom::value_type>& __e) \
acff9fb3 429 { \
430 typedef typename _Dom::value_type _Tp; \
c58969ac 431 typedef _UnClos<_UName, _Expr, _Dom> _Closure; \
7558da41 432 return _Expr<_Closure, _Tp>(_Closure(__e())); \
acff9fb3 433 } \
434 \
435 template<typename _Tp> \
c58969ac 436 inline _Expr<_UnClos<_UName, _ValArray, _Tp>, _Tp> \
acff9fb3 437 _Name(const valarray<_Tp>& __v) \
438 { \
c58969ac 439 typedef _UnClos<_UName, _ValArray, _Tp> _Closure; \
7558da41 440 return _Expr<_Closure, _Tp>(_Closure(__v)); \
acff9fb3 441 }
1d487aca 442
c58969ac 443 _DEFINE_EXPR_UNARY_FUNCTION(abs, _Abs)
444 _DEFINE_EXPR_UNARY_FUNCTION(cos, _Cos)
445 _DEFINE_EXPR_UNARY_FUNCTION(acos, _Acos)
446 _DEFINE_EXPR_UNARY_FUNCTION(cosh, _Cosh)
447 _DEFINE_EXPR_UNARY_FUNCTION(sin, _Sin)
448 _DEFINE_EXPR_UNARY_FUNCTION(asin, _Asin)
449 _DEFINE_EXPR_UNARY_FUNCTION(sinh, _Sinh)
450 _DEFINE_EXPR_UNARY_FUNCTION(tan, _Tan)
451 _DEFINE_EXPR_UNARY_FUNCTION(tanh, _Tanh)
452 _DEFINE_EXPR_UNARY_FUNCTION(atan, _Atan)
453 _DEFINE_EXPR_UNARY_FUNCTION(exp, _Exp)
454 _DEFINE_EXPR_UNARY_FUNCTION(log, _Log)
455 _DEFINE_EXPR_UNARY_FUNCTION(log10, _Log10)
456 _DEFINE_EXPR_UNARY_FUNCTION(sqrt, _Sqrt)
1d487aca 457
458#undef _DEFINE_EXPR_UNARY_FUNCTION
459
c58969ac 460#define _DEFINE_EXPR_BINARY_FUNCTION(_Fun, _UFun) \
acff9fb3 461 template<class _Dom1, class _Dom2> \
c58969ac 462 inline _Expr<_BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2>, \
acff9fb3 463 typename _Dom1::value_type> \
7558da41 464 _Fun(const _Expr<_Dom1, typename _Dom1::value_type>& __e1, \
c58969ac 465 const _Expr<_Dom2, typename _Dom2::value_type>& __e2) \
acff9fb3 466 { \
467 typedef typename _Dom1::value_type _Tp; \
c58969ac 468 typedef _BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2> _Closure; \
7558da41 469 return _Expr<_Closure, _Tp>(_Closure(__e1(), __e2())); \
acff9fb3 470 } \
471 \
472 template<class _Dom> \
c58969ac 473 inline _Expr<_BinClos<_UFun, _Expr, _ValArray, _Dom, \
acff9fb3 474 typename _Dom::value_type>, \
475 typename _Dom::value_type> \
7558da41 476 _Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \
acff9fb3 477 const valarray<typename _Dom::value_type>& __v) \
478 { \
479 typedef typename _Dom::value_type _Tp; \
c58969ac 480 typedef _BinClos<_UFun, _Expr, _ValArray, _Dom, _Tp> _Closure; \
7558da41 481 return _Expr<_Closure, _Tp>(_Closure(__e(), __v)); \
acff9fb3 482 } \
483 \
484 template<class _Dom> \
c58969ac 485 inline _Expr<_BinClos<_UFun, _ValArray, _Expr, \
7558da41 486 typename _Dom::value_type, _Dom>, \
acff9fb3 487 typename _Dom::value_type> \
488 _Fun(const valarray<typename _Dom::valarray>& __v, \
7558da41 489 const _Expr<_Dom, typename _Dom::value_type>& __e) \
acff9fb3 490 { \
491 typedef typename _Dom::value_type _Tp; \
c58969ac 492 typedef _BinClos<_UFun, _ValArray, _Expr, _Tp, _Dom> _Closure; \
7558da41 493 return _Expr<_Closure, _Tp>(_Closure(__v, __e())); \
acff9fb3 494 } \
495 \
496 template<class _Dom> \
c58969ac 497 inline _Expr<_BinClos<_UFun, _Expr, _Constant, _Dom, \
acff9fb3 498 typename _Dom::value_type>, \
499 typename _Dom::value_type> \
500 _Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \
501 const typename _Dom::value_type& __t) \
502 { \
503 typedef typename _Dom::value_type _Tp; \
c58969ac 504 typedef _BinClos<_UFun, _Expr, _Constant, _Dom, _Tp> _Closure; \
7558da41 505 return _Expr<_Closure, _Tp>(_Closure(__e(), __t)); \
acff9fb3 506 } \
507 \
508 template<class _Dom> \
c58969ac 509 inline _Expr<_BinClos<_UFun, _Constant, _Expr, \
7558da41 510 typename _Dom::value_type, _Dom>, \
acff9fb3 511 typename _Dom::value_type> \
512 _Fun(const typename _Dom::value_type& __t, \
7558da41 513 const _Expr<_Dom, typename _Dom::value_type>& __e) \
acff9fb3 514 { \
515 typedef typename _Dom::value_type _Tp; \
c58969ac 516 typedef _BinClos<_UFun, _Constant, _Expr, _Tp, _Dom> _Closure; \
7558da41 517 return _Expr<_Closure, _Tp>(_Closure(__t, __e())); \
acff9fb3 518 } \
519 \
520 template<typename _Tp> \
c58969ac 521 inline _Expr<_BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp>, _Tp> \
acff9fb3 522 _Fun(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \
523 { \
c58969ac 524 typedef _BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp> _Closure;\
7558da41 525 return _Expr<_Closure, _Tp>(_Closure(__v, __w)); \
acff9fb3 526 } \
527 \
528 template<typename _Tp> \
c58969ac 529 inline _Expr<_BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp>, _Tp> \
acff9fb3 530 _Fun(const valarray<_Tp>& __v, const _Tp& __t) \
531 { \
c58969ac 532 typedef _BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp> _Closure;\
7558da41 533 return _Expr<_Closure, _Tp>(_Closure(__v, __t)); \
acff9fb3 534 } \
535 \
536 template<typename _Tp> \
c58969ac 537 inline _Expr<_BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp>, _Tp> \
acff9fb3 538 _Fun(const _Tp& __t, const valarray<_Tp>& __v) \
539 { \
c58969ac 540 typedef _BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp> _Closure;\
7558da41 541 return _Expr<_Closure, _Tp>(_Closure(__t, __v)); \
acff9fb3 542 }
1d487aca 543
c58969ac 544_DEFINE_EXPR_BINARY_FUNCTION(atan2, _Atan2)
545_DEFINE_EXPR_BINARY_FUNCTION(pow, _Pow)
1d487aca 546
547#undef _DEFINE_EXPR_BINARY_FUNCTION
548
2948dd21 549_GLIBCXX_END_NAMESPACE_VERSION
550} // namespace
1d487aca 551
6afba1a2 552#endif /* _CPP_VALARRAY_AFTER_H */