libstdc++
|
00001 // The template and inlines for the -*- C++ -*- internal _Meta class. 00002 00003 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 00004 // 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. 00005 // 00006 // This file is part of the GNU ISO C++ Library. This library is free 00007 // software; you can redistribute it and/or modify it under the 00008 // terms of the GNU General Public License as published by the 00009 // Free Software Foundation; either version 3, or (at your option) 00010 // any later version. 00011 00012 // This library is distributed in the hope that it will be useful, 00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 // GNU General Public License for more details. 00016 00017 // Under Section 7 of GPL version 3, you are granted additional 00018 // permissions described in the GCC Runtime Library Exception, version 00019 // 3.1, as published by the Free Software Foundation. 00020 00021 // You should have received a copy of the GNU General Public License and 00022 // a copy of the GCC Runtime Library Exception along with this program; 00023 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00024 // <http://www.gnu.org/licenses/>. 00025 00026 /** @file bits/valarray_after.h 00027 * This is an internal header file, included by other library headers. 00028 * Do not attempt to use it directly. @headername{valarray} 00029 */ 00030 00031 // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr> 00032 00033 #ifndef _VALARRAY_AFTER_H 00034 #define _VALARRAY_AFTER_H 1 00035 00036 #pragma GCC system_header 00037 00038 namespace std _GLIBCXX_VISIBILITY(default) 00039 { 00040 _GLIBCXX_BEGIN_NAMESPACE_VERSION 00041 00042 // 00043 // gslice_array closure. 00044 // 00045 template<class _Dom> 00046 class _GBase 00047 { 00048 public: 00049 typedef typename _Dom::value_type value_type; 00050 00051 _GBase (const _Dom& __e, const valarray<size_t>& __i) 00052 : _M_expr (__e), _M_index(__i) {} 00053 00054 value_type 00055 operator[] (size_t __i) const 00056 { return _M_expr[_M_index[__i]]; } 00057 00058 size_t 00059 size () const 00060 { return _M_index.size(); } 00061 00062 private: 00063 const _Dom& _M_expr; 00064 const valarray<size_t>& _M_index; 00065 }; 00066 00067 template<typename _Tp> 00068 class _GBase<_Array<_Tp> > 00069 { 00070 public: 00071 typedef _Tp value_type; 00072 00073 _GBase (_Array<_Tp> __a, const valarray<size_t>& __i) 00074 : _M_array (__a), _M_index(__i) {} 00075 00076 value_type 00077 operator[] (size_t __i) const 00078 { return _M_array._M_data[_M_index[__i]]; } 00079 00080 size_t 00081 size () const 00082 { return _M_index.size(); } 00083 00084 private: 00085 const _Array<_Tp> _M_array; 00086 const valarray<size_t>& _M_index; 00087 }; 00088 00089 template<class _Dom> 00090 struct _GClos<_Expr, _Dom> 00091 : _GBase<_Dom> 00092 { 00093 typedef _GBase<_Dom> _Base; 00094 typedef typename _Base::value_type value_type; 00095 00096 _GClos (const _Dom& __e, const valarray<size_t>& __i) 00097 : _Base (__e, __i) {} 00098 }; 00099 00100 template<typename _Tp> 00101 struct _GClos<_ValArray, _Tp> 00102 : _GBase<_Array<_Tp> > 00103 { 00104 typedef _GBase<_Array<_Tp> > _Base; 00105 typedef typename _Base::value_type value_type; 00106 00107 _GClos (_Array<_Tp> __a, const valarray<size_t>& __i) 00108 : _Base (__a, __i) {} 00109 }; 00110 00111 // 00112 // indirect_array closure 00113 // 00114 template<class _Dom> 00115 class _IBase 00116 { 00117 public: 00118 typedef typename _Dom::value_type value_type; 00119 00120 _IBase (const _Dom& __e, const valarray<size_t>& __i) 00121 : _M_expr (__e), _M_index (__i) {} 00122 00123 value_type 00124 operator[] (size_t __i) const 00125 { return _M_expr[_M_index[__i]]; } 00126 00127 size_t 00128 size() const 00129 { return _M_index.size(); } 00130 00131 private: 00132 const _Dom& _M_expr; 00133 const valarray<size_t>& _M_index; 00134 }; 00135 00136 template<class _Dom> 00137 struct _IClos<_Expr, _Dom> 00138 : _IBase<_Dom> 00139 { 00140 typedef _IBase<_Dom> _Base; 00141 typedef typename _Base::value_type value_type; 00142 00143 _IClos (const _Dom& __e, const valarray<size_t>& __i) 00144 : _Base (__e, __i) {} 00145 }; 00146 00147 template<typename _Tp> 00148 struct _IClos<_ValArray, _Tp> 00149 : _IBase<valarray<_Tp> > 00150 { 00151 typedef _IBase<valarray<_Tp> > _Base; 00152 typedef _Tp value_type; 00153 00154 _IClos (const valarray<_Tp>& __a, const valarray<size_t>& __i) 00155 : _Base (__a, __i) {} 00156 }; 00157 00158 // 00159 // class _Expr 00160 // 00161 template<class _Clos, typename _Tp> 00162 class _Expr 00163 { 00164 public: 00165 typedef _Tp value_type; 00166 00167 _Expr(const _Clos&); 00168 00169 const _Clos& operator()() const; 00170 00171 value_type operator[](size_t) const; 00172 valarray<value_type> operator[](slice) const; 00173 valarray<value_type> operator[](const gslice&) const; 00174 valarray<value_type> operator[](const valarray<bool>&) const; 00175 valarray<value_type> operator[](const valarray<size_t>&) const; 00176 00177 _Expr<_UnClos<__unary_plus, std::_Expr, _Clos>, value_type> 00178 operator+() const; 00179 00180 _Expr<_UnClos<__negate, std::_Expr, _Clos>, value_type> 00181 operator-() const; 00182 00183 _Expr<_UnClos<__bitwise_not, std::_Expr, _Clos>, value_type> 00184 operator~() const; 00185 00186 _Expr<_UnClos<__logical_not, std::_Expr, _Clos>, bool> 00187 operator!() const; 00188 00189 size_t size() const; 00190 value_type sum() const; 00191 00192 valarray<value_type> shift(int) const; 00193 valarray<value_type> cshift(int) const; 00194 00195 value_type min() const; 00196 value_type max() const; 00197 00198 valarray<value_type> apply(value_type (*)(const value_type&)) const; 00199 valarray<value_type> apply(value_type (*)(value_type)) const; 00200 00201 private: 00202 const _Clos _M_closure; 00203 }; 00204 00205 template<class _Clos, typename _Tp> 00206 inline 00207 _Expr<_Clos, _Tp>::_Expr(const _Clos& __c) : _M_closure(__c) {} 00208 00209 template<class _Clos, typename _Tp> 00210 inline const _Clos& 00211 _Expr<_Clos, _Tp>::operator()() const 00212 { return _M_closure; } 00213 00214 template<class _Clos, typename _Tp> 00215 inline _Tp 00216 _Expr<_Clos, _Tp>::operator[](size_t __i) const 00217 { return _M_closure[__i]; } 00218 00219 template<class _Clos, typename _Tp> 00220 inline valarray<_Tp> 00221 _Expr<_Clos, _Tp>::operator[](slice __s) const 00222 { 00223 valarray<_Tp> __v = valarray<_Tp>(*this)[__s]; 00224 return __v; 00225 } 00226 00227 template<class _Clos, typename _Tp> 00228 inline valarray<_Tp> 00229 _Expr<_Clos, _Tp>::operator[](const gslice& __gs) const 00230 { 00231 valarray<_Tp> __v = valarray<_Tp>(*this)[__gs]; 00232 return __v; 00233 } 00234 00235 template<class _Clos, typename _Tp> 00236 inline valarray<_Tp> 00237 _Expr<_Clos, _Tp>::operator[](const valarray<bool>& __m) const 00238 { 00239 valarray<_Tp> __v = valarray<_Tp>(*this)[__m]; 00240 return __v; 00241 } 00242 00243 template<class _Clos, typename _Tp> 00244 inline valarray<_Tp> 00245 _Expr<_Clos, _Tp>::operator[](const valarray<size_t>& __i) const 00246 { 00247 valarray<_Tp> __v = valarray<_Tp>(*this)[__i]; 00248 return __v; 00249 } 00250 00251 template<class _Clos, typename _Tp> 00252 inline size_t 00253 _Expr<_Clos, _Tp>::size() const 00254 { return _M_closure.size(); } 00255 00256 template<class _Clos, typename _Tp> 00257 inline valarray<_Tp> 00258 _Expr<_Clos, _Tp>::shift(int __n) const 00259 { 00260 valarray<_Tp> __v = valarray<_Tp>(*this).shift(__n); 00261 return __v; 00262 } 00263 00264 template<class _Clos, typename _Tp> 00265 inline valarray<_Tp> 00266 _Expr<_Clos, _Tp>::cshift(int __n) const 00267 { 00268 valarray<_Tp> __v = valarray<_Tp>(*this).cshift(__n); 00269 return __v; 00270 } 00271 00272 template<class _Clos, typename _Tp> 00273 inline valarray<_Tp> 00274 _Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const 00275 { 00276 valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f); 00277 return __v; 00278 } 00279 00280 template<class _Clos, typename _Tp> 00281 inline valarray<_Tp> 00282 _Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const 00283 { 00284 valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f); 00285 return __v; 00286 } 00287 00288 // XXX: replace this with a more robust summation algorithm. 00289 template<class _Clos, typename _Tp> 00290 inline _Tp 00291 _Expr<_Clos, _Tp>::sum() const 00292 { 00293 size_t __n = _M_closure.size(); 00294 if (__n == 0) 00295 return _Tp(); 00296 else 00297 { 00298 _Tp __s = _M_closure[--__n]; 00299 while (__n != 0) 00300 __s += _M_closure[--__n]; 00301 return __s; 00302 } 00303 } 00304 00305 template<class _Clos, typename _Tp> 00306 inline _Tp 00307 _Expr<_Clos, _Tp>::min() const 00308 { return __valarray_min(_M_closure); } 00309 00310 template<class _Clos, typename _Tp> 00311 inline _Tp 00312 _Expr<_Clos, _Tp>::max() const 00313 { return __valarray_max(_M_closure); } 00314 00315 template<class _Dom, typename _Tp> 00316 inline _Expr<_UnClos<__logical_not, _Expr, _Dom>, bool> 00317 _Expr<_Dom, _Tp>::operator!() const 00318 { 00319 typedef _UnClos<__logical_not, std::_Expr, _Dom> _Closure; 00320 return _Expr<_Closure, bool>(_Closure(this->_M_closure)); 00321 } 00322 00323 #define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name) \ 00324 template<class _Dom, typename _Tp> \ 00325 inline _Expr<_UnClos<_Name, std::_Expr, _Dom>, _Tp> \ 00326 _Expr<_Dom, _Tp>::operator _Op() const \ 00327 { \ 00328 typedef _UnClos<_Name, std::_Expr, _Dom> _Closure; \ 00329 return _Expr<_Closure, _Tp>(_Closure(this->_M_closure)); \ 00330 } 00331 00332 _DEFINE_EXPR_UNARY_OPERATOR(+, __unary_plus) 00333 _DEFINE_EXPR_UNARY_OPERATOR(-, __negate) 00334 _DEFINE_EXPR_UNARY_OPERATOR(~, __bitwise_not) 00335 00336 #undef _DEFINE_EXPR_UNARY_OPERATOR 00337 00338 #define _DEFINE_EXPR_BINARY_OPERATOR(_Op, _Name) \ 00339 template<class _Dom1, class _Dom2> \ 00340 inline _Expr<_BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2>, \ 00341 typename __fun<_Name, typename _Dom1::value_type>::result_type> \ 00342 operator _Op(const _Expr<_Dom1, typename _Dom1::value_type>& __v, \ 00343 const _Expr<_Dom2, typename _Dom2::value_type>& __w) \ 00344 { \ 00345 typedef typename _Dom1::value_type _Arg; \ 00346 typedef typename __fun<_Name, _Arg>::result_type _Value; \ 00347 typedef _BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2> _Closure; \ 00348 return _Expr<_Closure, _Value>(_Closure(__v(), __w())); \ 00349 } \ 00350 \ 00351 template<class _Dom> \ 00352 inline _Expr<_BinClos<_Name, _Expr, _Constant, _Dom, \ 00353 typename _Dom::value_type>, \ 00354 typename __fun<_Name, typename _Dom::value_type>::result_type> \ 00355 operator _Op(const _Expr<_Dom, typename _Dom::value_type>& __v, \ 00356 const typename _Dom::value_type& __t) \ 00357 { \ 00358 typedef typename _Dom::value_type _Arg; \ 00359 typedef typename __fun<_Name, _Arg>::result_type _Value; \ 00360 typedef _BinClos<_Name, _Expr, _Constant, _Dom, _Arg> _Closure; \ 00361 return _Expr<_Closure, _Value>(_Closure(__v(), __t)); \ 00362 } \ 00363 \ 00364 template<class _Dom> \ 00365 inline _Expr<_BinClos<_Name, _Constant, _Expr, \ 00366 typename _Dom::value_type, _Dom>, \ 00367 typename __fun<_Name, typename _Dom::value_type>::result_type> \ 00368 operator _Op(const typename _Dom::value_type& __t, \ 00369 const _Expr<_Dom, typename _Dom::value_type>& __v) \ 00370 { \ 00371 typedef typename _Dom::value_type _Arg; \ 00372 typedef typename __fun<_Name, _Arg>::result_type _Value; \ 00373 typedef _BinClos<_Name, _Constant, _Expr, _Arg, _Dom> _Closure; \ 00374 return _Expr<_Closure, _Value>(_Closure(__t, __v())); \ 00375 } \ 00376 \ 00377 template<class _Dom> \ 00378 inline _Expr<_BinClos<_Name, _Expr, _ValArray, \ 00379 _Dom, typename _Dom::value_type>, \ 00380 typename __fun<_Name, typename _Dom::value_type>::result_type> \ 00381 operator _Op(const _Expr<_Dom,typename _Dom::value_type>& __e, \ 00382 const valarray<typename _Dom::value_type>& __v) \ 00383 { \ 00384 typedef typename _Dom::value_type _Arg; \ 00385 typedef typename __fun<_Name, _Arg>::result_type _Value; \ 00386 typedef _BinClos<_Name, _Expr, _ValArray, _Dom, _Arg> _Closure; \ 00387 return _Expr<_Closure, _Value>(_Closure(__e(), __v)); \ 00388 } \ 00389 \ 00390 template<class _Dom> \ 00391 inline _Expr<_BinClos<_Name, _ValArray, _Expr, \ 00392 typename _Dom::value_type, _Dom>, \ 00393 typename __fun<_Name, typename _Dom::value_type>::result_type> \ 00394 operator _Op(const valarray<typename _Dom::value_type>& __v, \ 00395 const _Expr<_Dom, typename _Dom::value_type>& __e) \ 00396 { \ 00397 typedef typename _Dom::value_type _Tp; \ 00398 typedef typename __fun<_Name, _Tp>::result_type _Value; \ 00399 typedef _BinClos<_Name, _ValArray, _Expr, _Tp, _Dom> _Closure; \ 00400 return _Expr<_Closure, _Value>(_Closure(__v, __e ())); \ 00401 } 00402 00403 _DEFINE_EXPR_BINARY_OPERATOR(+, __plus) 00404 _DEFINE_EXPR_BINARY_OPERATOR(-, __minus) 00405 _DEFINE_EXPR_BINARY_OPERATOR(*, __multiplies) 00406 _DEFINE_EXPR_BINARY_OPERATOR(/, __divides) 00407 _DEFINE_EXPR_BINARY_OPERATOR(%, __modulus) 00408 _DEFINE_EXPR_BINARY_OPERATOR(^, __bitwise_xor) 00409 _DEFINE_EXPR_BINARY_OPERATOR(&, __bitwise_and) 00410 _DEFINE_EXPR_BINARY_OPERATOR(|, __bitwise_or) 00411 _DEFINE_EXPR_BINARY_OPERATOR(<<, __shift_left) 00412 _DEFINE_EXPR_BINARY_OPERATOR(>>, __shift_right) 00413 _DEFINE_EXPR_BINARY_OPERATOR(&&, __logical_and) 00414 _DEFINE_EXPR_BINARY_OPERATOR(||, __logical_or) 00415 _DEFINE_EXPR_BINARY_OPERATOR(==, __equal_to) 00416 _DEFINE_EXPR_BINARY_OPERATOR(!=, __not_equal_to) 00417 _DEFINE_EXPR_BINARY_OPERATOR(<, __less) 00418 _DEFINE_EXPR_BINARY_OPERATOR(>, __greater) 00419 _DEFINE_EXPR_BINARY_OPERATOR(<=, __less_equal) 00420 _DEFINE_EXPR_BINARY_OPERATOR(>=, __greater_equal) 00421 00422 #undef _DEFINE_EXPR_BINARY_OPERATOR 00423 00424 #define _DEFINE_EXPR_UNARY_FUNCTION(_Name, _UName) \ 00425 template<class _Dom> \ 00426 inline _Expr<_UnClos<_UName, _Expr, _Dom>, \ 00427 typename _Dom::value_type> \ 00428 _Name(const _Expr<_Dom, typename _Dom::value_type>& __e) \ 00429 { \ 00430 typedef typename _Dom::value_type _Tp; \ 00431 typedef _UnClos<_UName, _Expr, _Dom> _Closure; \ 00432 return _Expr<_Closure, _Tp>(_Closure(__e())); \ 00433 } \ 00434 \ 00435 template<typename _Tp> \ 00436 inline _Expr<_UnClos<_UName, _ValArray, _Tp>, _Tp> \ 00437 _Name(const valarray<_Tp>& __v) \ 00438 { \ 00439 typedef _UnClos<_UName, _ValArray, _Tp> _Closure; \ 00440 return _Expr<_Closure, _Tp>(_Closure(__v)); \ 00441 } 00442 00443 _DEFINE_EXPR_UNARY_FUNCTION(abs, _Abs) 00444 _DEFINE_EXPR_UNARY_FUNCTION(cos, _Cos) 00445 _DEFINE_EXPR_UNARY_FUNCTION(acos, _Acos) 00446 _DEFINE_EXPR_UNARY_FUNCTION(cosh, _Cosh) 00447 _DEFINE_EXPR_UNARY_FUNCTION(sin, _Sin) 00448 _DEFINE_EXPR_UNARY_FUNCTION(asin, _Asin) 00449 _DEFINE_EXPR_UNARY_FUNCTION(sinh, _Sinh) 00450 _DEFINE_EXPR_UNARY_FUNCTION(tan, _Tan) 00451 _DEFINE_EXPR_UNARY_FUNCTION(tanh, _Tanh) 00452 _DEFINE_EXPR_UNARY_FUNCTION(atan, _Atan) 00453 _DEFINE_EXPR_UNARY_FUNCTION(exp, _Exp) 00454 _DEFINE_EXPR_UNARY_FUNCTION(log, _Log) 00455 _DEFINE_EXPR_UNARY_FUNCTION(log10, _Log10) 00456 _DEFINE_EXPR_UNARY_FUNCTION(sqrt, _Sqrt) 00457 00458 #undef _DEFINE_EXPR_UNARY_FUNCTION 00459 00460 #define _DEFINE_EXPR_BINARY_FUNCTION(_Fun, _UFun) \ 00461 template<class _Dom1, class _Dom2> \ 00462 inline _Expr<_BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2>, \ 00463 typename _Dom1::value_type> \ 00464 _Fun(const _Expr<_Dom1, typename _Dom1::value_type>& __e1, \ 00465 const _Expr<_Dom2, typename _Dom2::value_type>& __e2) \ 00466 { \ 00467 typedef typename _Dom1::value_type _Tp; \ 00468 typedef _BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2> _Closure; \ 00469 return _Expr<_Closure, _Tp>(_Closure(__e1(), __e2())); \ 00470 } \ 00471 \ 00472 template<class _Dom> \ 00473 inline _Expr<_BinClos<_UFun, _Expr, _ValArray, _Dom, \ 00474 typename _Dom::value_type>, \ 00475 typename _Dom::value_type> \ 00476 _Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \ 00477 const valarray<typename _Dom::value_type>& __v) \ 00478 { \ 00479 typedef typename _Dom::value_type _Tp; \ 00480 typedef _BinClos<_UFun, _Expr, _ValArray, _Dom, _Tp> _Closure; \ 00481 return _Expr<_Closure, _Tp>(_Closure(__e(), __v)); \ 00482 } \ 00483 \ 00484 template<class _Dom> \ 00485 inline _Expr<_BinClos<_UFun, _ValArray, _Expr, \ 00486 typename _Dom::value_type, _Dom>, \ 00487 typename _Dom::value_type> \ 00488 _Fun(const valarray<typename _Dom::valarray>& __v, \ 00489 const _Expr<_Dom, typename _Dom::value_type>& __e) \ 00490 { \ 00491 typedef typename _Dom::value_type _Tp; \ 00492 typedef _BinClos<_UFun, _ValArray, _Expr, _Tp, _Dom> _Closure; \ 00493 return _Expr<_Closure, _Tp>(_Closure(__v, __e())); \ 00494 } \ 00495 \ 00496 template<class _Dom> \ 00497 inline _Expr<_BinClos<_UFun, _Expr, _Constant, _Dom, \ 00498 typename _Dom::value_type>, \ 00499 typename _Dom::value_type> \ 00500 _Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \ 00501 const typename _Dom::value_type& __t) \ 00502 { \ 00503 typedef typename _Dom::value_type _Tp; \ 00504 typedef _BinClos<_UFun, _Expr, _Constant, _Dom, _Tp> _Closure; \ 00505 return _Expr<_Closure, _Tp>(_Closure(__e(), __t)); \ 00506 } \ 00507 \ 00508 template<class _Dom> \ 00509 inline _Expr<_BinClos<_UFun, _Constant, _Expr, \ 00510 typename _Dom::value_type, _Dom>, \ 00511 typename _Dom::value_type> \ 00512 _Fun(const typename _Dom::value_type& __t, \ 00513 const _Expr<_Dom, typename _Dom::value_type>& __e) \ 00514 { \ 00515 typedef typename _Dom::value_type _Tp; \ 00516 typedef _BinClos<_UFun, _Constant, _Expr, _Tp, _Dom> _Closure; \ 00517 return _Expr<_Closure, _Tp>(_Closure(__t, __e())); \ 00518 } \ 00519 \ 00520 template<typename _Tp> \ 00521 inline _Expr<_BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp>, _Tp> \ 00522 _Fun(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \ 00523 { \ 00524 typedef _BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp> _Closure;\ 00525 return _Expr<_Closure, _Tp>(_Closure(__v, __w)); \ 00526 } \ 00527 \ 00528 template<typename _Tp> \ 00529 inline _Expr<_BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp>, _Tp> \ 00530 _Fun(const valarray<_Tp>& __v, const _Tp& __t) \ 00531 { \ 00532 typedef _BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp> _Closure;\ 00533 return _Expr<_Closure, _Tp>(_Closure(__v, __t)); \ 00534 } \ 00535 \ 00536 template<typename _Tp> \ 00537 inline _Expr<_BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp>, _Tp> \ 00538 _Fun(const _Tp& __t, const valarray<_Tp>& __v) \ 00539 { \ 00540 typedef _BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp> _Closure;\ 00541 return _Expr<_Closure, _Tp>(_Closure(__t, __v)); \ 00542 } 00543 00544 _DEFINE_EXPR_BINARY_FUNCTION(atan2, _Atan2) 00545 _DEFINE_EXPR_BINARY_FUNCTION(pow, _Pow) 00546 00547 #undef _DEFINE_EXPR_BINARY_FUNCTION 00548 00549 _GLIBCXX_END_NAMESPACE_VERSION 00550 } // namespace 00551 00552 #endif /* _CPP_VALARRAY_AFTER_H */