@@ -209,42 +209,6 @@ class slice
209209
210210enum class mdarray_order {row_major, column_major};
211211
212- struct row_major_layout
213- {
214- std::vector<std::size_t > operator ()(jsoncons::span<const std::size_t > extents) const
215- {
216- std::vector<std::size_t > strides (extents.size (), 0 );
217-
218- std::size_t size = 1 ;
219- const size_t num_extents = extents.size ();
220- for (size_t i = 0 ; i < num_extents; ++i)
221- {
222- strides[num_extents-i-1 ] = size;
223- size *= extents[num_extents-i-1 ];
224- }
225-
226- return strides;
227- }
228- };
229-
230- struct column_major_layout
231- {
232- std::vector<std::size_t > operator ()(jsoncons::span<const std::size_t > extents) const
233- {
234- std::vector<std::size_t > strides (extents.size (), 0 );
235-
236- std::size_t size = 1 ;
237- const size_t num_extents = extents.size ();
238- for (size_t i = 0 ; i < num_extents; ++i)
239- {
240- strides[i] = size;
241- size *= extents[i];
242- }
243-
244- return strides;
245- }
246- };
247-
248212class typed_array_iterator
249213{
250214public:
@@ -281,7 +245,7 @@ class typed_array_iterator
281245};
282246
283247template <typename ValueType, typename Func=jsoncons::identity>
284- class typed_array_span_iterator : public typed_array_iterator
248+ class sequential_typed_array_iterator : public typed_array_iterator
285249{
286250 jsoncons::span<ValueType> data_;
287251 semantic_tag tag_;
@@ -290,7 +254,7 @@ class typed_array_span_iterator : public typed_array_iterator
290254 bool done_{false };
291255 std::size_t index_{0 };
292256public:
293- typed_array_span_iterator (jsoncons::span<ValueType> data,
257+ sequential_typed_array_iterator (jsoncons::span<ValueType> data,
294258 semantic_tag tag = semantic_tag{}, Func func = Func())
295259 : data_(data), tag_(tag), func_(func)
296260 {
@@ -340,12 +304,31 @@ class mdarray_iterator : public typed_array_iterator
340304 bool first_{true };
341305 bool done_{false };
342306public:
343- template <typename Layout= jsoncons::row_major_layout>
344307 mdarray_iterator (jsoncons::span<ValueType> data, jsoncons::span<const std::size_t > extents,
345- Layout layout = Layout() )
308+ mdarray_order order = mdarray_order::row_major )
346309 : data_{data}, dimensions_(extents.size(), mdarray_dimension<ValueType>{})
347310 {
348- std::vector<std::size_t > strides = layout (extents);
311+ std::vector<std::size_t > strides (extents.size (), 0 );
312+ if (order == mdarray_order::column_major)
313+ {
314+ std::size_t stride = 1 ;
315+ const size_t num_extents = extents.size ();
316+ for (size_t i = 0 ; i < num_extents; ++i)
317+ {
318+ strides[i] = stride;
319+ stride *= extents[i];
320+ }
321+ }
322+ else
323+ {
324+ std::size_t stride = 1 ;
325+ const size_t num_extents = extents.size ();
326+ for (size_t i = 0 ; i < num_extents; ++i)
327+ {
328+ strides[num_extents-i-1 ] = stride;
329+ stride *= extents[num_extents-i-1 ];
330+ }
331+ }
349332 for (std::size_t i = 0 ; i < strides.size (); ++i)
350333 {
351334 dimensions_[i].extent = extents[i];
0 commit comments