aimstil  5.0.5
multi_array.h
Go to the documentation of this file.
1 #ifndef TIL_MULTI_ARRAY_H
2 #define TIL_MULTI_ARRAY_H
3 
4 // includes from STL
5 #include <cassert>
6 #include <numeric>
7 
8 // includes from BOOST
9 #include "boost/array.hpp"
10 
11 // includes from TIL
12 #include "til/basic_range.h"
13 #include "til/labels.h"
14 #include "til/meta.h"
15 #include "til/numeric_array.h"
16 #include "til/traits.h"
17 
18 namespace til
19 {
20 
21  // Idea: we first define a multi array that can combine containers, i.e.
22  // have a container of container (or not), but in anycase that is 2D.
23  // then, in higher dim, simply iterate?
24  //template < typename TContainer, std::size_t D >
25  //class multi_conc;
26 /*
27  namespace detail
28  {
29  template < typename TMultiArray, std::size_t D >
30  class multi_conc_two
31  {
32  public: // typedef
33 
34  typedef TMultiArray outside_container;
35  typedef typename value_type_of<TMultiArray>::type inside_container;
36 
37  public: // classes
38 
39  class range;
40  class const_range;
41 
42  public: // constructors & destructor
43 
44  multi_conc_two() : m_data() {}
45  multi_conc(const boost::array<std::size_t, 2> & dims)
46  : m_data(dims[0], inside_container(dims[1]))
47  {
48  }
49 
50  public: // range
51 
52  range whole_range() { return range(til::whole_range(m_data), til::whole_range(*til::whole_range(m_data))); };
53 
54  //range begin() { return range(m_data.begin(), m_data.front().begin()); }
55  //range end() { return iterator(m_data.end(), m_data.back().end()); }
56 
57  public: // functions
58 
59  boost::array<std::size_t, 2> dims() const
60  { return m_dims; }
61 
62  private: // data
63  TContainer m_data;
64  boost::array<std::size_t, 2> m_dims;
65  };
66  } // namespace detail
67 
68  template < typename TContainer, std::size_t D >
69  class multi_conc : public detail::multi_conc_two<TContainer, D >
70  {
71  };
72 
73  template < typename TContainer, std::size_t D >
74  const int multi_conc<TContainer, D>::d = D;
75 */
76 /*
77  template < typename TContainer >
78  class multi_conc<TContainer, 1>
79  {
80  public: // typedefs
81 
82  typedef typename TContainer::value_type value_type;
83  typedef typename TContainer::reference reference;
84  typedef typename TContainer::const_reference const_reference;
85 
86  public: // constants
87 
88  static const int d;
89 
90  public: // classes
91 
92  class range : public basic_range<typename TContainer::iterator>
93  {
94  private: // typedefs
95  typedef typename TContainer::iterator iterator;
96  public: // typedefs
97  typedef basic_range<iterator> Base;
98  public: // constructors
99  range(iterator begin, iterator end) : Base(begin,end) {}
100  };
101 
102  class const_range : public basic_range<typename TContainer::const_iterator>
103  {
104  private: // typedefs
105  typedef typename TContainer::const_iterator iterator;
106  public: // typedefs
107  typedef basic_range<iterator> Base;
108  public: // constructors
109  const_range(iterator begin, iterator end) : Base(begin,end) {}
110  };
111 
112  public: // constructors
113 
114  multi_conc() : m_data() {}
115  explicit multi_conc(std::size_t d) : m_data(d) {}
116  multi_conc(std::size_t d, value_type v) : m_data(d,v) {}
117  multi_conc(const TContainer & data) : m_data(data) {}
118 
119  public: // ranges
120  range whole_range() { return range(m_data.begin(), m_data.end()); }
121  const_range whole_range() const { return range(m_data.begin(), m_data.end()); }
122 
123  public: // operators
124 
125  reference operator[](std::size_t d) { return m_data[d]; }
126  const_reference operator[](std::size_t d) const { return m_data[d]; }
127 
128  reference operator()(std::size_t d) { return m_data[d]; }
129  const_reference operator()(std::size_t d) const { return m_data[d]; }
130 
131  private: // data
132 
133  TContainer m_data;
134  };
135 
136  */
137 /*
138  template < typename TContainer >
139  class multi_conc<TContainer, 2>
140  {
141  public: // typedef
142 
143  typedef TContainer outside_container;
144  // TODO: check that this is actually a container?
145  typedef typename value_type_of<TContainer>::type inside_container;
146  typedef typename TContainer::reference reference;
147  typedef typename TContainer::const_reference const_reference;
148  public: // classes
149 
150  class range;
151  class const_range;
152 
153  public: // constructors & destructor
154 
155  multi_conc() : m_data() {}
156  multi_conc(const numeric_array<std::size_t, 2> & dims)
157  : m_data(dims[0], inside_container(dims[1]))
158  , m_dims(dims)
159  {
160  assert(size(m_data) == dims[0]);
161  }
162 
163  public: // range
164 
165  range whole_range() { return range(til::whole_range(m_data), til::whole_range(*til::whole_range(m_data))); };
166 
167  //range begin() { return range(m_data.begin(), m_data.front().begin()); }
168  //range end() { return iterator(m_data.end(), m_data.back().end()); }
169 
170  public: // operators
171 
172  typename TContainer::reference operator[](std::size_t i) { return m_data[i]; }
173  typename TContainer::const_reference operator[](std::size_t i) const { return m_data[i]; }
174 
175  reference operator()(std::size_t i, std::size_t j) { return m_data[i][j]; }
176  const_reference operator()(std::size_t i, std::size_t j) const { return m_data[i][j]; }
177 
178  public: // set & get
179 
180  boost::array<std::size_t, 2> dims() const
181  { return m_dims; }
182 
183  std::size_t size() const { return m_dims[0]*m_dims[1]; }
184 
185  private: // data
186  TContainer m_data;
187  numeric_array<std::size_t, 2> m_dims;
188  };
189 
190 */
191  namespace detail
192  {
193  /*
195  template < typename TOuterRange, typename TInnerRange >
196  class range_compo : public range_label
197  {
198  public: // typedefs
199 
200  typedef TOuterRange outer_range;
201  typedef TInnerRange inner_range;
202  typedef typename inner_range::reference reference;
203  typedef typename inner_range::value_type value_type;
204 
205  public: // constructors
206 
207  range_compo(const TOuterRange & outer, const TInnerRange & inner) :
208  m_outer(outer), m_inner(inner)
209  {}
210 
211  public: // operators
212 
213  reference operator*() { return *m_inner; }
214 
215  void operator++() { ++m_inner;};
216 
217  bool ok()
218  {
219  if (m_inner.ok()) return true;
220  ++m_outer;
221  if (m_outer.ok())
222  {
223  m_inner = whole_range(*m_outer);
224  return true;
225  }
226  return false;
227  }
228 
229  public: //friends
230 
231  template < typename T1, typename T2, typename U1, typename U2 >
232  friend bool operator!=(const range_compo<T1,T2> & i1, const range_compo<U1,U2> & i2);
233 
234  private: // data
235  outer_range m_outer;
236  inner_range m_inner;
237  };
238 
239  template < typename T1, typename T2, typename U1, typename U2 >
240  bool operator!=(const range_compo<T1,T2> & i1, const range_compo<U1,U2> & i2)
241  {
242  return (i1.m_inner != i2.m_inner);
243  }
244  */
245 
246  //----------------------------------------------------------------------------
247 
248  /*
249  template < typename TIterator >
250  class volumetric_iterator_base
251  {
252  public: // operators
253  reference operator*() { return *m_inner; }
254  void operator++() { ++m_inner; }
255  protected: // data
256  TIterator m_i;
257  };
258  */
259 
260  //----------------------------------------------------------------------------
261 
262  //---------------------------//
263  // inner_voliterator_compo //
264  //---------------------------//
265 
266  template < typename TOuterIterator, std::size_t D, typename TInnerVolIterator >
268  {
269  public: // typedefs
270  typedef TOuterIterator outer_iterator;
271  typedef TInnerVolIterator inner_iterator;
272  typedef typename inner_iterator::reference reference;
273  typedef typename inner_iterator::value_type value_type;
275  protected: // typedefs
277  public: // constructors
278  inner_voliterator_compo(TOuterIterator i, const Vector & size)
279  : m_i(i)
280  , m_size(size)
281  , m_inner(i->begin())
282  {}
283  public: // operators
284  reference operator*() { return *m_inner; }
285  void operator++() { ++m_inner; }
286  public: // functions
287  template < typename TPosIterator >
288  void from_pos(TOuterIterator begin, TPosIterator pbegin, TPosIterator pend)
289  {
290  m_i = begin;
291  TPosIterator pmid = pbegin + D;
292  std::advance(m_i, pos2offset(pbegin, pmid, m_size.begin()));
293  m_inner.from_pos(m_i->begin(), pmid, pend);
294  }
295  private: // data
296  TOuterIterator m_i;
298  TInnerVolIterator m_inner;
299  };
300  }
301 
302  //----------------------------------------------------------------------------
303 
304  //---------------------//
305  // voliterator_compo //
306  //---------------------//
307 
308  template < typename TOuterIterator, std::size_t D, typename TInnerVolIterator >
310  : public detail::inner_voliterator_compo<TOuterIterator,D,TInnerVolIterator>
311  {
312  public: // typedefs
316  typedef typename Base::reference reference;
317  typedef typename Base::value_type value_type;
318  protected: // typedefs
319  typedef typename Base::Vector Vector;
320  public: // constructors
321  voliterator_compo(TOuterIterator begin, const Vector & size)
322  : Base(begin, size)
323  , m_begin(begin)
324  {}
325  public: // functions
326  template < std::size_t D2 >
328  { this->from_pos(pos.begin(), pos.end()); }
329  template < typename TPosIterator >
330  void from_pos(TPosIterator pbegin, TPosIterator pend)
331  { this->from_pos(m_begin, pbegin, pend); }
332  private: // data
333  TOuterIterator m_begin;
334  TOuterIterator m_i;
336  TInnerVolIterator m_inner;
337  };
338 
339  namespace detail
340  {
341  //----------------------------------------------------------------------------
342 
344  template < typename TOuterIterator, typename TInnerRange >
345  class iterator_range_compo : public range_label
346  {
347  public: // typedefs
348 
349  typedef TOuterIterator outer_iterator;
350  typedef TInnerRange inner_range;
351  typedef typename inner_range::reference reference;
352  typedef typename inner_range::value_type value_type;
353 
354  public: // constructors
355 
357  TOuterIterator begin,
358  TOuterIterator end
359  )
360  : m_i(begin)
361  , m_end(end)
362  , m_inner(begin->whole_range())
363  {}
364 
365  public: // operators
366 
367  reference operator*() { return *m_inner; }
368  void operator++() { ++m_inner; }
369  bool ok()
370  {
371  if (m_inner.ok()) return true;
372  ++m_i;
373  if (m_i != m_end)
374  {
375  m_inner = m_i->whole_range();
376  return true;
377  }
378  return false;
379  }
380 
381  public: //friends
382 
383  template < typename T1, typename T2, typename U1, typename U2 >
384  friend bool operator!=(const iterator_range_compo<T1,T2> & i1, const iterator_range_compo<U1,U2> & i2);
385 
386  private: // data
387 
388  outer_iterator m_i;
389  outer_iterator m_end;
390  inner_range m_inner;
391  };
392 
393 
394  template < typename T1, typename T2, typename U1, typename U2 >
396  {
397  return (i1.m_inner != i2.m_inner);
398  }
399 
400  } // namespace detail
401 
402 
403 /*
404  template < typename TContainer >
405  class multi_conc<TContainer,2>::range
406  : public detail::range_compo<typename range_of<TContainer>::type, typename range_of<typename value_type_of<TContainer>::type>::type>
407  {
408  public: // typedefs
409  typedef detail::range_compo<typename range_of<TContainer>::type, typename range_of<typename value_type_of<TContainer>::type>::type> Base;
410  public: // constructors
411  range(const outer_range & outer, const inner_range & inner) : Base(outer,inner) {}
412  };
413 */
414  /*
415  template < typename TIterator >
416  inline
417  typename TIterator::value_type
418  prod(TIterator begin, const TIterator & end)
419  {
420  typename TIterator::value_type res = 1;
421  for (; begin != end; ++begin) res *= *begin;
422  return res;
423  }
424  */
425 
426  namespace
427  {
428  template < typename TIterator1, typename TIterator2 >
429  inline std::size_t
430  offset_prod(TIterator1 pos, TIterator1 posend, TIterator2 dims)
431  {
432  std::size_t res = *pos;
433  while (++pos != posend) res = *(++dims) * res + *pos;
434  return res;
435  /*
436  ++pos;
437  ++dims;
438  for(; pos!= posend; ++dims, ++pos) res = *dims * res + *pos;
439  return res;
440  */
441  /*
442  do {
443  if (++pos == posend) return res;
444  ++dims;
445  res = *dims * res+ *pos;
446  }
447  */
448  }
449 
450  template < typename T, std::size_t D, typename TIterator >
452  slice(TIterator i)
453  {
454  numeric_array<T,D> res;
455  std::copy<TIterator>(i, i+D, res.begin());
456  return res;
457  }
458  }
459 
460  namespace detail
461  {
462 
463  //------------------------------------------------------------------------------
464 
465  //--------------------//
466  // multi_array_base //
467  //--------------------//
468 
469 
472  template < typename TContainer, std::size_t D, bool b >
473  class multi_array_base : public multi_array_label
474  {
475  public: // typedefs
476  typedef TContainer outer_container;
478  typedef typename inner_container::value_type value_type;
479  typedef typename inner_container::reference reference;
480  typedef typename inner_container::const_reference const_reference;
484  private: // helper
485  static inline std::size_t size_helper(const coord_type & dims)
486  {
487  return std::accumulate(dims.rbegin(), dims.rbegin()+D, std::size_t(1), std::multiplies<std::size_t>());
488  }
489  public: // classes
490 
491  class range
492  : public iterator_range_compo<typename outer_container::iterator, typename inner_container::range>
493  {
494  public:
497  range(outer_iterator begin, outer_iterator end) : Base(begin, end) {}
498  };
500  : public iterator_range_compo<typename outer_container::const_iterator, typename inner_container::const_range>
501  {
502  public:
505  const_range(outer_iterator begin, outer_iterator end) : Base(begin, end) {}
506  };
507  public: // constructors
508  multi_array_base() : m_data() {}
509  //explicit multi_array_base(const numeric_array<std::size_t, DTotal> & dims)
510  explicit multi_array_base(const coord_type & dims)
511  : m_data(size_helper(dims),
512  inner_container(slice<std::size_t, d_type::value-D>(dims.begin())))
513  , m_dims(dims)
514  {
515  assert(std::accumulate(dims.begin(), dims.end(), std::size_t(1), std::multiplies<std::size_t>())
516  == til::size(m_data) * til::size(m_data[0]));
517  }
518  multi_array_base(const coord_type & dims, value_type v)
519  // TODO: look for an alternative to this stupid slice function.
520  : m_data(size_helper(dims),
521  inner_container(slice<std::size_t, d_type::value-D>(dims.begin()), v))
522  , m_dims(dims)
523  {
524  assert(std::accumulate(dims.begin(), dims.end(),std::size_t(1),std::multiplies<std::size_t>())
525  == size(m_data) * size(m_data[0]));
526  }
527  multi_array_base(const TContainer & data) : m_data(data) {}
528  public: // range
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()); }
531  public: // set & get
532  coord_type dims() const { return m_dims; }
533  std::size_t size() const { return til::size(m_data) * til::size(m_data.front()); }
534  //std::size_t D() const { return d_type::value; }
535  public: // operators
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]; }
538  reference operator()(const coord_type & p)
539  { return this->operator()(p.rbegin(), p.rend()); }
540  const_reference operator()(const coord_type & p) const
541  { return this->operator()(p.rbegin(), p.rend()); }
542  template < typename TIterator >
543  reference operator()(TIterator begin, TIterator end)
544  {
545  return m_data[offset_prod(begin, begin+D, m_dims.rbegin())](begin+D,end);
546  //(slice<std::size_t, d_type::value-D>(p.begin()));
547  //[offset_prod(p.rbegin()+D, p.rend(), m_dims.rbegin()+D)];
548  }
549  template < typename TIterator >
550  const_reference operator()(TIterator begin, TIterator end) const
551  {
552  return m_data[offset_prod(begin, begin+D, m_dims.rbegin())](begin+D,end);
553  //(slice<std::size_t, d_type::value-D>(p.begin()));
554  //[offset_prod(p.rbegin()+D, p.rend(), m_dims.rbegin()+D)];
555  }
556  private: // data
557  TContainer m_data;
558  coord_type m_dims;
559  };
560 
561 
562  //------------------------------------------------------------------------------
563 
564  //--------------------//
565  // multi_array_base //
566  //--------------------//
567 
569  template < typename TContainer, std::size_t D >
570  class multi_array_base<TContainer, D, false> : public multi_array_label
571  {
572  public: // typedefs
574  typedef typename TContainer::value_type value_type;
575  typedef typename TContainer::reference reference;
576  typedef typename TContainer::const_reference const_reference;
579  private: // helper
580  static inline std::size_t size_helper(const coord_type & dims)
581  {
582  return std::accumulate(dims.begin(), dims.end(), std::size_t(1), std::multiplies<std::size_t>());
583  }
584  private: // typedefs
585  typedef typename TContainer::iterator iterator;
586  typedef typename TContainer::const_iterator const_iterator;
587  public: // classes
588  /*
589  class range : public basic_range<typename TContainer::iterator>
590  {
591  public:
592  typedef basic_range<iterator> Base;
593  class range(iterator begin, iterator end) : Base(begin, end) {}
594  };
595  class const_range : public basic_range<typename TContainer::const_iterator>
596  {
597  public:
598  typedef basic_range<typename TContainer::const_iterator> Base;
599  class const_range(iterator begin, iterator end) : Base(begin, end) {}
600  };
601  */
606  public: // constructors
607  multi_array_base() : m_data() {}
608  explicit multi_array_base(const coord_type & dims)
609  : m_data(Self::size_helper(dims))
610  //prod(dims.begin(), dims.end()))
611  , m_dims(dims)
612  {
613  assert(til::size(m_data) == std::accumulate(m_dims.begin(), m_dims.end(),std::size_t(1),std::multiplies<std::size_t>()));
614  }
615  multi_array_base(const coord_type & dims, value_type v)
616  : m_data(size_helper(dims))
617  //prod(dims.begin(), dims.end()), v)
618  , m_dims(dims)
619  {
620  assert(size(m_data) == prod(m_dims.begin(), m_dims.end()));
621  }
622  multi_array_base(const TContainer & data) : m_data(data)
623  {
624  assert(size(m_data) == size(data));
625  }
626  public: // range
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()); }
629  public: // set & get
630  std::size_t size() const { return til::size(m_data); }
631  coord_type dims() const { return m_dims; }
632  public: // operators
633  reference operator[](std::size_t i) { return m_data[i]; }
634  const_reference operator[](std::size_t i) const { return m_data[i]; }
635  reference operator()(const coord_type & p)
636  {
637  return this->operator()(p.rbegin(), p.rend());
638  }
639  const_reference operator()(const coord_type & p) const
640  {
641  return this->operator()(p.rbegin(), p.rend());
642  }
643  template < typename TIterator >
644  reference operator()(TIterator begin, TIterator end)
645  {
646  return m_data[offset_prod(begin, end, m_dims.rbegin())];
647  }
648  template < typename TIterator >
649  const_reference operator()(TIterator begin, TIterator end) const
650  {
651  return m_data[offset_prod(begin, end, m_dims.rbegin())];
652  }
653  private: // data
654  TContainer m_data;
655  coord_type m_dims;
656  };
657 
658  } // namespace detail
659 
660 
661  //------------------------------------------------------------------------------
662 
663 
664  //---------------//
665  // multi_array //
666  //---------------//
667 
668 
675  template < typename TContainer, std::size_t D >
677  : public detail::multi_array_base<TContainer,D,is_multi_array<typename value_type_of<TContainer>::type>::value>
678  {
679  public: // typedefs
681  typedef typename Base::coord_type coord_type;
682  typedef typename Base::value_type value_type;
683  public: // constructors
684  multi_array() : Base() {}
685  explicit multi_array(const coord_type & dims) : Base(dims) {}
686  multi_array(const coord_type & dims, value_type v) : Base(dims, v) {}
687  //multi_array(const TContainer & data) : Base(data) {}
688  };
689 
690  //-----------------------------------------------------------------------------
691 
692  /*
694  template < typename TContainer >
695  class multi_conc_2<TContainer>
696  {
697  public: // typedef
698 
699  typedef TContainer outside_container;
700  typedef typename value_type_of<TContainer>::type inside_container;
701  typedef typename TContainer::reference reference;
702  typedef typename TContainer::const_reference const_reference;
703  public: // classes
704 
705  class range;
706  class const_range;
707 
708  public: // constructors & destructor
709 
710  multi_conc() : m_data() {}
711  multi_conc(const numeric_array<std::size_t, 2> & dims)
712  : m_data(dims[0], inside_container(dims[1]))
713  , m_dims(dims)
714  {
715  assert(size(m_data) == dims[0]);
716  }
717 
718  public: // range
719 
720  range whole_range() { return range(til::whole_range(m_data), til::whole_range(*til::whole_range(m_data))); };
721 
722  //range begin() { return range(m_data.begin(), m_data.front().begin()); }
723  //range end() { return iterator(m_data.end(), m_data.back().end()); }
724 
725  public: // operators
726 
727  typename TContainer::reference operator[](std::size_t i) { return m_data[i]; }
728  typename TContainer::const_reference operator[](std::size_t i) const { return m_data[i]; }
729 
730  reference operator()(std::size_t i, std::size_t j) { return m_data[i][j]; }
731  const_reference operator()(std::size_t i, std::size_t j) const { return m_data[i][j]; }
732 
733  public: // functions
734 
735  boost::array<std::size_t, 2> dims() const
736  { return m_dims; }
737 
738  private: // data
739  TContainer m_data;
740  numeric_array<std::size_t, 2> m_dims;
741  };
742  */
743 
744 } // namespace til
745 
746 #endif
747 
748 
const_reference operator()(const coord_type &p) const
Definition: multi_array.h:540
inner_container::reference reference
Definition: multi_array.h:479
detail::multi_array_base< TContainer, D, is_multi_array< typename value_type_of< TContainer >::type >::value > Base
Definition: multi_array.h:680
Base::value_type value_type
Definition: multi_array.h:682
meta::int_type< D > my_d_type
Definition: multi_array.h:481
voliterator_compo(TOuterIterator begin, const Vector &size)
Definition: multi_array.h:321
multi_array_base(const coord_type &dims, value_type v)
Definition: multi_array.h:518
iterator_range_compo< typename outer_container::iterator, typename inner_container::range > Base
Definition: multi_array.h:495
reference operator()(const coord_type &p)
Definition: multi_array.h:538
Wraps a container containing multi_array inside a multi_array, bringing D extra dimensions to the dim...
Definition: multi_array.h:473
multi_array_base(const coord_type &dims)
Definition: multi_array.h:510
STL namespace.
Belongs to package Box Do not include directly, include til/Box.h instead.
Definition: Accumulator.h:10
const_reference operator()(TIterator begin, TIterator end) const
Definition: multi_array.h:550
A multi-dimensional container.
Definition: multi_array.h:676
multi_array_base< TContainer, D, false > Self
Definition: multi_array.h:573
multi_array_base(const coord_type &dims, value_type v)
Definition: multi_array.h:615
void from_pos(TOuterIterator begin, TPosIterator pbegin, TPosIterator pend)
Definition: multi_array.h:288
numeric_array< T, D > size(const Box< T, D > &box)
Return the size of a box.
Definition: boxTools.h:56
TContainer::const_reference operator[](std::size_t i) const
Definition: multi_array.h:537
Defines empty classes that serves as labels.
inner_range::reference reference
Definition: multi_array.h:351
inner_iterator::value_type value_type
Definition: multi_array.h:273
const_range(outer_iterator begin, outer_iterator end)
Definition: multi_array.h:505
inner_iterator::reference reference
Definition: multi_array.h:272
basic_volumetric_iterator< iterator, D > volumetric_iterator
Definition: multi_array.h:604
basic_volumetric_iterator< const_iterator, D > const_volumetric_iterator
Definition: multi_array.h:605
meta::add_type< my_d_type, typename inner_container::d_type >::type d_type
Definition: multi_array.h:482
numeric_array< std::size_t, d_type::value > coord_type
Definition: multi_array.h:483
inner_container::value_type value_type
Definition: multi_array.h:478
multi_array(const coord_type &dims)
Definition: multi_array.h:685
TContainer::reference operator[](std::size_t i)
Definition: multi_array.h:536
Base::outer_iterator outer_iterator
Definition: multi_array.h:314
std::size_t pos2offset(TPIterator pbegin, TPIterator pend, TSIterator sbegin)
Definition: miscTools.h:226
value_type_of< TContainer >::type inner_container
Definition: multi_array.h:477
inner_container::const_reference const_reference
Definition: multi_array.h:480
multi_array(const coord_type &dims, value_type v)
Definition: multi_array.h:686
iterator_range_compo< typename outer_container::const_iterator, typename inner_container::const_range > Base
Definition: multi_array.h:503
std::size_t size() const
Definition: multi_array.h:533
const_range whole_range() const
Definition: multi_array.h:530
const_reference operator()(const coord_type &p) const
Definition: multi_array.h:639
void from_pos(TPosIterator pbegin, TPosIterator pend)
Definition: multi_array.h:330
range(outer_iterator begin, outer_iterator end)
Definition: multi_array.h:497
numeric_array< std::size_t, D > Vector
Definition: multi_array.h:276
inner_voliterator_compo(TOuterIterator i, const Vector &size)
Definition: multi_array.h:278
Type representing an integer.
Definition: meta.h:10
reference operator()(TIterator begin, TIterator end)
Definition: multi_array.h:644
reference operator()(TIterator begin, TIterator end)
Definition: multi_array.h:543
Base::coord_type coord_type
Definition: multi_array.h:681
Base::inner_iterator inner_iterator
Definition: multi_array.h:315
const_reference operator()(TIterator begin, TIterator end) const
Definition: multi_array.h:649
Base::value_type value_type
Definition: multi_array.h:317
bool operator!=(const iterator_range_compo< T1, T2 > &i1, const iterator_range_compo< U1, U2 > &i2)
Definition: multi_array.h:395
Base::reference reference
Definition: multi_array.h:316
Base::outer_iterator outer_iterator
Definition: multi_array.h:496
A simple range made out of a couple of iterators.
Definition: basic_range.h:18
coord_type dims() const
Definition: multi_array.h:532
Composition of an iterator and a range.
Definition: multi_array.h:345
inner_range::value_type value_type
Definition: multi_array.h:352
detail::inner_voliterator_compo< TOuterIterator, D, TInnerVolIterator > Base
Definition: multi_array.h:313
range_of< std::vector< T, TAlloc > >::type whole_range(std::vector< T, TAlloc > &v)
Definition: std_wrap.h:76
iterator_range_compo(TOuterIterator begin, TOuterIterator end)
Definition: multi_array.h:356
Wraps a simple, linear container into a multidimensional array of dimension D.
Definition: multi_array.h:570
multi_array_base(const TContainer &data)
Definition: multi_array.h:527
const_reference operator[](std::size_t i) const
Definition: multi_array.h:634
void from_pos(const numeric_array< std::size_t, D2 > &pos)
Definition: multi_array.h:327
T::value_type type
Definition: traits.h:200