00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00038 #ifndef _VALARRAY_BEFORE_H
00039 #define _VALARRAY_BEFORE_H 1
00040 
00041 #pragma GCC system_header
00042 
00043 #include <bits/slice_array.h>
00044 
00045 namespace std
00046 {
00047   
00048   
00049   
00050   
00051   
00052   
00053   
00054   
00055 
00056   
00057   template<typename _Tp1, typename _Tp2> class _Constant;
00058 
00059   
00060   
00061   
00062   
00063   
00064   
00065   
00066 
00067   struct __abs
00068   {
00069     template<typename _Tp>
00070       _Tp operator()(const _Tp& __t) const
00071       { return abs(__t); }
00072   };
00073 
00074   struct __cos
00075   {
00076     template<typename _Tp>
00077       _Tp operator()(const _Tp& __t) const
00078       { return cos(__t); }
00079   };
00080 
00081   struct __acos
00082   {
00083     template<typename _Tp>
00084       _Tp operator()(const _Tp& __t) const
00085       { return acos(__t); }
00086   };
00087 
00088   struct __cosh
00089   {
00090     template<typename _Tp>
00091       _Tp operator()(const _Tp& __t) const
00092       { return cosh(__t); }
00093   };
00094 
00095   struct __sin
00096   {
00097     template<typename _Tp>
00098       _Tp operator()(const _Tp& __t) const
00099       { return sin(__t); }
00100   };
00101 
00102   struct __asin
00103   {
00104     template<typename _Tp>
00105       _Tp operator()(const _Tp& __t) const
00106       { return asin(__t); }
00107   };
00108 
00109   struct __sinh
00110   {
00111     template<typename _Tp>
00112       _Tp operator()(const _Tp& __t) const
00113       { return sinh(__t); }
00114   };
00115 
00116   struct __tan
00117   {
00118     template<typename _Tp>
00119       _Tp operator()(const _Tp& __t) const
00120       { return tan(__t); }
00121   };
00122 
00123   struct __atan
00124   {
00125     template<typename _Tp>
00126       _Tp operator()(const _Tp& __t) const
00127       { return atan(__t); }
00128   };
00129 
00130   struct __tanh
00131   {
00132     template<typename _Tp>
00133       _Tp operator()(const _Tp& __t) const
00134       { return tanh(__t); }
00135   };
00136 
00137   struct __exp
00138   {
00139     template<typename _Tp>
00140       _Tp operator()(const _Tp& __t) const
00141       { return exp(__t); }
00142   };
00143 
00144   struct __log
00145   {
00146     template<typename _Tp>
00147       _Tp operator()(const _Tp& __t) const
00148       { return log(__t); }
00149   };
00150 
00151   struct __log10
00152   {
00153     template<typename _Tp>
00154       _Tp operator()(const _Tp& __t) const
00155       { return log10(__t); }
00156   };
00157 
00158   struct __sqrt
00159   {
00160     template<typename _Tp>
00161       _Tp operator()(const _Tp& __t) const
00162       { return sqrt(__t); }
00163   };
00164 
00165   
00166   
00167   
00168 
00169   struct __unary_plus
00170   {
00171     template<typename _Tp>
00172       _Tp operator()(const _Tp& __t) const
00173       { return +__t; }
00174   };
00175 
00176   struct __negate
00177   {
00178     template<typename _Tp>
00179       _Tp operator()(const _Tp& __t) const
00180       { return -__t; }
00181   };
00182 
00183   struct __bitwise_not
00184   {
00185     template<typename _Tp>
00186       _Tp operator()(const _Tp& __t) const
00187       { return ~__t; }
00188   };
00189 
00190   struct __plus
00191   {
00192     template<typename _Tp>
00193       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00194       { return __x + __y; }
00195   };
00196 
00197   struct __minus
00198   {
00199     template<typename _Tp>
00200       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00201       { return __x - __y; }
00202   };
00203 
00204   struct __multiplies
00205   {
00206     template<typename _Tp>
00207       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00208       { return __x * __y; }
00209   };
00210 
00211   struct __divides
00212   {
00213     template<typename _Tp>
00214       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00215       { return __x / __y; }
00216   };
00217 
00218   struct __modulus
00219   {
00220     template<typename _Tp>
00221       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00222       { return __x % __y; }
00223   };
00224 
00225   struct __bitwise_xor
00226   {
00227     template<typename _Tp>
00228       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00229       { return __x ^ __y; }
00230   };
00231 
00232   struct __bitwise_and
00233   {
00234     template<typename _Tp>
00235       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00236       { return __x & __y; }
00237   };
00238 
00239   struct __bitwise_or
00240   {
00241     template<typename _Tp>
00242       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00243       { return __x | __y; }
00244   };
00245 
00246   struct __shift_left
00247   {
00248     template<typename _Tp>
00249       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00250       { return __x << __y; }
00251   };
00252 
00253   struct __shift_right
00254   {
00255     template<typename _Tp>
00256       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00257       { return __x >> __y; }
00258   };
00259 
00260   struct __logical_and
00261   {
00262     template<typename _Tp>
00263       bool operator()(const _Tp& __x, const _Tp& __y) const
00264       { return __x && __y; }
00265   };
00266 
00267   struct __logical_or
00268   {
00269     template<typename _Tp>
00270       bool operator()(const _Tp& __x, const _Tp& __y) const
00271       { return __x || __y; }
00272   };
00273 
00274   struct __logical_not
00275   {
00276     template<typename _Tp>
00277       bool operator()(const _Tp& __x) const { return !__x; }
00278   };
00279 
00280   struct __equal_to
00281   {
00282     template<typename _Tp>
00283       bool operator()(const _Tp& __x, const _Tp& __y) const
00284       { return __x == __y; }
00285   };
00286 
00287   struct __not_equal_to
00288   {
00289     template<typename _Tp>
00290       bool operator()(const _Tp& __x, const _Tp& __y) const
00291       { return __x != __y; }
00292   };
00293 
00294   struct __less
00295   {
00296     template<typename _Tp>
00297       bool operator()(const _Tp& __x, const _Tp& __y) const
00298       { return __x < __y; }
00299   };
00300 
00301   struct __greater
00302   {
00303     template<typename _Tp>
00304       bool operator()(const _Tp& __x, const _Tp& __y) const
00305       { return __x > __y; }
00306   };
00307 
00308   struct __less_equal
00309   {
00310     template<typename _Tp>
00311       bool operator()(const _Tp& __x, const _Tp& __y) const
00312       { return __x <= __y; }
00313   };
00314 
00315   struct __greater_equal
00316   {
00317     template<typename _Tp>
00318       bool operator()(const _Tp& __x, const _Tp& __y) const
00319       { return __x >= __y; }
00320   };
00321 
00322   
00323   struct __atan2
00324   {
00325     template<typename _Tp>
00326       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00327       { return atan2(__x, __y); }
00328   };
00329 
00330   struct __pow
00331   {
00332     template<typename _Tp>
00333       _Tp operator()(const _Tp& __x, const _Tp& __y) const
00334       { return pow(__x, __y); }
00335   };
00336 
00337 
00338   
00339   
00340   
00341   template<typename, typename _Tp>
00342     struct __fun
00343     {
00344       typedef _Tp result_type;
00345     };
00346 
00347   
00348   template<typename _Tp>
00349     struct __fun<__logical_not, _Tp>
00350     {
00351       typedef bool result_type;
00352     };
00353 
00354   template<typename _Tp>
00355     struct __fun<__logical_and, _Tp>
00356     {
00357       typedef bool result_type;
00358     };
00359 
00360   template<typename _Tp>
00361     struct __fun<__logical_or, _Tp>
00362     {
00363       typedef bool result_type;
00364     };
00365 
00366   template<typename _Tp>
00367     struct __fun<__less, _Tp>
00368     {
00369       typedef bool result_type;
00370     };
00371 
00372   template<typename _Tp>
00373     struct __fun<__greater, _Tp>
00374     {
00375       typedef bool result_type;
00376     };
00377 
00378   template<typename _Tp>
00379     struct __fun<__less_equal, _Tp>
00380     {
00381       typedef bool result_type;
00382     };
00383 
00384   template<typename _Tp>
00385     struct __fun<__greater_equal, _Tp>
00386     {
00387       typedef bool result_type;
00388     };
00389 
00390   template<typename _Tp>
00391     struct __fun<__equal_to, _Tp>
00392     {
00393       typedef bool result_type;
00394     };
00395 
00396   template<typename _Tp>
00397     struct __fun<__not_equal_to, _Tp>
00398     {
00399       typedef bool result_type;
00400     };
00401 
00402   
00403   
00404   
00405 
00406   template<typename _Dom, typename _Arg>
00407     class _FunBase
00408     {
00409     public:
00410       typedef typename _Dom::value_type value_type;
00411 
00412       _FunBase(const _Dom& __e, value_type __f(_Arg))
00413       : _M_expr(__e), _M_func(__f) {}
00414 
00415       value_type operator[](size_t __i) const
00416       { return _M_func (_M_expr[__i]); }
00417 
00418       size_t size() const { return _M_expr.size ();}
00419 
00420     private:
00421       const _Dom& _M_expr;
00422       value_type (*_M_func)(_Arg);
00423     };
00424 
00425   template<class _Dom>
00426     struct _ValFunClos<_Expr,_Dom> : _FunBase<_Dom, typename _Dom::value_type>
00427     {
00428       typedef _FunBase<_Dom, typename _Dom::value_type> _Base;
00429       typedef typename _Base::value_type value_type;
00430       typedef value_type _Tp;
00431 
00432       _ValFunClos(const _Dom& __e, _Tp __f(_Tp)) : _Base(__e, __f) {}
00433     };
00434 
00435   template<typename _Tp>
00436     struct _ValFunClos<_ValArray,_Tp> : _FunBase<valarray<_Tp>, _Tp>
00437     {
00438       typedef _FunBase<valarray<_Tp>, _Tp> _Base;
00439       typedef _Tp value_type;
00440 
00441       _ValFunClos(const valarray<_Tp>& __v, _Tp __f(_Tp)) : _Base(__v, __f) {}
00442     };
00443 
00444   template<class _Dom>
00445     struct _RefFunClos<_Expr, _Dom>
00446     : _FunBase<_Dom, const typename _Dom::value_type&>
00447     {
00448       typedef _FunBase<_Dom, const typename _Dom::value_type&> _Base;
00449       typedef typename _Base::value_type value_type;
00450       typedef value_type _Tp;
00451 
00452       _RefFunClos(const _Dom& __e, _Tp __f(const _Tp&))
00453       : _Base(__e, __f) {}
00454     };
00455 
00456   template<typename _Tp>
00457     struct _RefFunClos<_ValArray, _Tp>
00458     : _FunBase<valarray<_Tp>, const _Tp&>
00459     {
00460       typedef _FunBase<valarray<_Tp>, const _Tp&> _Base;
00461       typedef _Tp value_type;
00462 
00463       _RefFunClos(const valarray<_Tp>& __v, _Tp __f(const _Tp&))
00464       : _Base(__v, __f) {}
00465     };
00466 
00467   
00468   
00469   
00470 
00471   template<class _Oper, class _Arg>
00472     class _UnBase
00473     {
00474     public:
00475       typedef typename _Arg::value_type _Vt;
00476       typedef typename __fun<_Oper, _Vt>::result_type value_type;
00477 
00478       _UnBase(const _Arg& __e) : _M_expr(__e) {}
00479 
00480       value_type operator[](size_t __i) const
00481       { return _Oper()(_M_expr[__i]); }
00482 
00483       size_t size() const { return _M_expr.size(); }
00484       
00485     private:
00486       const _Arg& _M_expr;
00487     };
00488 
00489   template<class _Oper, class _Dom>
00490     struct _UnClos<_Oper, _Expr, _Dom>
00491     : _UnBase<_Oper, _Dom>
00492     {
00493       typedef _Dom _Arg;
00494       typedef _UnBase<_Oper, _Dom> _Base;
00495       typedef typename _Base::value_type value_type;
00496 
00497       _UnClos(const _Arg& __e) : _Base(__e) {}
00498     };
00499 
00500   template<class _Oper, typename _Tp>
00501     struct _UnClos<_Oper, _ValArray, _Tp>
00502     : _UnBase<_Oper, valarray<_Tp> >
00503     {
00504       typedef valarray<_Tp> _Arg;
00505       typedef _UnBase<_Oper, valarray<_Tp> > _Base;
00506       typedef typename _Base::value_type value_type;
00507 
00508       _UnClos(const _Arg& __e) : _Base(__e) {}
00509     };
00510 
00511 
00512   
00513   
00514   
00515 
00516   template<class _Oper, class _FirstArg, class _SecondArg>
00517     class _BinBase
00518     {
00519     public:
00520       typedef typename _FirstArg::value_type _Vt;
00521       typedef typename __fun<_Oper, _Vt>::result_type value_type;
00522 
00523       _BinBase(const _FirstArg& __e1, const _SecondArg& __e2)
00524       : _M_expr1(__e1), _M_expr2(__e2) {}
00525 
00526       value_type operator[](size_t __i) const
00527       { return _Oper()(_M_expr1[__i], _M_expr2[__i]); }
00528 
00529       size_t size() const { return _M_expr1.size(); }
00530 
00531     private:
00532       const _FirstArg& _M_expr1;
00533       const _SecondArg& _M_expr2;
00534     };
00535 
00536 
00537   template<class _Oper, class _Clos>
00538     class _BinBase2
00539     {
00540     public:
00541       typedef typename _Clos::value_type _Vt;
00542       typedef typename __fun<_Oper, _Vt>::result_type value_type;
00543 
00544       _BinBase2(const _Clos& __e, const _Vt& __t)
00545       : _M_expr1(__e), _M_expr2(__t) {}
00546 
00547       value_type operator[](size_t __i) const
00548       { return _Oper()(_M_expr1[__i], _M_expr2); }
00549 
00550       size_t size() const { return _M_expr1.size(); }
00551 
00552     private:
00553       const _Clos& _M_expr1;
00554       const _Vt& _M_expr2;
00555     };
00556 
00557   template<class _Oper, class _Clos>
00558     class _BinBase1
00559     {
00560     public:
00561       typedef typename _Clos::value_type _Vt;
00562       typedef typename __fun<_Oper, _Vt>::result_type value_type;
00563 
00564       _BinBase1(const _Vt& __t, const _Clos& __e)
00565       : _M_expr1(__t), _M_expr2(__e) {}
00566 
00567       value_type operator[](size_t __i) const
00568       { return _Oper()(_M_expr1, _M_expr2[__i]); }
00569 
00570       size_t size() const { return _M_expr2.size(); }
00571 
00572     private:
00573       const _Vt& _M_expr1;
00574       const _Clos& _M_expr2;
00575     };
00576 
00577   template<class _Oper, class _Dom1, class _Dom2>
00578     struct _BinClos<_Oper, _Expr, _Expr, _Dom1, _Dom2>
00579     : _BinBase<_Oper, _Dom1, _Dom2>
00580     {
00581       typedef _BinBase<_Oper, _Dom1, _Dom2> _Base;
00582       typedef typename _Base::value_type value_type;
00583 
00584       _BinClos(const _Dom1& __e1, const _Dom2& __e2) : _Base(__e1, __e2) {}
00585     };
00586 
00587   template<class _Oper, typename _Tp>
00588     struct _BinClos<_Oper,_ValArray, _ValArray, _Tp, _Tp>
00589     : _BinBase<_Oper, valarray<_Tp>, valarray<_Tp> >
00590     {
00591       typedef _BinBase<_Oper, valarray<_Tp>, valarray<_Tp> > _Base;
00592       typedef _Tp value_type;
00593 
00594       _BinClos(const valarray<_Tp>& __v, const valarray<_Tp>& __w)
00595       : _Base(__v, __w) {}
00596     };
00597 
00598   template<class _Oper, class _Dom>
00599     struct _BinClos<_Oper, _Expr, _ValArray, _Dom, typename _Dom::value_type>
00600     : _BinBase<_Oper, _Dom, valarray<typename _Dom::value_type> >
00601     {
00602       typedef typename _Dom::value_type _Tp;
00603       typedef _BinBase<_Oper,_Dom,valarray<_Tp> > _Base;
00604       typedef typename _Base::value_type value_type;
00605 
00606       _BinClos(const _Dom& __e1, const valarray<_Tp>& __e2)
00607       : _Base(__e1, __e2) {}
00608     };
00609 
00610   template<class _Oper, class _Dom>
00611     struct _BinClos<_Oper, _ValArray, _Expr, typename _Dom::value_type, _Dom>
00612     : _BinBase<_Oper, valarray<typename _Dom::value_type>,_Dom>
00613     {
00614       typedef typename _Dom::value_type _Tp;
00615       typedef _BinBase<_Oper, valarray<_Tp>, _Dom> _Base;
00616       typedef typename _Base::value_type value_type;
00617 
00618       _BinClos(const valarray<_Tp>& __e1, const _Dom& __e2)
00619       : _Base(__e1, __e2) {}
00620     };
00621 
00622   template<class _Oper, class _Dom>
00623     struct _BinClos<_Oper, _Expr, _Constant, _Dom, typename _Dom::value_type>
00624     : _BinBase2<_Oper, _Dom>
00625     {
00626       typedef typename _Dom::value_type _Tp;
00627       typedef _BinBase2<_Oper,_Dom> _Base;
00628       typedef typename _Base::value_type value_type;
00629 
00630       _BinClos(const _Dom& __e1, const _Tp& __e2) : _Base(__e1, __e2) {}
00631     };
00632 
00633   template<class _Oper, class _Dom>
00634     struct _BinClos<_Oper, _Constant, _Expr, typename _Dom::value_type, _Dom>
00635     : _BinBase1<_Oper, _Dom>
00636     {
00637       typedef typename _Dom::value_type _Tp;
00638       typedef _BinBase1<_Oper, _Dom> _Base;
00639       typedef typename _Base::value_type value_type;
00640 
00641       _BinClos(const _Tp& __e1, const _Dom& __e2) : _Base(__e1, __e2) {}
00642     };
00643 
00644   template<class _Oper, typename _Tp>
00645     struct _BinClos<_Oper, _ValArray, _Constant, _Tp, _Tp>
00646     : _BinBase2<_Oper, valarray<_Tp> >
00647     {
00648       typedef _BinBase2<_Oper,valarray<_Tp> > _Base;
00649       typedef typename _Base::value_type value_type;
00650 
00651       _BinClos(const valarray<_Tp>& __v, const _Tp& __t) : _Base(__v, __t) {}
00652     };
00653 
00654   template<class _Oper, typename _Tp>
00655     struct _BinClos<_Oper, _Constant, _ValArray, _Tp, _Tp>
00656     : _BinBase1<_Oper, valarray<_Tp> >
00657     {
00658       typedef _BinBase1<_Oper, valarray<_Tp> > _Base;
00659       typedef typename _Base::value_type value_type;
00660 
00661       _BinClos(const _Tp& __t, const valarray<_Tp>& __v) : _Base(__t, __v) {}
00662     };
00663 
00664     
00665     
00666     
00667   template<typename _Dom> 
00668     class _SBase
00669     {
00670     public:
00671       typedef typename _Dom::value_type value_type;
00672       
00673       _SBase (const _Dom& __e, const slice& __s)
00674       : _M_expr (__e), _M_slice (__s) {}
00675         
00676       value_type
00677       operator[] (size_t __i) const
00678       { return _M_expr[_M_slice.start () + __i * _M_slice.stride ()]; }
00679         
00680       size_t
00681       size() const
00682       { return _M_slice.size (); }
00683 
00684     private:
00685       const _Dom& _M_expr;
00686       const slice& _M_slice;
00687     };
00688 
00689   template<typename _Tp>
00690     class _SBase<_Array<_Tp> >
00691     {
00692     public:
00693       typedef _Tp value_type;
00694       
00695       _SBase (_Array<_Tp> __a, const slice& __s)
00696       : _M_array (__a._M_data+__s.start()), _M_size (__s.size()),
00697     _M_stride (__s.stride()) {}
00698         
00699       value_type
00700       operator[] (size_t __i) const
00701       { return _M_array._M_data[__i * _M_stride]; }
00702       
00703       size_t
00704       size() const
00705       { return _M_size; }
00706 
00707     private:
00708       const _Array<_Tp> _M_array;
00709       const size_t _M_size;
00710       const size_t _M_stride;
00711     };
00712 
00713   template<class _Dom>
00714     struct _SClos<_Expr, _Dom>
00715     : _SBase<_Dom>
00716     {
00717       typedef _SBase<_Dom> _Base;
00718       typedef typename _Base::value_type value_type;
00719       
00720       _SClos (const _Dom& __e, const slice& __s) : _Base (__e, __s) {}
00721     };
00722 
00723   template<typename _Tp>
00724     struct _SClos<_ValArray, _Tp>
00725     : _SBase<_Array<_Tp> >
00726     {
00727       typedef  _SBase<_Array<_Tp> > _Base;
00728       typedef _Tp value_type;
00729       
00730       _SClos (_Array<_Tp> __a, const slice& __s) : _Base (__a, __s) {}
00731     };
00732 
00733 } 
00734 
00735 #endif 
00736 
00737 
00738 
00739