#include // Some Explicit Instanciations. template class multiplies; template size_t accumulate(size_t*, size_t*, size_t, multiplies); 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::valarray(size_t); template valarray::~valarray(); template valarray::valarray(const valarray&); template size_t valarray::size() const; template size_t& valarray::operator[](size_t); template size_t valarray::product() const; void __gslice_to_index(size_t __o, const valarray& __l, const valarray& __s, valarray& __i) { const size_t __n = __l.size(); size_t* const __t = static_cast(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& __l, const valarray& __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); }