]>
Commit | Line | Data |
---|---|---|
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 | 38 | namespace 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 */ |