@@ -170,6 +170,10 @@ class ArrayOfArraysView
170170protected:
171171 // / Since INDEX_TYPE should always be const we need an alias for the non const version.
172172 using INDEX_TYPE_NC = std::remove_const_t < INDEX_TYPE >;
173+
174+ // / The type contained by the m_sizes buffer.
175+ using SIZE_TYPE = std::conditional_t < CONST_SIZES, INDEX_TYPE const , INDEX_TYPE_NC >;
176+
173177public:
174178 static_assert ( !std::is_const< T >::value || (std::is_const< INDEX_TYPE >::value && CONST_SIZES),
175179 " When T is const INDEX_TYPE must also be const and CONST_SIZES must be true" );
@@ -211,14 +215,32 @@ class ArrayOfArraysView
211215 { src.m_numArrays = 0 ; }
212216
213217 /* *
214- * @brief Default copy assignment operator, this does a shallow copy.
218+ * @brief Construct a new ArrayOfArraysView from the given buffers.
219+ * @param numArrays The number of arrays.
220+ * @param offsets The offsets buffer, of size @p numArrays + 1.
221+ * @param sizes The sizes buffer, of size @p numArrays.
222+ * @param values The values buffer, of size @p offsets[ numArrays ].
223+ */
224+ LVARRAY_HOST_DEVICE constexpr inline
225+ ArrayOfArraysView ( INDEX_TYPE const numArrays,
226+ BUFFER_TYPE< INDEX_TYPE > const & offsets,
227+ BUFFER_TYPE< SIZE_TYPE > const & sizes,
228+ BUFFER_TYPE< T > const & values ):
229+ m_numArrays ( numArrays ),
230+ m_offsets ( offsets ),
231+ m_sizes ( sizes ),
232+ m_values ( values )
233+ {}
234+
235+ /* *
236+ * @brief Default copy assignment operator.
215237 * @return *this.
216238 */
217239 inline
218240 ArrayOfArraysView & operator =( ArrayOfArraysView const & ) = default ;
219241
220242 /* *
221- * @brief Default move assignment operator, this does a shallow copy .
243+ * @brief Move assignment operator. .
222244 * @param src the SparsityPatternView to be moved from.
223245 * @return *this.
224246 */
@@ -241,28 +263,43 @@ class ArrayOfArraysView
241263 // /@{
242264
243265 /* *
244- * @return Return a reference to *this reinterpreted as an ArrayOfArraysView<T, INDEX_TYPE const, CONST_SIZES>.
266+ * @return Return a new ArrayOfArraysView<T, INDEX_TYPE const, CONST_SIZES>.
245267 */
246268 LVARRAY_HOST_DEVICE constexpr inline
247- ArrayOfArraysView< T, INDEX_TYPE const , CONST_SIZES, BUFFER_TYPE > const &
269+ ArrayOfArraysView< T, INDEX_TYPE const , CONST_SIZES, BUFFER_TYPE >
248270 toView () const LVARRAY_RESTRICT_THIS
249- { return reinterpret_cast < ArrayOfArraysView< T, INDEX_TYPE const , CONST_SIZES, BUFFER_TYPE > const & >( *this ); }
271+ {
272+ return ArrayOfArraysView< T, INDEX_TYPE const , CONST_SIZES, BUFFER_TYPE >( size (),
273+ this ->m_offsets ,
274+ this ->m_sizes ,
275+ this ->m_values );
276+ }
250277
251278 /* *
252- * @return Return a reference to *this reinterpreted as an ArrayOfArraysView<T, INDEX_TYPE const, true>.
279+ * @return Return a new ArrayOfArraysView<T, INDEX_TYPE const, true>.
253280 */
254281 LVARRAY_HOST_DEVICE constexpr inline
255- ArrayOfArraysView< T, INDEX_TYPE const , true , BUFFER_TYPE > const &
282+ ArrayOfArraysView< T, INDEX_TYPE const , true , BUFFER_TYPE >
256283 toViewConstSizes () const LVARRAY_RESTRICT_THIS
257- { return reinterpret_cast < ArrayOfArraysView< T, INDEX_TYPE const , true , BUFFER_TYPE > const & >( *this ); }
284+ {
285+ return ArrayOfArraysView< T, INDEX_TYPE const , true , BUFFER_TYPE >( size (),
286+ this ->m_offsets ,
287+ this ->m_sizes ,
288+ this ->m_values );
289+ }
258290
259291 /* *
260- * @return Return a reference to *this reinterpreted as an ArrayOfArraysView<T const, INDEX_TYPE const, true>.
292+ * @return Return a new ArrayOfArraysView<T const, INDEX_TYPE const, true>.
261293 */
262294 LVARRAY_HOST_DEVICE constexpr inline
263- ArrayOfArraysView< T const , INDEX_TYPE const , true , BUFFER_TYPE > const &
295+ ArrayOfArraysView< T const , INDEX_TYPE const , true , BUFFER_TYPE >
264296 toViewConst () const LVARRAY_RESTRICT_THIS
265- { return reinterpret_cast < ArrayOfArraysView< T const , INDEX_TYPE const , true , BUFFER_TYPE > const & >( *this ); }
297+ {
298+ return ArrayOfArraysView< T const , INDEX_TYPE const , true , BUFFER_TYPE >( size (),
299+ this ->m_offsets ,
300+ this ->m_sizes ,
301+ this ->m_values );
302+ }
266303
267304 // /@}
268305
@@ -888,7 +925,7 @@ class ArrayOfArraysView
888925 BUFFER_TYPE< INDEX_TYPE > m_offsets;
889926
890927 // / Holds the size of each array.
891- BUFFER_TYPE< std:: conditional_t < CONST_SIZES, INDEX_TYPE const , INDEX_TYPE_NC > > m_sizes;
928+ BUFFER_TYPE< SIZE_TYPE > m_sizes;
892929
893930 // / Holds the values of each array. Values in the range [m_offsets[ i ], m_offsets[ i ] + m_sizes[ i ])
894931 // / are valid. All other entries contain uninitialized values.
0 commit comments