1 #ifndef TIL_MULTI_ARRAY_H 2 #define TIL_MULTI_ARRAY_H 9 #include "boost/array.hpp" 266 template <
typename TOuterIterator, std::
size_t D,
typename TInnerVolIterator >
281 , m_inner(i->begin())
287 template <
typename TPosIterator >
288 void from_pos(TOuterIterator begin, TPosIterator pbegin, TPosIterator pend)
291 TPosIterator pmid = pbegin + D;
293 m_inner.from_pos(m_i->begin(), pmid, pend);
298 TInnerVolIterator m_inner;
308 template <
typename TOuterIterator, std::
size_t D,
typename TInnerVolIterator >
326 template < std::
size_t D2 >
329 template <
typename TPosIterator >
330 void from_pos(TPosIterator pbegin, TPosIterator pend)
331 { this->
from_pos(m_begin, pbegin, pend); }
333 TOuterIterator m_begin;
336 TInnerVolIterator m_inner;
344 template <
typename TOuterIterator,
typename TInnerRange >
357 TOuterIterator begin,
371 if (m_inner.ok())
return true;
375 m_inner = m_i->whole_range();
383 template <
typename T1,
typename T2,
typename U1,
typename U2 >
389 outer_iterator m_end;
394 template <
typename T1,
typename T2,
typename U1,
typename U2 >
397 return (i1.m_inner != i2.m_inner);
428 template <
typename TIterator1,
typename TIterator2 >
430 offset_prod(TIterator1 pos, TIterator1 posend, TIterator2 dims)
432 std::size_t res = *pos;
433 while (++pos != posend) res = *(++dims) * res + *pos;
450 template <
typename T, std::
size_t D,
typename TIterator >
455 std::copy<TIterator>(i, i+D, res.
begin());
472 template <
typename TContainer, std::
size_t D,
bool b >
485 static inline std::size_t size_helper(
const coord_type & dims)
487 return std::accumulate(dims.
rbegin(), dims.
rbegin()+D, std::size_t(1), std::multiplies<std::size_t>());
492 :
public iterator_range_compo<typename outer_container::iterator, typename inner_container::range>
497 range(outer_iterator begin, outer_iterator end) : Base(begin, end) {}
500 :
public iterator_range_compo<typename outer_container::const_iterator, typename inner_container::const_range>
505 const_range(outer_iterator begin, outer_iterator end) : Base(begin, end) {}
511 : m_data(size_helper(dims),
512 inner_container(slice<
std::size_t, d_type::value-D>(dims.begin())))
515 assert(std::accumulate(dims.
begin(), dims.
end(), std::size_t(1), std::multiplies<std::size_t>())
520 : m_data(size_helper(dims),
521 inner_container(slice<
std::size_t, d_type::value-D>(dims.begin()), v))
524 assert(std::accumulate(dims.
begin(), dims.
end(),std::size_t(1),std::multiplies<std::size_t>())
529 range
whole_range() {
return range(m_data.begin(), m_data.end()); }
530 const_range
whole_range()
const {
return const_range(m_data.begin(), m_data.end()); }
532 coord_type
dims()
const {
return m_dims; }
536 typename TContainer::reference
operator[](std::size_t i) {
return m_data[i]; }
537 typename TContainer::const_reference
operator[](std::size_t i)
const{
return m_data[i]; }
539 {
return this->operator()(p.
rbegin(), p.
rend()); }
541 {
return this->operator()(p.
rbegin(), p.
rend()); }
542 template <
typename TIterator >
545 return m_data[offset_prod(begin, begin+D, m_dims.rbegin())](begin+D,end);
549 template <
typename TIterator >
550 const_reference
operator()(TIterator begin, TIterator end)
const 552 return m_data[offset_prod(begin, begin+D, m_dims.rbegin())](begin+D,end);
569 template <
typename TContainer, std::
size_t D >
580 static inline std::size_t size_helper(
const coord_type & dims)
582 return std::accumulate(dims.
begin(), dims.
end(), std::size_t(1), std::multiplies<std::size_t>());
585 typedef typename TContainer::iterator iterator;
586 typedef typename TContainer::const_iterator const_iterator;
609 : m_data(Self::size_helper(dims))
613 assert(
til::size(m_data) == std::accumulate(m_dims.begin(), m_dims.end(),std::size_t(1),std::multiplies<std::size_t>()));
616 : m_data(size_helper(dims))
620 assert(
size(m_data) == prod(m_dims.begin(), m_dims.end()));
627 range
whole_range() {
return range(m_data.begin(), m_data.end()); }
628 const_range
whole_range()
const {
return const_range(m_data.begin(), m_data.end()); }
631 coord_type
dims()
const {
return m_dims; }
634 const_reference
operator[](std::size_t i)
const {
return m_data[i]; }
637 return this->operator()(p.
rbegin(), p.
rend());
641 return this->operator()(p.
rbegin(), p.
rend());
643 template <
typename TIterator >
646 return m_data[offset_prod(begin, end, m_dims.rbegin())];
648 template <
typename TIterator >
649 const_reference
operator()(TIterator begin, TIterator end)
const 651 return m_data[offset_prod(begin, end, m_dims.rbegin())];
675 template <
typename TContainer, std::
size_t D >
686 multi_array(
const coord_type & dims, value_type v) : Base(dims, v) {}
const_reference operator()(const coord_type &p) const
inner_container::reference reference
detail::multi_array_base< TContainer, D, is_multi_array< typename value_type_of< TContainer >::type >::value > Base
Base::value_type value_type
meta::int_type< D > my_d_type
voliterator_compo(TOuterIterator begin, const Vector &size)
numeric_array< std::size_t, D > coord_type
multi_array_base(const coord_type &dims, value_type v)
iterator_range_compo< typename outer_container::iterator, typename inner_container::range > Base
reference operator()(const coord_type &p)
Wraps a container containing multi_array inside a multi_array, bringing D extra dimensions to the dim...
multi_array_base(const coord_type &dims)
Belongs to package Box Do not include directly, include til/Box.h instead.
multi_array_base(const coord_type &dims)
const_reference operator()(TIterator begin, TIterator end) const
basic_range< const_iterator > const_range
meta::int_type< D > d_type
A multi-dimensional container.
multi_array_base< TContainer, D, false > Self
multi_array_base(const coord_type &dims, value_type v)
TOuterIterator outer_iterator
void from_pos(TOuterIterator begin, TPosIterator pbegin, TPosIterator pend)
numeric_array< T, D > size(const Box< T, D > &box)
Return the size of a box.
TContainer::const_reference operator[](std::size_t i) const
const_range whole_range() const
Defines empty classes that serves as labels.
inner_range::reference reference
TContainer::value_type value_type
inner_iterator::value_type value_type
TOuterIterator outer_iterator
TInnerVolIterator inner_iterator
reference operator[](std::size_t i)
const_range(outer_iterator begin, outer_iterator end)
inner_iterator::reference reference
basic_volumetric_iterator< iterator, D > volumetric_iterator
basic_volumetric_iterator< const_iterator, D > const_volumetric_iterator
meta::add_type< my_d_type, typename inner_container::d_type >::type d_type
basic_range< iterator > range
numeric_array< std::size_t, d_type::value > coord_type
inner_container::value_type value_type
multi_array(const coord_type &dims)
TContainer::reference operator[](std::size_t i)
Base::outer_iterator outer_iterator
std::size_t pos2offset(TPIterator pbegin, TPIterator pend, TSIterator sbegin)
value_type_of< TContainer >::type inner_container
inner_container::const_reference const_reference
multi_array(const coord_type &dims, value_type v)
iterator_range_compo< typename outer_container::const_iterator, typename inner_container::const_range > Base
reference operator()(const coord_type &p)
const_range whole_range() const
TContainer::const_reference const_reference
const_reference operator()(const coord_type &p) const
void from_pos(TPosIterator pbegin, TPosIterator pend)
range(outer_iterator begin, outer_iterator end)
TContainer outer_container
numeric_array< std::size_t, D > Vector
inner_voliterator_compo(TOuterIterator i, const Vector &size)
reference operator()(TIterator begin, TIterator end)
multi_array_base(const TContainer &data)
reference operator()(TIterator begin, TIterator end)
Base::coord_type coord_type
Base::inner_iterator inner_iterator
const_reference operator()(TIterator begin, TIterator end) const
Base::value_type value_type
bool operator!=(const iterator_range_compo< T1, T2 > &i1, const iterator_range_compo< U1, U2 > &i2)
Base::reference reference
Base::outer_iterator outer_iterator
Base::outer_iterator outer_iterator
A simple range made out of a couple of iterators.
Composition of an iterator and a range.
inner_range::value_type value_type
detail::inner_voliterator_compo< TOuterIterator, D, TInnerVolIterator > Base
reverse_iterator rbegin()
range_of< std::vector< T, TAlloc > >::type whole_range(std::vector< T, TAlloc > &v)
iterator_range_compo(TOuterIterator begin, TOuterIterator end)
Wraps a simple, linear container into a multidimensional array of dimension D.
multi_array_base(const TContainer &data)
TContainer::reference reference
const_reference operator[](std::size_t i) const
void from_pos(const numeric_array< std::size_t, D2 > &pos)