/* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __HEADER_STD_VALARRAY #define __HEADER_STD_VALARRAY 1 #include #include namespace std{ template class valarray; class slice; template class slice_array; class gslice; template class gslice_array; template class mask_array; template class indirect_array; //Actual class definitions class _UCXXEXPORT slice { protected: size_t sta; size_t siz; size_t str; public: slice() : sta(0), siz(0), str(0){ } slice(size_t a, size_t b, size_t c) : sta(a), siz(b), str(c) { } slice(const slice& s) : sta(s.sta), siz(s.siz), str(s.str) { } ~slice() { } size_t start() const{ return sta; } size_t size() const{ return siz; } size_t stride() const{ return str; } }; template class _UCXXEXPORT valarray { friend class slice_array; protected: T * data; size_t length; public: typedef T value_type; valarray() : data(0), length(0) { } explicit valarray(size_t t) : data(0), length(t){ data = new T[length]; } valarray(const T& v, size_t t) : data(0), length(t){ data = new T[length]; for(size_t i = 0; i < length; ++i){ data[i] = v; } } valarray(const T* p, size_t t) : data(0), length(t) { data = new T[length]; for(size_t i = 0; i < length; ++i){ data[i] = p[i]; } } valarray(const valarray& v) : data(0), length(v.length){ data = new T[length]; for(size_t i = 0; i < length; ++i){ data[i] = v.data[i]; } } valarray(const slice_array & sa) : data(0), length(sa.s.size()){ data = new T[length]; for(unsigned int i = 0; i < length; ++i){ data[i] = sa.array->data[sa.s.start() + i * sa.s.stride()]; } } valarray(const gslice_array&); valarray(const mask_array&); valarray(const indirect_array&); ~valarray(){ delete [] data; data = 0; length = 0; } valarray& operator=(const valarray& v){ for(size_t i =0; i< length; ++i){ data[i] = v.data[i]; } return *this; } valarray& operator=(const T& t){ for(size_t i = 0; i < length; ++i){ data[i] = t; } return *this; } valarray& operator=(const slice_array& sa){ for(size_t i =0; i < length; ++i){ data[i] = sa.data[sa.s.start() + i * sa.s.stride()]; } return *this; } valarray& operator=(const gslice_array&); valarray& operator=(const mask_array&); valarray& operator=(const indirect_array&); T operator[](size_t t) const{ return data[t]; } T& operator[](size_t t){ return data[t]; } valarray operator[](slice s) const{ valarray retval(s.size()); for(unsigned int i = 0; i< s.size(); ++i){ retval.data[i] = data[s.start() + i * s.stride()]; } return retval; } slice_array operator[](slice sl){ slice_array retval; retval.s = sl; retval.array = this; return retval; } valarray operator[](const gslice&) const; gslice_array operator[](const gslice&); valarray operator[](const valarray&) const; mask_array operator[](const valarray&); valarray operator[](const valarray&) const; indirect_array operator[](const valarray&); valarray operator+() const{ valarray retval(length); for(size_t i = 0; i< length ; ++i){ retval.data[i] = +data[i]; } return retval; } valarray operator-() const{ valarray retval(length); for(size_t i = 0; i< length; ++i){ retval.data[i] = -data[i]; } return retval; } valarray operator~() const{ valarray retval(length); for(size_t i = 0; i< length ; ++i){ retval.data[i] = ~data[i]; } return retval; } valarray operator!() const{ valarray retval(length); for(size_t i = 0; i< length ; ++i){ retval.data[i] = !data[i]; } return retval; } valarray& operator*= (const T& t){ for(size_t i=0;i& operator/= (const T& t){ for(size_t i=0;i& operator%= (const T& t){ for(size_t i=0;i& operator+= (const T& t){ for(size_t i=0;i& operator-= (const T& t){ for(size_t i=0;i& operator^= (const T& t){ for(size_t i=0;i& operator&= (const T& t){ for(size_t i=0;i& operator|= (const T& t){ for(size_t i=0;i& operator<<=(const T& t){ for(size_t i=0;i& operator>>=(const T& t){ for(size_t i=0;i>= t; } return *this; } valarray& operator*= (const valarray& a){ for(size_t i=0;i& operator/= (const valarray& a){ for(size_t i=0;i& operator%= (const valarray& a){ for(size_t i=0;i& operator+= (const valarray& a){ for(size_t i=0;i& operator-= (const valarray& a){ for(size_t i=0;i& operator^= (const valarray& a){ for(size_t i=0;i& operator|= (const valarray& a){ for(size_t i=0;i& operator&= (const valarray& a){ for(size_t i=0;i& operator<<=(const valarray& a){ for(size_t i=0;i& operator>>=(const valarray& a){ for(size_t i=0;i>= a.data[i]; } return *this; } size_t size() const{ return length; } T sum() const{ T retval(data[0]); for(size_t i = 1; i< length; ++i){ retval += data[i]; } return retval; } T min() const{ T retval(data[0]); for(size_t i = 1; i< length; ++i){ if(data[i] < retval){ retval = data[i]; } } return retval; } T max() const{ T retval(data[0]); for(size_t i = 1; i< length; ++i){ if(retval < data[i]){ retval = data[i]; } } return retval; } valarray shift (int n) const{ valarray retval(length); for(size_t i = 0; i < length ; ++i){ if(i + n > 0 && i + n < length){ retval.data[i] = data[i + n]; } } return retval; } valarray cshift(int n) const{ valarray retval(length); for(size_t i = 0; i < length ; ++i){ retval.data[i] = data[ (i + n) % length ]; } return retval; } valarray apply(T func(T) ) const{ valarray retval(length); for(size_t i = 0; i< length; ++i){ retval.data[i] = func(data[i]); } return retval; } valarray apply(T func(const T&)) const{ valarray retval(length); for(size_t i = 0; i< length; ++i){ retval.data[i] = func(data[i]); } return retval; } void resize(size_t sz, T c = T()){ delete [] data; data = 0; if(sz > 0){ data = new T[sz]; for(size_t i = 0; i < sz; ++i){ data[i] = c; } } length = sz; } }; template class _UCXXEXPORT slice_array { friend class valarray; public: typedef T value_type; void operator= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] = v[i]; } } void operator= (const T & v){ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] = v; } } void fill(const T & v){ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] = v; } } void operator*= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] *= v[i]; } } void operator/= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] /= v[i]; } } void operator%= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] %= v[i]; } } void operator+= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] += v[i]; } } void operator-= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] -= v[i]; } } void operator^= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] ^= v[i]; } } void operator&= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] &= v[i]; } } void operator|= (const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] |= v[i]; } } void operator<<=(const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] <<= v[i]; } } void operator>>=(const valarray& v) const{ for(unsigned int i = 0; i < s.size(); ++i){ array->data[s.start() + i * s.stride()] >>= v[i]; } } ~slice_array(){ array = 0; } private: slice_array() : array(0){ } public: slice_array(const slice_array& sa) : array(sa.array), s(sa.s){ } slice_array& operator=(const slice_array& sa){ array = sa.array; s = sa.s; } private: valarray * array; slice s; }; class _UCXXEXPORT gslice { private: size_t sta; valarray siz; valarray str; public: gslice() : sta(0) { } gslice(size_t s, const valarray& l, const valarray& d) : sta(s), siz(l), str(d) { } size_t start() const{ return sta; } valarray size() const{ return siz; } valarray stride() const{ return str; } }; template class gslice_array { private: friend class valarray; public: ~gslice_array(); void operator=(const valarray& array) const; void operator*=(const valarray& array) const; void operator/=(const valarray& array) const; void operator%=(const valarray& array) const; void operator+=(const valarray& array) const; void operator-=(const valarray& array) const; void operator^=(const valarray& array) const; void operator&=(const valarray& array) const; void operator|=(const valarray& array) const; void operator<<=(const valarray& array) const; void operator>>=(const valarray& array) const; void operator=(const T&); private: gslice_array(); gslice_array(const gslice_array&); gslice_array& operator= (const gslice_array& array); }; template valarray operator* (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval *= rhs; return retval; } template valarray operator* (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval *= rhs; return retval; } template valarray operator* (const T& lhs, const valarray& rhs){ valarray retval(rhs); retval *= lhs; return retval; } template valarray operator/ (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval /= rhs; return retval; } template valarray operator/ (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval /= rhs; return retval; } template valarray operator/ (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval /= rhs; return retval; } template valarray operator% (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval %= rhs; return retval; } template valarray operator% (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval %= rhs; return retval; } template valarray operator% (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval %= rhs; return retval; } template valarray operator+ (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval += rhs; return retval; } template valarray operator+ (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval += rhs; return retval; } template valarray operator+ (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval += rhs; return retval; } template valarray operator- (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval -= rhs; return retval; } template valarray operator- (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval-= rhs; return retval; } template valarray operator- (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval -= rhs; return retval; } template valarray operator^ (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval ^= rhs; return retval; } template valarray operator^ (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval ^= rhs; return retval; } template valarray operator^ (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval ^= rhs; return retval; } template valarray operator& (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval &= rhs; return retval; } template valarray operator& (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval &= rhs; return retval; } template valarray operator& (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval &= rhs; return retval; } template valarray operator| (const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval |= rhs; return retval; } template valarray operator| (const valarray& lhs, const T& rhs){ valarray retval(lhs); retval |= rhs; return retval; } template valarray operator| (const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval |= rhs; return retval; } template valarray operator<<(const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval <<= rhs; return retval; } template valarray operator<<(const valarray& lhs, const T& rhs){ valarray retval(lhs); retval <<= rhs; return retval; } template valarray operator<<(const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval <<= rhs; return retval; } template valarray operator>>(const valarray& lhs, const valarray& rhs){ valarray retval(lhs); retval >>= rhs; return retval; } template valarray operator>>(const valarray& lhs, const T& rhs){ valarray retval(lhs); retval >>= rhs; return retval; } template valarray operator>>(const T& lhs, const valarray& rhs){ valarray retval(lhs, rhs.size()); retval >>= rhs; return retval; } template valarray operator&&(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs[i] && rhs[i]; } return retval; } template valarray operator&&(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator&&(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator||(const valarray&lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator||(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator||(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs || rhs[i]; } return retval; } template valarray operator==(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator==(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs[i] == rhs; } return retval; } template valarray operator==(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = lhs == rhs[i]; } return retval; } template valarray operator!=(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator!=(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator!=(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator< (const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator< (const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator< (const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator> (const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i rhs[i]; } return retval; } template valarray operator> (const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i rhs; } return retval; } template valarray operator> (const T& rhs, const valarray& lhs){ valarray retval(rhs.size()); for(size_t i = 0; i rhs[i]; } return retval; } template valarray operator<=(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator<=(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i valarray operator<=(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i valarray operator>=(const valarray& lhs, const valarray& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i = rhs[i]; } return retval; } template valarray operator>=(const valarray& lhs, const T& rhs){ valarray retval(lhs.size()); for(size_t i = 0; i = rhs; } return retval; } template valarray operator>=(const T& lhs, const valarray& rhs){ valarray retval(rhs.size()); for(size_t i = 0; i = rhs[i]; } return retval; } template T min(const valarray& x){ T retval(x[0]); for(size_t i = 1; i < x.size(); ++i){ if(x[i] < retval){ retval = x[i]; } } } template T max(const valarray& x){ T retval(x[0]); for(size_t i = 1; i < x.size(); ++i){ if(x[i] > retval){ retval = x[i]; } } } template valarray abs (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = abs(x[i]); } } template valarray acos (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = acos(x[i]); } } template valarray asin (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = asin(x[i]); } } template valarray atan (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan(x[i]); } } template valarray atan2(const valarray& y, const valarray& x){ valarray retval(y.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan2(y[i], x[i]); } } template valarray atan2(const valarray& y, const T& x){ valarray retval(y.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = atan2(y[i], x); } } template valarray atan2(const T& y, const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = abs(y, x[i]); } } template valarray cos (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = cos(x[i]); } } template valarray cosh (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = cosh(x[i]); } } template valarray exp (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = exp(x[i]); } } template valarray log (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = log(x[i]); } } template valarray log10(const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = log10(x[i]); } } template valarray pow (const valarray& x, const valarray& y){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = pow(x[i], y[i]); } } template valarray pow (const valarray& x, const T& y){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = pow(x[i], y); } } template valarray pow (const T& x, const valarray& y){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = pow(x, y[i]); } } template valarray sin (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = sin(x[i]); } } template valarray sinh (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = sinh(x[i]); } } template valarray sqrt (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = sqrt(x[i]); } } template valarray tan (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = tan(x[i]); } } template valarray tanh (const valarray& x){ valarray retval(x.size()); for(size_t i = 0; i < retval.size(); ++i){ retval[i] = tanh(x[i]); } } } #endif