diff options
author | Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> | 1999-06-04 21:35:36 +0200 |
---|---|---|
committer | Gabriel Dos Reis <gdr@gcc.gnu.org> | 1999-06-04 19:35:36 +0000 |
commit | 27ac1891d29ab1627b5ae30234c27603a064edd4 (patch) | |
tree | 9e997615b80cf29c9d5d29dac7105038bc90622b /libstdc++/valarray.cc | |
parent | 5c5d086f8518a95e294d8af02174f035e9588db3 (diff) | |
download | gcc-27ac1891d29ab1627b5ae30234c27603a064edd4.zip gcc-27ac1891d29ab1627b5ae30234c27603a064edd4.tar.gz gcc-27ac1891d29ab1627b5ae30234c27603a064edd4.tar.bz2 |
std_valarray.h: New file.
* std/std_valarray.h: New file.
* std/slice.h: New file.
* std/slice_array.h: New file.
* std/gslice.h: New file.
* std/gslice_array.h: New file.
* std/mask_array.h: New file.
* std/indirect_array.h: New file.
* std/valarray_array.h: New file.
* std/valarray_array.tcc: New file.
* std/valarray_meta.h: New file.
* valarray.cc: New file.
* valarray: New file
* Makefile.in (OBJS): add valarray.o
(HEADERS): add valarray
(valarray.o): define dependency on valarray.cc
(install): make it possible to install valarray files.
From-SVN: r27354
Diffstat (limited to 'libstdc++/valarray.cc')
-rw-r--r-- | libstdc++/valarray.cc | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libstdc++/valarray.cc b/libstdc++/valarray.cc new file mode 100644 index 0000000..5e7fe0c --- /dev/null +++ b/libstdc++/valarray.cc @@ -0,0 +1,50 @@ +#include <std/std_valarray.h> + +// Some Explicit Instanciations. +template class multiplies<size_t>; +template size_t accumulate(size_t*, size_t*, size_t, multiplies<size_t>); + +template void + __valarray_fill(size_t* __restrict__, size_t, const size_t&); + +template void + __valarray_copy(const size_t* __restrict__, size_t, size_t* __restrict__); + +template valarray<size_t>::valarray(size_t); +template valarray<size_t>::~valarray(); +template valarray<size_t>::valarray(const valarray<size_t>&); +template size_t valarray<size_t>::size() const; +template size_t& valarray<size_t>::operator[](size_t); +template size_t valarray<size_t>::product() const; + + +void __gslice_to_index(size_t __o, const valarray<size_t>& __l, + const valarray<size_t>& __s, + valarray<size_t>& __i) +{ + const size_t __n = __l.size(); + size_t* const __t = static_cast<size_t*>(alloca(__n*sizeof(size_t))); + __valarray_fill(__t, __n, size_t(0)); + const size_t __z = __i.size(); + __valarray_fill(&__i[0], __z, __o); + for (size_t __j=0; __j<__z; ++__j) { + for (size_t __k=0; __k<__n; ++__k) + __i[__j] += __s[__k]*__t[__k]; + ++__t[__n-1]; + for (size_t __k=__n-1; __k; --__k) { + if (__t[__k] >= __l[__k]) { + __t[__k] = 0; + ++__t[__k-1]; + } + } + } +} + +_Indexer::_Indexer(size_t __o, const valarray<size_t>& __l, + const valarray<size_t>& __s) + : _M_count(1), _M_start(__o), _M_size(__l), _M_stride(__s), + _M_index(__l.size() ? __l.product() : 0) +{ __gslice_to_index(__o, __l, __s, _M_index); } + + + |