Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*      Copyright (C) 2004 Garrett A. Kajmowicz
  2.  
  3.         This file is part of the uClibc++ Library.
  4.  
  5.         This library is free software; you can redistribute it and/or
  6.         modify it under the terms of the GNU Lesser General Public
  7.         License as published by the Free Software Foundation; either
  8.         version 2.1 of the License, or (at your option) any later version.
  9.  
  10.         This library is distributed in the hope that it will be useful,
  11.         but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.         Lesser General Public License for more details.
  14.  
  15.         You should have received a copy of the GNU Lesser General Public
  16.         License along with this library; if not, write to the Free Software
  17.         Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. */
  19.  
  20. #include <basic_definitions>
  21.  
  22. #ifndef __HEADER_STD_VALARRAY
  23. #define __HEADER_STD_VALARRAY 1
  24.  
  25. #include <cstddef>
  26. #include <cmath>
  27.  
  28. #pragma GCC visibility push(default)
  29.  
  30. namespace std{
  31.  
  32.         template<class T> class valarray;
  33.         class slice;
  34.         template<class T> class slice_array;
  35.         class gslice;
  36.         template<class T> class gslice_array;
  37.         template<class T> class mask_array;
  38.         template<class T> class indirect_array;
  39.  
  40.         //Actual class definitions
  41.  
  42.  
  43.         class _UCXXEXPORT slice {
  44.         protected:
  45.                 size_t sta;
  46.                 size_t siz;
  47.                 size_t str;
  48.  
  49.         public:
  50.                 slice() : sta(0), siz(0), str(0){  }
  51.                 slice(size_t a, size_t b, size_t c) : sta(a), siz(b), str(c) {  }
  52.                 slice(const slice& s) : sta(s.sta), siz(s.siz), str(s.str) {  }
  53.                 ~slice() {  }
  54.                 size_t start() const{
  55.                         return sta;
  56.                 }
  57.                 size_t size() const{
  58.                         return siz;
  59.                 }
  60.                 size_t stride() const{
  61.                         return str;
  62.                 }
  63.         };
  64.  
  65.  
  66.  
  67.         template<class T> class _UCXXEXPORT valarray {
  68.                 friend class slice_array<T>;
  69.         protected:
  70.                 T * data;
  71.                 size_t length;
  72.  
  73.         public:
  74.                 typedef T value_type;
  75.  
  76.                 valarray() : data(0), length(0) {  }
  77.  
  78.                 explicit valarray(size_t t) : data(0), length(t){
  79.                         data = new T[length];
  80.                 }
  81.  
  82.                 valarray(const T& v, size_t t) : data(0), length(t){
  83.                         data = new T[length];
  84.                         for(size_t i = 0; i < length; ++i){
  85.                                 data[i] = v;
  86.                         }
  87.                 }
  88.                 valarray(const T* p, size_t t) : data(0), length(t) {
  89.                         data = new T[length];
  90.                         for(size_t i = 0; i < length; ++i){
  91.                                 data[i] = p[i];
  92.                         }
  93.                 }
  94.                 valarray(const valarray& v) : data(0), length(v.length){
  95.                         data = new T[length];
  96.                         for(size_t i = 0; i < length; ++i){
  97.                                 data[i] = v.data[i];
  98.                         }
  99.                 }
  100.                 valarray(const slice_array<T> & sa) : data(0), length(sa.s.size()){
  101.                         data = new T[length];
  102.                         for(unsigned int i = 0; i < length; ++i){
  103.                                 data[i] = sa.array->data[sa.s.start() + i * sa.s.stride()];
  104.                         }
  105.                 }
  106.                 valarray(const gslice_array<T>&);
  107.                 valarray(const mask_array<T>&);
  108.                 valarray(const indirect_array<T>&);
  109.                 ~valarray(){
  110.                         delete [] data;
  111.                         data = 0;
  112.                         length = 0;
  113.                 }
  114.  
  115.                 valarray<T>& operator=(const valarray<T>& v){
  116.                         if (length != v.length) { // DR 630
  117.                                 delete [] data;
  118.                                 length = v.length;
  119.                                 data = new T[length];
  120.                         }
  121.                         for (size_t i = 0; i < length; ++i) {
  122.                                 data[i] = v.data[i];
  123.                         }
  124.                         return *this;
  125.                 }
  126.                 valarray<T>& operator=(const T& t){
  127.                         for(size_t i = 0; i < length; ++i){
  128.                                 data[i] = t;
  129.                         }
  130.                         return *this;
  131.                 }
  132.                 valarray<T>& operator=(const slice_array<T>& sa){
  133.                         for(size_t i =0; i < length; ++i){
  134.                                 data[i] = sa.data[sa.s.start() + i * sa.s.stride()];
  135.                         }
  136.                         return *this;
  137.                 }
  138.                 valarray<T>& operator=(const gslice_array<T>&);
  139.                 valarray<T>& operator=(const mask_array<T>&);
  140.                 valarray<T>& operator=(const indirect_array<T>&);
  141.  
  142.                 const T& operator[](size_t t) const{
  143.                         return data[t];
  144.                 }
  145.                 T& operator[](size_t t){
  146.                         return data[t];
  147.                 }
  148.  
  149.                 valarray<T> operator[](slice s) const{
  150.                         valarray<T> retval(s.size());
  151.                         for(unsigned int i = 0; i< s.size(); ++i){
  152.                                 retval.data[i] = data[s.start() + i * s.stride()];
  153.                         }
  154.                         return retval;
  155.                 }
  156.  
  157.                 slice_array<T> operator[](slice sl){
  158.                         slice_array<T> retval;
  159.                         retval.s = sl;
  160.                         retval.array = this;
  161.                         return retval;
  162.                 }
  163.  
  164.                 valarray<T> operator[](const gslice&) const;
  165.                 gslice_array<T> operator[](const gslice&);
  166.                 valarray<T> operator[](const valarray<bool>&) const;
  167.                 mask_array<T> operator[](const valarray<bool>&);
  168.                 valarray<T> operator[](const valarray<size_t>&) const;
  169.                 indirect_array<T> operator[](const valarray<size_t>&);
  170.  
  171.                 valarray<T> operator+() const{
  172.                         valarray<T> retval(length);
  173.                         for(size_t i = 0; i< length ; ++i){
  174.                                 retval.data[i] = +data[i];
  175.                         }
  176.                         return retval;
  177.                 }
  178.                 valarray<T> operator-() const{
  179.                         valarray<T> retval(length);
  180.                         for(size_t i = 0; i< length; ++i){
  181.                                 retval.data[i] = -data[i];
  182.                         }
  183.                         return retval;
  184.                 }
  185.                 valarray<T> operator~() const{
  186.                         valarray<T> retval(length);
  187.                         for(size_t i = 0; i< length ; ++i){
  188.                                 retval.data[i] = ~data[i];
  189.                         }
  190.                         return retval;
  191.                 }
  192.                 valarray<bool> operator!() const{
  193.                         valarray<bool> retval(length);
  194.                         for (size_t i = 0; i < length ; ++i){
  195.                                 retval[i] = !data[i];
  196.                         }
  197.                         return retval;
  198.                 }
  199.                 valarray<T>& operator*= (const T& t){
  200.                         for(size_t i=0;i<length;++i){
  201.                                 data[i] *= t;
  202.                         }
  203.                         return *this;
  204.                 }
  205.                 valarray<T>& operator/= (const T& t){
  206.                         for(size_t i=0;i<length;++i){
  207.                                 data[i] /= t;
  208.                         }
  209.                         return *this;
  210.                 }
  211.                 valarray<T>& operator%= (const T& t){
  212.                         for(size_t i=0;i<length;++i){
  213.                                 data[i] %= t;
  214.                         }
  215.                         return *this;
  216.                 }
  217.                 valarray<T>& operator+= (const T& t){
  218.                         for(size_t i=0;i<length;++i){
  219.                                 data[i] += t;
  220.                         }
  221.                         return *this;
  222.                 }
  223.                 valarray<T>& operator-= (const T& t){
  224.                         for(size_t i=0;i<length;++i){
  225.                                 data[i] -= t;
  226.                         }
  227.                         return *this;
  228.                 }
  229.                 valarray<T>& operator^= (const T& t){
  230.                         for(size_t i=0;i<length;++i){
  231.                                 data[i] ^= t;
  232.                         }
  233.                         return *this;
  234.                 }
  235.                 valarray<T>& operator&= (const T& t){
  236.                         for(size_t i=0;i<length;++i){
  237.                                 data[i] &= t;
  238.                         }
  239.                         return *this;
  240.                 }
  241.                 valarray<T>& operator|= (const T& t){
  242.                         for(size_t i=0;i<length; ++i){
  243.                                 data[i] |= t;
  244.                         }
  245.                         return *this;
  246.                 }
  247.                 valarray<T>& operator<<=(const T& t){
  248.                         for(size_t i=0;i<length;++i){
  249.                                 data[i] <<= t;
  250.                         }
  251.                         return *this;
  252.                 }
  253.                 valarray<T>& operator>>=(const T& t){
  254.                         for(size_t i=0;i<length;++i){
  255.                                 data[i] >>= t;
  256.                         }
  257.                         return *this;
  258.                 }
  259.                 valarray<T>& operator*= (const valarray<T>& a){
  260.                         for(size_t i=0;i<length;++i){
  261.                                 data[i] *= a.data[i];
  262.                         }
  263.                         return *this;
  264.                 }
  265.                 valarray<T>& operator/= (const valarray<T>& a){
  266.                         for(size_t i=0;i<length;++i){
  267.                                 data[i] /= a.data[i];
  268.                         }
  269.                         return *this;
  270.                 }
  271.                 valarray<T>& operator%= (const valarray<T>& a){
  272.                         for(size_t i=0;i<length;++i){
  273.                                 data[i] %= a.data[i];
  274.                         }
  275.                         return *this;
  276.                 }
  277.                 valarray<T>& operator+= (const valarray<T>& a){
  278.                         for(size_t i=0;i<length;++i){
  279.                                 data[i] += a.data[i];
  280.                         }
  281.                         return *this;
  282.                 }
  283.                 valarray<T>& operator-= (const valarray<T>& a){
  284.                         for(size_t i=0;i<length ;++i){
  285.                                 data[i] -= a.data[i];
  286.                         }
  287.                         return *this;
  288.                 }
  289.                 valarray<T>& operator^= (const valarray<T>& a){
  290.                         for(size_t i=0;i<length;++i){
  291.                                 data[i] ^= a.data[i];
  292.                         }
  293.                         return *this;
  294.                 }
  295.                 valarray<T>& operator|= (const valarray<T>& a){
  296.                         for(size_t i=0;i<length ;++i){
  297.                                 data[i] |= a.data[i];
  298.                         }
  299.                         return *this;
  300.                 }
  301.                 valarray<T>& operator&= (const valarray<T>& a){
  302.                         for(size_t i=0;i<length;++i){
  303.                                 data[i] &= a.data[i];
  304.                         }
  305.                         return *this;
  306.                 }
  307.                 valarray<T>& operator<<=(const valarray<T>& a){
  308.                         for(size_t i=0;i<length;++i){
  309.                                 data[i] <<= a.data[i];
  310.                         }
  311.                         return *this;
  312.                 }
  313.                 valarray<T>& operator>>=(const valarray<T>& a){
  314.                         for(size_t i=0;i<length;++i){
  315.                                 data[i] >>= a.data[i];
  316.                         }
  317.                         return *this;
  318.                 }
  319. #if 0
  320.                 void swap(valarray& other) noexcept {
  321.                         std::swap(length, other.length);
  322.                         std::swap(data, other.data);
  323.                 }
  324. #endif
  325.                 size_t size() const{
  326.                         return length;
  327.                 }
  328.  
  329.                 T sum() const{
  330.                         T retval(data[0]);
  331.                         for(size_t i = 1; i< length; ++i){
  332.                                 retval += data[i];
  333.                         }
  334.                         return retval;
  335.                 }
  336.  
  337.                 T min() const{
  338.                         T retval(data[0]);
  339.                         for(size_t i = 1; i< length; ++i){
  340.                                 if(data[i] < retval){
  341.                                         retval = data[i];
  342.                                 }
  343.                         }
  344.                         return retval;
  345.                 }
  346.  
  347.                 T max() const{
  348.                         T retval(data[0]);
  349.                         for(size_t i = 1; i< length; ++i){
  350.                                 if(retval < data[i]){
  351.                                         retval = data[i];
  352.                                 }
  353.                         }
  354.                         return retval;
  355.                 }
  356.  
  357.                 valarray<T> shift (int n) const{
  358.                         valarray<T> retval(length);
  359.                         if (n < 0) {
  360.                                 if (-size_t(n) > length)
  361.                                         n = -int(length);
  362.                         } else {
  363.                                 if (size_t(n) > length)
  364.                                         n = int(length);
  365.                         }
  366.                         for (size_t i = 0; i < length ; ++i) {
  367.                                 if ((n + i) < length)
  368.                                         retval.data[i] = data[n + i];
  369.                         }
  370.                         return retval;
  371.                 }
  372.                 valarray<T> cshift(int n) const{
  373.                         valarray<T> retval(length);
  374.                         if (length == 0)
  375.                                 return retval;
  376.                         if (n < 0) {
  377.                                 if (-size_t(n) > length)
  378.                                         n = -int(-size_t(n) % length);
  379.                                 n = length + n;
  380.                         } else {
  381.                                 if (size_t(n) > length)
  382.                                         n = int(size_t(n) % length);
  383.                         }
  384.                         for (size_t i = 0; i < length ; ++i){
  385.                                 retval.data[i] = data[(n + i) % length];
  386.                         }
  387.                         return retval;
  388.                 }
  389.                 valarray<T> apply(T func(T) ) const{
  390.                         valarray<T> retval(length);
  391.                         for(size_t i = 0; i< length; ++i){
  392.                                 retval.data[i] = func(data[i]);
  393.                         }
  394.                         return retval;
  395.                 }
  396.                 valarray<T> apply(T func(const T&)) const{
  397.                         valarray<T> retval(length);
  398.                         for(size_t i = 0; i< length; ++i){
  399.                                 retval.data[i] = func(data[i]);
  400.                         }
  401.                         return retval;
  402.                 }
  403.                 void resize(size_t sz, T c = T()){
  404.                         delete [] data;
  405.                         data = 0;
  406.                         if(sz > 0){
  407.                                 data = new T[sz];
  408.                                 for(size_t i = 0; i < sz; ++i){
  409.                                         data[i] = c;
  410.                                 }
  411.                         }
  412.                         length = sz;
  413.                 }
  414.         };
  415.  
  416.  
  417.  
  418.         template <class T> class _UCXXEXPORT slice_array {
  419.                 friend class valarray<T>;
  420.         public:
  421.                 typedef T value_type;
  422.  
  423.                 void operator=  (const valarray<T>& v) const{
  424.                         for(unsigned int i = 0; i < s.size(); ++i){
  425.                                 array->data[s.start() + i * s.stride()] = v[i];
  426.                         }
  427.                 }
  428.                 void operator=  (const T & v){
  429.                         for(unsigned int i = 0; i < s.size(); ++i){
  430.                                 array->data[s.start() + i * s.stride()] = v;
  431.                         }
  432.                 }
  433.                 void fill(const T & v){
  434.                         for(unsigned int i = 0; i < s.size(); ++i){
  435.                                 array->data[s.start() + i * s.stride()] = v;
  436.                         }
  437.                 }
  438.                 void operator*= (const valarray<T>& v) const{
  439.                         for(unsigned int i = 0; i < s.size(); ++i){
  440.                                 array->data[s.start() + i * s.stride()] *= v[i];
  441.                         }
  442.                 }
  443.                 void operator/= (const valarray<T>& v) const{
  444.                         for(unsigned int i = 0; i < s.size(); ++i){
  445.                                 array->data[s.start() + i * s.stride()] /= v[i];
  446.                         }
  447.                 }
  448.                 void operator%= (const valarray<T>& v) const{
  449.                         for(unsigned int i = 0; i < s.size(); ++i){
  450.                                 array->data[s.start() + i * s.stride()] %= v[i];
  451.                         }
  452.                 }
  453.                 void operator+= (const valarray<T>& v) const{
  454.                         for(unsigned int i = 0; i < s.size(); ++i){
  455.                                 array->data[s.start() + i * s.stride()] += v[i];
  456.                         }
  457.                 }
  458.                 void operator-= (const valarray<T>& v) const{
  459.                         for(unsigned int i = 0; i < s.size(); ++i){
  460.                                 array->data[s.start() + i * s.stride()] -= v[i];
  461.                         }
  462.                 }
  463.                 void operator^= (const valarray<T>& v) const{
  464.                         for(unsigned int i = 0; i < s.size(); ++i){
  465.                                 array->data[s.start() + i * s.stride()] ^= v[i];
  466.                         }
  467.                 }
  468.                 void operator&= (const valarray<T>& v) const{
  469.                         for(unsigned int i = 0; i < s.size(); ++i){
  470.                                 array->data[s.start() + i * s.stride()] &= v[i];
  471.                         }
  472.                 }
  473.                 void operator|= (const valarray<T>& v) const{
  474.                         for(unsigned int i = 0; i < s.size(); ++i){
  475.                                 array->data[s.start() + i * s.stride()] |= v[i];
  476.                         }
  477.                 }
  478.                 void operator<<=(const valarray<T>& v) const{
  479.                         for(unsigned int i = 0; i < s.size(); ++i){
  480.                                 array->data[s.start() + i * s.stride()] <<= v[i];
  481.                         }
  482.                 }
  483.                 void operator>>=(const valarray<T>& v) const{
  484.                         for(unsigned int i = 0; i < s.size(); ++i){
  485.                                 array->data[s.start() + i * s.stride()] >>= v[i];
  486.                         }
  487.                 }
  488.                 ~slice_array(){
  489.                         array = 0;
  490.                 }
  491.  
  492.         private:
  493.                 slice_array() : array(0){  }
  494.  
  495.         public:
  496.                 slice_array(const slice_array& sa) : array(sa.array), s(sa.s){  }
  497.                 slice_array& operator=(const slice_array& sa){
  498.                         array = sa.array;
  499.                         s = sa.s;
  500.                         return *this;
  501.                 }
  502.  
  503.         private:
  504.                 valarray<T> * array;
  505.                 slice s;
  506.         };
  507.  
  508.  
  509.         class _UCXXEXPORT gslice {
  510.         private:
  511.                 size_t sta;
  512.                 valarray<size_t> siz;
  513.                 valarray<size_t> str;
  514.  
  515.         public:
  516.                 gslice() : sta(0), siz(), str() { } // DR 543
  517.                 gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d)
  518.                         : sta(s), siz(l), str(d) {  }
  519.  
  520.                 size_t start() const{
  521.                         return sta;
  522.                 }
  523.                 valarray<size_t> size() const{
  524.                         return siz;
  525.                 }
  526.                 valarray<size_t> stride() const{
  527.                         return str;
  528.                 }
  529.         };
  530.  
  531.         template <class T> class gslice_array {
  532.         private:
  533.                 friend class valarray<T>;
  534.  
  535.         public:
  536.                 ~gslice_array();
  537.  
  538.                 void operator=(const valarray<T>& array) const;
  539.                 void operator*=(const valarray<T>& array) const;
  540.                 void operator/=(const valarray<T>& array) const;
  541.                 void operator%=(const valarray<T>& array) const;
  542.                 void operator+=(const valarray<T>& array) const;
  543.                 void operator-=(const valarray<T>& array) const;
  544.                 void operator^=(const valarray<T>& array) const;
  545.                 void operator&=(const valarray<T>& array) const;
  546.                 void operator|=(const valarray<T>& array) const;
  547.                 void operator<<=(const valarray<T>& array) const;
  548.                 void operator>>=(const valarray<T>& array) const;
  549.  
  550.                 void operator=(const T&);  
  551.  
  552.         private:
  553.                 gslice_array();
  554.                 gslice_array(const gslice_array<T>&);
  555.                 gslice_array<T>& operator= (const gslice_array<T>& array);
  556.         };
  557.  
  558.  
  559.  
  560.         template<class T> valarray<T> operator* (const valarray<T>& lhs, const valarray<T>& rhs){
  561.                 valarray<T> retval(lhs);
  562.                 retval *= rhs;
  563.                 return retval;
  564.         }
  565.  
  566.         template<class T> valarray<T> operator* (const valarray<T>& lhs, const T& rhs){
  567.                 valarray<T> retval(lhs);
  568.                 retval *= rhs;
  569.                 return retval;
  570.         }
  571.         template<class T> valarray<T> operator* (const T& lhs, const valarray<T>& rhs){
  572.                 valarray<T> retval(rhs);
  573.                 retval *= lhs;
  574.                 return retval;
  575.         }
  576.         template<class T> valarray<T> operator/ (const valarray<T>& lhs, const valarray<T>& rhs){
  577.                 valarray<T> retval(lhs);
  578.                 retval /= rhs;
  579.                 return retval;
  580.         }
  581.         template<class T> valarray<T> operator/ (const valarray<T>& lhs, const T& rhs){
  582.                 valarray<T> retval(lhs);
  583.                 retval /= rhs;
  584.                 return retval;
  585.         }
  586.         template<class T> valarray<T> operator/ (const T& lhs, const valarray<T>& rhs){
  587.                 valarray<T> retval(lhs, rhs.size());
  588.                 retval /= rhs;
  589.                 return retval;
  590.         }
  591.         template<class T> valarray<T> operator% (const valarray<T>& lhs, const valarray<T>& rhs){
  592.                 valarray<T> retval(lhs);
  593.                 retval %= rhs;
  594.                 return retval;
  595.         }
  596.         template<class T> valarray<T> operator% (const valarray<T>& lhs, const T& rhs){
  597.                 valarray<T> retval(lhs);
  598.                 retval %= rhs;
  599.                 return retval;
  600.         }
  601.         template<class T> valarray<T> operator% (const T& lhs, const valarray<T>& rhs){
  602.                 valarray<T> retval(lhs, rhs.size());
  603.                 retval %= rhs;
  604.                 return retval;
  605.         }
  606.         template<class T> valarray<T> operator+ (const valarray<T>& lhs, const valarray<T>& rhs){
  607.                 valarray<T> retval(lhs);
  608.                 retval += rhs;
  609.                 return retval;
  610.         }
  611.         template<class T> valarray<T> operator+ (const valarray<T>& lhs, const T& rhs){
  612.                 valarray<T> retval(lhs);
  613.                 retval += rhs;
  614.                 return retval;
  615.         }
  616.         template<class T> valarray<T> operator+ (const T& lhs, const valarray<T>& rhs){
  617.                 valarray<T> retval(lhs, rhs.size());
  618.                 retval += rhs;
  619.                 return retval;
  620.         }
  621.         template<class T> valarray<T> operator- (const valarray<T>& lhs, const valarray<T>& rhs){
  622.                 valarray<T> retval(lhs);
  623.                 retval -= rhs;
  624.                 return retval;
  625.         }
  626.         template<class T> valarray<T> operator- (const valarray<T>& lhs, const T& rhs){
  627.                 valarray<T> retval(lhs);
  628.                 retval -= rhs;
  629.                 return retval;
  630.         }
  631.         template<class T> valarray<T> operator- (const T& lhs, const valarray<T>& rhs){
  632.                 valarray<T> retval(lhs, rhs.size());
  633.                 retval -= rhs;
  634.                 return retval;
  635.         }
  636.         template<class T> valarray<T> operator^ (const valarray<T>& lhs, const valarray<T>& rhs){
  637.                 valarray<T> retval(lhs);
  638.                 retval ^= rhs;
  639.                 return retval;
  640.         }
  641.         template<class T> valarray<T> operator^ (const valarray<T>& lhs, const T& rhs){
  642.                 valarray<T> retval(lhs);
  643.                 retval ^= rhs;
  644.                 return retval;
  645.         }
  646.         template<class T> valarray<T> operator^ (const T& lhs, const valarray<T>& rhs){
  647.                 valarray<T> retval(lhs, rhs.size());
  648.                 retval ^= rhs;
  649.                 return retval;
  650.         }
  651.         template<class T> valarray<T> operator& (const valarray<T>& lhs, const valarray<T>& rhs){
  652.                 valarray<T> retval(lhs);
  653.                 retval &= rhs;
  654.                 return retval;
  655.         }
  656.         template<class T> valarray<T> operator& (const valarray<T>& lhs, const T& rhs){
  657.                 valarray<T> retval(lhs);
  658.                 retval &= rhs;
  659.                 return retval;
  660.         }
  661.         template<class T> valarray<T> operator& (const T& lhs, const valarray<T>& rhs){
  662.                 valarray<T> retval(lhs, rhs.size());
  663.                 retval &= rhs;
  664.                 return retval;
  665.         }
  666.         template<class T> valarray<T> operator| (const valarray<T>& lhs, const valarray<T>& rhs){
  667.                 valarray<T> retval(lhs);
  668.                 retval |= rhs;
  669.                 return retval;
  670.         }
  671.         template<class T> valarray<T> operator| (const valarray<T>& lhs, const T& rhs){
  672.                 valarray<T> retval(lhs);
  673.                 retval |= rhs;
  674.                 return retval;
  675.         }
  676.         template<class T> valarray<T> operator| (const T& lhs, const valarray<T>& rhs){
  677.                 valarray<T> retval(lhs, rhs.size());
  678.                 retval |= rhs;
  679.                 return retval;
  680.         }
  681.         template<class T> valarray<T> operator<<(const valarray<T>& lhs, const valarray<T>& rhs){
  682.                 valarray<T> retval(lhs);
  683.                 retval <<= rhs;
  684.                 return retval;
  685.         }
  686.         template<class T> valarray<T> operator<<(const valarray<T>& lhs, const T& rhs){
  687.                 valarray<T> retval(lhs);
  688.                 retval <<= rhs;
  689.                 return retval;
  690.         }
  691.         template<class T> valarray<T> operator<<(const T& lhs, const valarray<T>& rhs){
  692.                 valarray<T> retval(lhs, rhs.size());
  693.                 retval <<= rhs;
  694.                 return retval;
  695.         }
  696.         template<class T> valarray<T> operator>>(const valarray<T>& lhs, const valarray<T>& rhs){
  697.                 valarray<T> retval(lhs);
  698.                 retval >>= rhs;
  699.                 return retval;
  700.         }
  701.         template<class T> valarray<T> operator>>(const valarray<T>& lhs, const T& rhs){
  702.                 valarray<T> retval(lhs);
  703.                 retval >>= rhs;
  704.                 return retval;
  705.         }
  706.         template<class T> valarray<T> operator>>(const T& lhs, const valarray<T>& rhs){
  707.                 valarray<T> retval(lhs, rhs.size());
  708.                 retval >>= rhs;
  709.                 return retval;
  710.         }
  711.  
  712.         template<class T> valarray<bool> operator&&(const valarray<T>& lhs, const valarray<T>& rhs){
  713.                 valarray<bool> retval(lhs.size());
  714.                 for(size_t i = 0; i < retval.size(); ++i){
  715.                         retval[i] = lhs[i] && rhs[i];
  716.                 }
  717.                 return retval;
  718.         }
  719.         template<class T> valarray<bool> operator&&(const valarray<T>& lhs, const T& rhs){
  720.                 valarray<bool> retval(lhs.size());
  721.                 for(size_t i = 0; i <retval.size(); ++i){
  722.                         retval[i] = lhs[i] && rhs;
  723.                 }
  724.                 return retval;
  725.         }
  726.         template<class T> valarray<bool> operator&&(const T& lhs, const valarray<T>& rhs){
  727.                 valarray<bool> retval(rhs.size());
  728.                 for(size_t i = 0; i <retval.size(); ++i){
  729.                         retval[i] = lhs && rhs[i];
  730.                 }
  731.                 return retval;
  732.         }
  733.         template<class T> valarray<bool> operator||(const valarray<T>&lhs, const valarray<T>& rhs){
  734.                 valarray<bool> retval(lhs.size());
  735.                 for(size_t i = 0; i <retval.size(); ++i){
  736.                         retval[i] = lhs[i] || rhs[i];
  737.                 }
  738.                 return retval;
  739.         }
  740.         template<class T> valarray<bool> operator||(const valarray<T>& lhs, const T& rhs){
  741.                 valarray<bool> retval(lhs.size());
  742.                 for(size_t i = 0; i <retval.size(); ++i){
  743.                         retval[i] = lhs[i] || rhs;
  744.                 }
  745.                 return retval;
  746.         }
  747.         template<class T> valarray<bool> operator||(const T& lhs, const valarray<T>& rhs){
  748.                 valarray<bool> retval(rhs.size());
  749.                 for(size_t i = 0; i < retval.size(); ++i){
  750.                         retval[i] = lhs || rhs[i];
  751.                 }
  752.                 return retval;
  753.         }
  754.  
  755.         template<class T> valarray<bool> operator==(const valarray<T>& lhs, const valarray<T>& rhs){
  756.                 valarray<bool> retval(lhs.size());
  757.                 for(size_t i = 0; i <retval.size(); ++i){
  758.                         retval[i] = lhs[i] == rhs[i];
  759.                 }
  760.                 return retval;
  761.         }
  762.         template<class T> valarray<bool> operator==(const valarray<T>& lhs, const T& rhs){
  763.                 valarray<bool> retval(lhs.size());
  764.                 for(size_t i = 0; i < retval.size(); ++i){
  765.                         retval[i] = lhs[i] == rhs;
  766.                 }
  767.                 return retval;
  768.         }
  769.         template<class T> valarray<bool> operator==(const T& lhs, const valarray<T>& rhs){
  770.                 valarray<bool> retval(rhs.size());
  771.                 for(size_t i = 0; i < retval.size(); ++i){
  772.                         retval[i] = lhs == rhs[i];
  773.                 }
  774.                 return retval;
  775.         }
  776.         template<class T> valarray<bool> operator!=(const valarray<T>& lhs, const valarray<T>& rhs){
  777.                 valarray<bool> retval(lhs.size());
  778.                 for(size_t i = 0; i <retval.size(); ++i){
  779.                         retval[i] = lhs[i] != rhs[i];
  780.                 }
  781.                 return retval;
  782.         }
  783.         template<class T> valarray<bool> operator!=(const valarray<T>& lhs, const T& rhs){
  784.                 valarray<bool> retval(lhs.size());
  785.                 for(size_t i = 0; i <retval.size(); ++i){
  786.                         retval[i] = lhs[i] != rhs;
  787.                 }
  788.                 return retval;
  789.         }
  790.         template<class T> valarray<bool> operator!=(const T& lhs, const valarray<T>& rhs){
  791.                 valarray<bool> retval(rhs.size());
  792.                 for(size_t i = 0; i <retval.size(); ++i){
  793.                         retval[i] = lhs != rhs[i];
  794.                 }
  795.                 return retval;
  796.         }
  797.         template<class T> valarray<bool> operator< (const valarray<T>& lhs, const valarray<T>& rhs){
  798.                 valarray<bool> retval(lhs.size());
  799.                 for(size_t i = 0; i <retval.size(); ++i){
  800.                         retval[i] = lhs[i] < rhs[i];
  801.                 }
  802.                 return retval;
  803.         }
  804.         template<class T> valarray<bool> operator< (const valarray<T>& lhs, const T& rhs){
  805.                 valarray<bool> retval(lhs.size());
  806.                 for(size_t i = 0; i <retval.size(); ++i){
  807.                         retval[i] = lhs[i] < rhs;
  808.                 }
  809.                 return retval;
  810.         }
  811.         template<class T> valarray<bool> operator< (const T& lhs, const valarray<T>& rhs){
  812.                 valarray<bool> retval(rhs.size());
  813.                 for(size_t i = 0; i <retval.size(); ++i){
  814.                         retval[i] = lhs < rhs[i];
  815.                 }
  816.                 return retval;
  817.         }
  818.         template<class T> valarray<bool> operator> (const valarray<T>& lhs, const valarray<T>& rhs){
  819.                 valarray<bool> retval(lhs.size());
  820.                 for(size_t i = 0; i <retval.size(); ++i){
  821.                         retval[i] = lhs[i] > rhs[i];
  822.                 }
  823.                 return retval;
  824.         }
  825.         template<class T> valarray<bool> operator> (const valarray<T>& lhs, const T& rhs){
  826.                 valarray<bool> retval(lhs.size());
  827.                 for(size_t i = 0; i <retval.size(); ++i){
  828.                         retval[i] = lhs[i] > rhs;
  829.                 }
  830.                 return retval;
  831.         }
  832.         template<class T> valarray<bool> operator> (const T& lhs, const valarray<T>& rhs){
  833.                 valarray<bool> retval(rhs.size());
  834.                 for(size_t i = 0; i <retval.size(); ++i){
  835.                         retval[i] = lhs > rhs[i];
  836.                 }
  837.                 return retval;
  838.         }
  839.         template<class T> valarray<bool> operator<=(const valarray<T>& lhs, const valarray<T>& rhs){
  840.                 valarray<bool> retval(lhs.size());
  841.                 for(size_t i = 0; i <retval.size(); ++i){
  842.                         retval[i] = lhs[i] <= rhs[i];
  843.                 }
  844.                 return retval;
  845.         }
  846.         template<class T> valarray<bool> operator<=(const valarray<T>& lhs, const T& rhs){
  847.                 valarray<bool> retval(lhs.size());
  848.                 for(size_t i = 0; i <retval.size(); ++i){
  849.                         retval[i] = lhs[i] <= rhs;
  850.                 }
  851.                 return retval;
  852.         }
  853.         template<class T> valarray<bool> operator<=(const T& lhs, const valarray<T>& rhs){
  854.                 valarray<bool> retval(rhs.size());
  855.                 for(size_t i = 0; i <retval.size(); ++i){
  856.                         retval[i] = lhs <= rhs[i];
  857.                 }
  858.                 return retval;
  859.         }
  860.         template<class T> valarray<bool> operator>=(const valarray<T>& lhs, const valarray<T>& rhs){
  861.                 valarray<bool> retval(lhs.size());
  862.                 for(size_t i = 0; i <retval.size(); ++i){
  863.                         retval[i] = lhs[i] >= rhs[i];
  864.                 }
  865.                 return retval;
  866.         }
  867.         template<class T> valarray<bool> operator>=(const valarray<T>& lhs, const T& rhs){
  868.                 valarray<bool> retval(lhs.size());
  869.                 for(size_t i = 0; i <retval.size(); ++i){
  870.                         retval[i] = lhs[i] >= rhs;
  871.                 }
  872.                 return retval;
  873.         }
  874.         template<class T> valarray<bool> operator>=(const T& lhs, const valarray<T>& rhs){
  875.                 valarray<bool> retval(rhs.size());
  876.                 for(size_t i = 0; i <retval.size(); ++i){
  877.                         retval[i] = lhs >= rhs[i];
  878.                 }
  879.                 return retval;
  880.         }
  881.         template<class T> T min(const valarray<T>& x){
  882.                 T retval(x[0]);
  883.                 for(size_t i = 1; i < x.size(); ++i){
  884.                         if(x[i] < retval){
  885.                                 retval = x[i];
  886.                         }
  887.                 }
  888.         }
  889.         template<class T> T max(const valarray<T>& x){
  890.                 T retval(x[0]);
  891.                 for(size_t i = 1; i < x.size(); ++i){
  892.                         if(x[i] > retval){
  893.                                 retval = x[i];
  894.                         }
  895.                 }
  896.         }
  897.  
  898.         template<class T> valarray<T> abs  (const valarray<T>& x){
  899.                 valarray<T> retval(x.size());
  900.                 for(size_t i = 0; i < retval.size(); ++i){
  901.                         retval[i] = abs(x[i]);
  902.                 }
  903.                 return retval;
  904.         }
  905.         template<class T> valarray<T> acos (const valarray<T>& x){
  906.                 valarray<T> retval(x.size());
  907.                 for(size_t i = 0; i < retval.size(); ++i){
  908.                         retval[i] = acos(x[i]);
  909.                 }
  910.                 return retval;
  911.         }
  912.         template<class T> valarray<T> asin (const valarray<T>& x){
  913.                 valarray<T> retval(x.size());
  914.                 for(size_t i = 0; i < retval.size(); ++i){
  915.                         retval[i] = asin(x[i]);
  916.                 }
  917.                 return retval;
  918.         }
  919.         template<class T> valarray<T> atan (const valarray<T>& x){
  920.                 valarray<T> retval(x.size());
  921.                 for(size_t i = 0; i < retval.size(); ++i){
  922.                         retval[i] = atan(x[i]);
  923.                 }
  924.                 return retval;
  925.         }
  926.         template<class T> valarray<T> atan2(const valarray<T>& y, const valarray<T>& x){
  927.                 valarray<T> retval(y.size());
  928.                 for(size_t i = 0; i < retval.size(); ++i){
  929.                         retval[i] = atan2(y[i], x[i]);
  930.                 }
  931.                 return retval;
  932.         }
  933.         template<class T> valarray<T> atan2(const valarray<T>& y, const T& x){
  934.                 valarray<T> retval(y.size());
  935.                 for(size_t i = 0; i < retval.size(); ++i){
  936.                         retval[i] = atan2(y[i], x);
  937.                 }
  938.                 return retval;
  939.         }
  940.         template<class T> valarray<T> atan2(const T& y, const valarray<T>& x){
  941.                 valarray<T> retval(x.size());
  942.                 for(size_t i = 0; i < retval.size(); ++i){
  943.                         retval[i] = atan2(y, x[i]);
  944.                 }
  945.                 return retval;
  946.         }
  947.         template<class T> valarray<T> cos  (const valarray<T>& x){
  948.                 valarray<T> retval(x.size());
  949.                 for(size_t i = 0; i < retval.size(); ++i){
  950.                         retval[i] = cos(x[i]);
  951.                 }
  952.                 return retval;
  953.         }
  954.         template<class T> valarray<T> cosh (const valarray<T>& x){
  955.                 valarray<T> retval(x.size());
  956.                 for(size_t i = 0; i < retval.size(); ++i){
  957.                         retval[i] = cosh(x[i]);
  958.                 }
  959.                 return retval;
  960.         }
  961.         template<class T> valarray<T> exp  (const valarray<T>& x){
  962.                 valarray<T> retval(x.size());
  963.                 for(size_t i = 0; i < retval.size(); ++i){
  964.                         retval[i] = exp(x[i]);
  965.                 }
  966.                 return retval;
  967.         }
  968.         template<class T> valarray<T> log  (const valarray<T>& x){
  969.                 valarray<T> retval(x.size());
  970.                 for(size_t i = 0; i < retval.size(); ++i){
  971.                         retval[i] = log(x[i]);
  972.                 }
  973.                 return retval;
  974.         }
  975.         template<class T> valarray<T> log10(const valarray<T>& x){
  976.                 valarray<T> retval(x.size());
  977.                 for(size_t i = 0; i < retval.size(); ++i){
  978.                         retval[i] = log10(x[i]);
  979.                 }
  980.                 return retval;
  981.         }
  982.         template<class T> valarray<T> pow  (const valarray<T>& x, const valarray<T>& y){
  983.                 valarray<T> retval(x.size());
  984.                 for(size_t i = 0; i < retval.size(); ++i){
  985.                         retval[i] = pow(x[i], y[i]);
  986.                 }
  987.                 return retval;
  988.         }
  989.         template<class T> valarray<T> pow  (const valarray<T>& x, const T& y){
  990.                 valarray<T> retval(x.size());
  991.                 for(size_t i = 0; i < retval.size(); ++i){
  992.                         retval[i] = pow(x[i], y);
  993.                 }
  994.                 return retval;
  995.         }
  996.         template<class T> valarray<T> pow  (const T& x, const valarray<T>& y){
  997.                 valarray<T> retval(y.size());
  998.                 for(size_t i = 0; i < retval.size(); ++i){
  999.                         retval[i] = pow(x, y[i]);
  1000.                 }
  1001.                 return retval;
  1002.         }
  1003.         template<class T> valarray<T> sin  (const valarray<T>& x){
  1004.                 valarray<T> retval(x.size());
  1005.                 for(size_t i = 0; i < retval.size(); ++i){
  1006.                         retval[i] = sin(x[i]);
  1007.                 }
  1008.                 return retval;
  1009.         }
  1010.         template<class T> valarray<T> sinh (const valarray<T>& x){
  1011.                 valarray<T> retval(x.size());
  1012.                 for(size_t i = 0; i < retval.size(); ++i){
  1013.                         retval[i] = sinh(x[i]);
  1014.                 }
  1015.                 return retval;
  1016.         }
  1017.         template<class T> valarray<T> sqrt (const valarray<T>& x){
  1018.                 valarray<T> retval(x.size());
  1019.                 for(size_t i = 0; i < retval.size(); ++i){
  1020.                         retval[i] = sqrt(x[i]);
  1021.                 }
  1022.                 return retval;
  1023.         }
  1024.         template<class T> valarray<T> tan  (const valarray<T>& x){
  1025.                 valarray<T> retval(x.size());
  1026.                 for(size_t i = 0; i < retval.size(); ++i){
  1027.                         retval[i] = tan(x[i]);
  1028.                 }
  1029.                 return retval;
  1030.         }
  1031.         template<class T> valarray<T> tanh (const valarray<T>& x){
  1032.                 valarray<T> retval(x.size());
  1033.                 for(size_t i = 0; i < retval.size(); ++i){
  1034.                         retval[i] = tanh(x[i]);
  1035.                 }
  1036.                 return retval;
  1037.         }
  1038. }
  1039.  
  1040. #pragma GCC visibility pop
  1041.  
  1042. #endif
  1043.