• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<sect2 id="multi_array_ref">
2<title><literal>multi_array_ref</literal></title>
3
4<para>
5<literal>multi_array_ref</literal> is a multi-dimensional container
6adaptor.  It provides the MultiArray interface over any contiguous
7block of elements.  <literal>multi_array_ref</literal> exports the
8same interface as <literal>multi_array</literal>, with the exception
9of the constructors.
10</para>
11
12
13<formalpara>
14      <title>Model Of.</title>
15<para>
16<literal>multi_array_ref</literal> models
17<link linkend="MultiArray">MultiArray</link>,
18<ulink url="../../../libs/utility/CopyConstructible.html">CopyConstructible</ulink>.
19and depending on the element type, it may also model
20<ulink url="https://www.boost.org/sgi/stl/EqualityComparable.html">EqualityComparable</ulink> and <ulink url="https://www.boost.org/sgi/stl/LessThanComparable.html">LessThanComparable</ulink>.
21Detailed descriptions are provided here only for operations that are
22not described in the <literal>multi_array</literal> reference.
23</para>
24</formalpara>
25
26<formalpara>
27<title>Synopsis</title>
28
29<programlisting>
30<![CDATA[
31namespace boost {
32
33template <typename ValueType,
34          std::size_t NumDims>
35class multi_array_ref {
36public:
37// types:
38  typedef ValueType                             element;
39  typedef *unspecified*                         value_type;
40  typedef *unspecified*                         reference;
41  typedef *unspecified*                         const_reference;
42  typedef *unspecified*                         difference_type;
43  typedef *unspecified*                         iterator;
44  typedef *unspecified*                         const_iterator;
45  typedef *unspecified*                         reverse_iterator;
46  typedef *unspecified*                         const_reverse_iterator;
47  typedef multi_array_types::size_type          size_type;
48  typedef multi_array_types::index              index;
49  typedef multi_array_types::index_gen          index_gen;
50  typedef multi_array_types::index_range        index_range;
51  typedef multi_array_types::extent_gen         extent_gen;
52  typedef multi_array_types::extent_range       extent_range;
53  typedef *unspecified*                         storage_order_type;
54
55  // template typedefs
56  template <std::size_t Dims> struct            subarray;
57  template <std::size_t Dims> struct            const_subarray;
58  template <std::size_t Dims> struct            array_view;
59  template <std::size_t Dims> struct            const_array_view;
60
61
62  static const std::size_t dimensionality = NumDims;
63
64
65  // constructors and destructors
66
67  template <typename ExtentList>
68  explicit multi_array_ref(element* data, const ExtentList& sizes,
69                       const storage_order_type& store = c_storage_order());
70  explicit multi_array_ref(element* data, const extents_tuple& ranges,
71                       const storage_order_type& store = c_storage_order());
72  multi_array_ref(const multi_array_ref& x);
73  ~multi_array_ref();
74
75  // modifiers
76
77  multi_array_ref& operator=(const multi_array_ref& x);
78  template <class Array> multi_array_ref& operator=(const Array& x);
79
80  // iterators:
81  iterator				begin();
82  iterator				end();
83  const_iterator			begin() const;
84  const_iterator			end() const;
85  reverse_iterator			rbegin();
86  reverse_iterator			rend();
87  const_reverse_iterator		rbegin() const;
88  const_reverse_iterator		rend() const;
89
90  // capacity:
91  size_type				size() const;
92  size_type				num_elements() const;
93  size_type				num_dimensions() const;
94
95  // element access:
96  template <typename IndexList>
97    element&			operator()(const IndexList& indices);
98  template <typename IndexList>
99    const element&		operator()(const IndexList& indices) const;
100  reference			operator[](index i);
101  const_reference		operator[](index i) const;
102  array_view<Dims>::type	operator[](const indices_tuple& r);
103  const_array_view<Dims>::type	operator[](const indices_tuple& r) const;
104
105  // queries
106  element*			data();
107  const element*		data() const;
108  element*			origin();
109  const element*		origin() const;
110  const size_type*		shape() const;
111  const index*			strides() const;
112  const index*			index_bases() const;
113  const storage_order_type&     storage_order() const;
114
115  // comparators
116  bool operator==(const multi_array_ref& rhs);
117  bool operator!=(const multi_array_ref& rhs);
118  bool operator<(const multi_array_ref& rhs);
119  bool operator>(const multi_array_ref& rhs);
120  bool operator>=(const multi_array_ref& rhs);
121  bool operator<=(const multi_array_ref& rhs);
122
123  // modifiers:
124  template <typename InputIterator>
125    void			assign(InputIterator begin, InputIterator end);
126  template <typename SizeList>
127    void			reshape(const SizeList& sizes)
128  template <typename BaseList>	void reindex(const BaseList& values);
129  void				reindex(index value);
130};
131]]>
132</programlisting>
133</formalpara>
134
135<formalpara>
136<title>Constructors</title>
137
138<variablelist>
139<varlistentry>
140<term><programlisting>template &lt;typename ExtentList&gt;
141explicit multi_array_ref(element* data,
142                     const ExtentList&amp; sizes,
143                     const storage_order&amp; store = c_storage_order(),
144                     const Allocator&amp; alloc = Allocator());
145</programlisting></term>
146<listitem>
147
148<para>
149This constructs a <literal>multi_array_ref</literal> using the specified
150parameters.  <literal>sizes</literal> specifies the shape of the
151constructed <literal>multi_array_ref</literal>.  <literal>store</literal>
152specifies the storage order or layout in memory of the array
153dimensions.  <literal>alloc</literal> is used to
154allocate the contained elements.
155</para>
156
157<formalpara><title><literal>ExtentList</literal> Requirements</title>
158<para>
159<literal>ExtentList</literal> must model <ulink url="../../utility/Collection.html">Collection</ulink>.
160</para>
161</formalpara>
162
163<formalpara><title>Preconditions</title>
164<para><literal>sizes.size() == NumDims;</literal></para>
165</formalpara>
166
167</listitem>
168</varlistentry>
169
170<varlistentry>
171<term>
172<programlisting><![CDATA[explicit multi_array_ref(element* data,
173                     extent_gen::gen_type<NumDims>::type ranges,
174                     const storage_order& store = c_storage_order());]]>
175</programlisting></term>
176<listitem>
177<para>
178This constructs a <literal>multi_array_ref</literal> using the specified
179    parameters.  <literal>ranges</literal> specifies the shape and
180index bases of the constructed multi_array_ref. It is the result of
181<literal>NumDims</literal> chained calls to
182    <literal>extent_gen::operator[]</literal>. <literal>store</literal>
183specifies the storage order or layout in memory of the array
184dimensions.
185</para>
186</listitem>
187</varlistentry>
188
189
190<varlistentry>
191<term><programlisting>
192<![CDATA[multi_array_ref(const multi_array_ref& x);]]>
193</programlisting></term>
194<listitem>
195<para>This constructs a shallow copy of <literal>x</literal>.
196</para>
197
198<formalpara>
199<title>Complexity</title>
200<para> Constant time (for contrast, compare this to
201the <literal>multi_array</literal> class copy constructor.
202</para></formalpara>
203</listitem>
204</varlistentry>
205
206</variablelist>
207
208</formalpara>
209
210
211<formalpara>
212<title>Modifiers</title>
213
214<variablelist>
215<varlistentry>
216
217<term><programlisting>
218<![CDATA[multi_array_ref& operator=(const multi_array_ref& x);
219template <class Array> multi_array_ref& operator=(const Array& x);]]>
220</programlisting>
221</term>
222
223<listitem>
224<para>This performs an element-wise copy of <literal>x</literal>
225into the current <literal>multi_array_ref</literal>.</para>
226
227<formalpara>
228<title><literal>Array</literal> Requirements</title>
229<para><literal>Array</literal> must model MultiArray.
230</para></formalpara>
231
232<formalpara>
233<title>Preconditions</title>
234<para>
235<programlisting>std::equal(this->shape(),this->shape()+this->num_dimensions(),
236x.shape());</programlisting></para>
237</formalpara>
238
239
240<formalpara>
241<title>Postconditions</title>
242<para>
243<programlisting>(*.this) == x;</programlisting>
244</para>
245</formalpara>
246
247<formalpara>
248<title>Complexity</title>
249<para>The assignment operators perform
250O(<literal>x.num_elements()</literal>) calls to <literal>element</literal>'s
251copy constructor.</para></formalpara>
252</listitem>
253</varlistentry>
254</variablelist>
255
256</formalpara>
257</sect2>
258