Skip to content

Commit e226540

Browse files
committed
Removed reinterpret_cast from SortedArray and the ArrayOfArrays family.
1 parent f27562a commit e226540

29 files changed

+489
-283
lines changed

benchmarks/benchmarkArrayOfArraysNodeToElementMapConstructionKernels.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ overAllocation( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUFFER >
6363
nodeToElementMap.resize( numNodes, maxNodeElements );
6464

6565
// Create an ArrayOfArraysView
66-
ArrayOfArraysView< INDEX_TYPE, INDEX_TYPE const, false, DEFAULT_BUFFER > const & nodeToElementMapView =
66+
ArrayOfArraysView< INDEX_TYPE, INDEX_TYPE const, false, DEFAULT_BUFFER > const nodeToElementMapView =
6767
nodeToElementMap.toView();
6868

6969
// Launch a RAJA kernel that populates the ArrayOfArraysView.
@@ -108,7 +108,7 @@ resizeFromCapacities( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUF
108108
nodeToElementMap.resizeFromCapacities< POLICY >( elementsPerNode.size(), elementsPerNode.data() );
109109

110110
// Create an ArrayOfArraysView
111-
ArrayOfArraysView< INDEX_TYPE, INDEX_TYPE const, false, DEFAULT_BUFFER > const & nodeToElementMapView =
111+
ArrayOfArraysView< INDEX_TYPE, INDEX_TYPE const, false, DEFAULT_BUFFER > const nodeToElementMapView =
112112
nodeToElementMap.toView();
113113

114114
// Launch a RAJA kernel that populates the ArrayOfArraysView.

benchmarks/benchmarkArrayOfArraysNodeToElementMapConstructionKernels.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class NaiveNodeToElemMapConstruction
5757

5858
RAJA::ReduceSum< typename RAJAHelper< EXEC_POLICY >::ReducePolicy, INDEX_TYPE > totalMapSize( 0 ); \
5959

60-
ArrayOfArraysViewT< INDEX_TYPE, true > const & nodeToElementMap = m_nodeToElementMap.toViewConstSizes();
60+
ArrayOfArraysViewT< INDEX_TYPE, true > const nodeToElementMap = m_nodeToElementMap.toViewConstSizes();
6161

6262
INDEX_TYPE const elemsX = m_numElemsX;
6363
INDEX_TYPE const elemsY = m_numElemsY;

benchmarks/benchmarkArrayOfArraysReduceKernels.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ class ArrayOfArraysReduce
7676

7777
void reduceFortranView()
7878
{
79-
ArrayOfArraysViewT< VALUE_TYPE const, true > const & view = m_array.toViewConst();
79+
ArrayOfArraysViewT< VALUE_TYPE const, true > const view = m_array.toViewConst();
8080
TIMING_LOOP( reduceFortranView( view ) );
8181
}
8282

8383
void reduceSubscriptView()
8484
{
85-
ArrayOfArraysViewT< VALUE_TYPE const, true > const & view = m_array.toViewConst();
85+
ArrayOfArraysViewT< VALUE_TYPE const, true > const view = m_array.toViewConst();
8686
TIMING_LOOP( reduceSubscriptView( view ) );
8787
}
8888

benchmarks/benchmarkSparsityGeneration.cpp

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,16 @@ namespace benchmarking
3030
benchmark::ClobberMemory(); \
3131
} \
3232

33-
void elemLoopNoPreallocationNative( ::benchmark::State & state )
34-
{
35-
SparsityGenerationNative kernels( state );
36-
TIMING_LOOP( kernels.resize( 0 ); kernels.generateElemLoop() );
37-
}
38-
3933
void elemLoopExactAllocationNative( benchmark::State & state )
4034
{
4135
SparsityGenerationNative kernels( state );
42-
TIMING_LOOP( kernels.resizeExact(); kernels.generateElemLoopView() );
36+
TIMING_LOOP( kernels.resizeExact(); kernels.generateElemLoop() );
4337
}
4438

4539
void elemLoopPreallocatedNative( benchmark::State & state )
4640
{
4741
SparsityGenerationNative kernels( state );
48-
TIMING_LOOP( kernels.resize( MAX_COLUMNS_PER_ROW ); kernels.generateElemLoopView() );
49-
}
50-
51-
void nodeLoopNoPreallocationNative( benchmark::State & state )
52-
{
53-
SparsityGenerationNative kernels( state );
54-
TIMING_LOOP( kernels.resize( 0 ); kernels.generateNodeLoop() );
42+
TIMING_LOOP( kernels.resize( MAX_COLUMNS_PER_ROW ); kernels.generateElemLoop() );
5543
}
5644

5745
void nodeLoopExactAllocationNative( benchmark::State & state )
@@ -63,23 +51,23 @@ void nodeLoopExactAllocationNative( benchmark::State & state )
6351
void nodeLoopPreallocatedNative( benchmark::State & state )
6452
{
6553
SparsityGenerationNative kernels( state );
66-
TIMING_LOOP( kernels.resize( MAX_COLUMNS_PER_ROW ); kernels.generateNodeLoopView() );
54+
TIMING_LOOP( kernels.resize( MAX_COLUMNS_PER_ROW ); kernels.generateNodeLoop() );
6755
}
6856

6957
template< typename POLICY >
7058
void nodeLoopExactAllocationRAJA( benchmark::State & state )
7159
{
7260
CALI_CXX_MARK_PRETTY_FUNCTION;
7361
SparsityGenerationRAJA< POLICY > kernels( state );
74-
TIMING_LOOP( kernels.resizeExact(); kernels.generateNodeLoopView() );
62+
TIMING_LOOP( kernels.resizeExact(); kernels.generateNodeLoop() );
7563
}
7664

7765
template< typename POLICY >
7866
void nodeLoopPreallocatedRAJA( benchmark::State & state )
7967
{
8068
CALI_CXX_MARK_PRETTY_FUNCTION;
8169
SparsityGenerationRAJA< POLICY > kernels( state );
82-
TIMING_LOOP( kernels.resize( MAX_COLUMNS_PER_ROW ); kernels.generateNodeLoopView() );
70+
TIMING_LOOP( kernels.resize( MAX_COLUMNS_PER_ROW ); kernels.generateNodeLoop() );
8371
}
8472

8573
template< typename POLICY >
@@ -90,7 +78,6 @@ void addToRow( benchmark::State & state )
9078
TIMING_LOOP( kernels.add() );
9179
}
9280

93-
int const NO_ALLOCATION_SIZE = 10;
9481
int const SERIAL_SIZE = 100;
9582

9683
#if defined(LVARRAY_USE_OPENMP)
@@ -104,10 +91,8 @@ int const CUDA_SIZE = 100;
10491
void registerBenchmarks()
10592
{
10693
// Register the native benchmarks.
107-
REGISTER_BENCHMARK( WRAP( { NO_ALLOCATION_SIZE, NO_ALLOCATION_SIZE, NO_ALLOCATION_SIZE } ), elemLoopNoPreallocationNative );
10894
REGISTER_BENCHMARK( WRAP( { SERIAL_SIZE, SERIAL_SIZE, SERIAL_SIZE } ), elemLoopExactAllocationNative );
10995
REGISTER_BENCHMARK( WRAP( { SERIAL_SIZE, SERIAL_SIZE, SERIAL_SIZE } ), elemLoopPreallocatedNative );
110-
REGISTER_BENCHMARK( WRAP( { NO_ALLOCATION_SIZE, NO_ALLOCATION_SIZE, NO_ALLOCATION_SIZE } ), nodeLoopNoPreallocationNative );
11196
REGISTER_BENCHMARK( WRAP( { SERIAL_SIZE, SERIAL_SIZE, SERIAL_SIZE } ), nodeLoopExactAllocationNative );
11297
REGISTER_BENCHMARK( WRAP( { SERIAL_SIZE, SERIAL_SIZE, SERIAL_SIZE } ), nodeLoopPreallocatedNative );
11398

benchmarks/benchmarkSparsityGenerationKernels.cpp

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ void SparsityGenerationNative::resizeFromNNZPerRow( std::vector< INDEX_TYPE > co
9696
m_sparsity = std::move( newSparsity );
9797
}
9898

99-
template< typename SPARSITY_TYPE >
100-
void SparsityGenerationNative::generateElemLoop( SPARSITY_TYPE & sparsity,
99+
void SparsityGenerationNative::generateElemLoop( SparsityPatternViewT const & sparsity,
101100
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & elemToNodeMap )
102101
{
103102
COLUMN_TYPE dofNumbers[ NODES_PER_ELEM * NDIM ];
@@ -123,8 +122,7 @@ void SparsityGenerationNative::generateElemLoop( SPARSITY_TYPE & sparsity,
123122
}
124123
}
125124

126-
template< typename SPARSITY_TYPE >
127-
void SparsityGenerationNative::generateNodeLoop( SPARSITY_TYPE & sparsity,
125+
void SparsityGenerationNative::generateNodeLoop( SparsityPatternViewT const & sparsity,
128126
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & elemToNodeMap,
129127
ArrayOfArraysViewT< INDEX_TYPE const, true > const & nodeToElemMap )
130128
{
@@ -148,8 +146,8 @@ resizeExact()
148146
using RESIZE_POLICY = serialPolicy;
149147
#endif
150148

151-
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & elemToNodeMap = m_elemToNodeMap.toViewConst();
152-
ArrayOfArraysViewT< INDEX_TYPE const, true > const & nodeToElemMap = m_nodeToElemMap.toViewConst();
149+
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const elemToNodeMap = m_elemToNodeMap.toViewConst();
150+
ArrayOfArraysViewT< INDEX_TYPE const, true > const nodeToElemMap = m_nodeToElemMap.toViewConst();
153151
forall< RESIZE_POLICY >( m_numNodes, [&nnzPerRow, elemToNodeMap, nodeToElemMap] ( INDEX_TYPE const nodeID )
154152
{
155153
INDEX_TYPE neighborNodes[ MAX_ELEMS_PER_NODE * NODES_PER_ELEM ];
@@ -233,25 +231,6 @@ addKernel( CRSMatrixViewConstSizesT const & matrix,
233231
} );
234232
}
235233

236-
// Explicit instantiation of the templated SparsityGenerationNative static methods.
237-
template void SparsityGenerationNative::generateElemLoop< SparsityPatternT >(
238-
SparsityPatternT &,
239-
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & );
240-
241-
template void SparsityGenerationNative::generateElemLoop< SparsityPatternViewT const >(
242-
SparsityPatternViewT const &,
243-
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & );
244-
245-
template void SparsityGenerationNative::generateNodeLoop< SparsityPatternT >(
246-
SparsityPatternT &,
247-
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const &,
248-
ArrayOfArraysViewT< INDEX_TYPE const, true > const & nodeToElemMap );
249-
250-
template void SparsityGenerationNative::generateNodeLoop< SparsityPatternViewT const >(
251-
SparsityPatternViewT const &,
252-
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const &,
253-
ArrayOfArraysViewT< INDEX_TYPE const, true > const & nodeToElemMap );
254-
255234
// Explicit instantiation of SparsityGenerationRAJA.
256235
template class SparsityGenerationRAJA< serialPolicy >;
257236
template class CRSMatrixAddToRow< serialPolicy >;

benchmarks/benchmarkSparsityGenerationKernels.hpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -168,29 +168,21 @@ class SparsityGenerationNative
168168

169169
void resizeExact();
170170

171-
void generateElemLoop()
172-
{ generateElemLoop( m_sparsity, m_elemToNodeMap.toViewConst() ); }
173-
174-
void generateElemLoopView() const
171+
void generateElemLoop() const
175172
{ generateElemLoop( m_sparsity.toView(), m_elemToNodeMap.toViewConst() ); }
176173

177-
void generateNodeLoop()
178-
{ generateNodeLoop( m_sparsity, m_elemToNodeMap.toViewConst(), m_nodeToElemMap.toViewConst() ); }
179-
180-
void generateNodeLoopView() const
174+
void generateNodeLoop() const
181175
{ generateNodeLoop( m_sparsity.toView(), m_elemToNodeMap.toViewConst(), m_nodeToElemMap.toViewConst() ); }
182176

183177
protected:
184178

185179
template< typename POLICY >
186180
void resizeFromNNZPerRow( std::vector< INDEX_TYPE > const & nnzPerRow );
187181

188-
template< typename SPARSITY_TYPE >
189-
static void generateElemLoop( SPARSITY_TYPE & sparsity,
182+
static void generateElemLoop( SparsityPatternViewT const & sparsity,
190183
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & elemToNodeMap );
191184

192-
template< typename SPARSITY_TYPE >
193-
static void generateNodeLoop( SPARSITY_TYPE & sparsity,
185+
static void generateNodeLoop( SparsityPatternViewT const & sparsity,
194186
ArrayViewT< INDEX_TYPE const, ELEM_TO_NODE_PERM > const & elemToNodeMap,
195187
ArrayOfArraysViewT< INDEX_TYPE const, true > const & nodeToElemMap );
196188

@@ -220,7 +212,7 @@ class SparsityGenerationRAJA : public SparsityGenerationNative
220212
m_nodeToElemMap.move( RAJAHelper< POLICY >::space, false );
221213
}
222214

223-
void generateNodeLoopView() const
215+
void generateNodeLoop() const
224216
{ generateNodeLoop( m_sparsity.toView(), m_elemToNodeMap.toViewConst(), m_nodeToElemMap.toViewConst(), m_state ); }
225217

226218
void resizeExact();
@@ -248,7 +240,10 @@ class CRSMatrixAddToRow : public SparsityGenerationRAJA< POLICY >
248240
#endif
249241

250242
SparsityGenerationRAJA< EXEC_POLICY >::generateNodeLoop( this->m_sparsity.toView(),
251-
this->m_elemToNodeMap.toViewConst(), this->m_nodeToElemMap.toViewConst(), this->m_state );
243+
this->m_elemToNodeMap.toViewConst(),
244+
this->m_nodeToElemMap.toViewConst(),
245+
this->m_state );
246+
252247
m_matrix.assimilate< EXEC_POLICY >( std::move( this->m_sparsity ) );
253248
m_matrix.toViewConstSizes().move( RAJAHelper< POLICY >::space );
254249
}

examples/exampleBuffers.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ CUDA_TEST( ChaiBuffer, captureOnDeviceConst )
129129

130130
// Create a const buffer and capture it in a device kernel which
131131
// creates an allocation on device and copies the data there.
132-
LvArray::ChaiBuffer< int const > const & constBuffer =
133-
reinterpret_cast< LvArray::ChaiBuffer< int const > const & >( buffer );
132+
LvArray::ChaiBuffer< int const > const constBuffer( buffer );
134133
RAJA::forall< RAJA::cuda_exec< 32 > >(
135134
RAJA::TypedRangeSegment< std::ptrdiff_t >( 0, size ),
136135
[constBuffer] __device__ ( std::ptrdiff_t const i )

examples/exampleSparsityPatternAndCRSMatrix.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ TEST( CRSMatrix, views )
162162
// pattern in parallel.
163163
LvArray::SparsityPatternView< int,
164164
std::ptrdiff_t const,
165-
LvArray::MallocBuffer > const & sparsityView = sparsity.toView();
165+
LvArray::MallocBuffer > const sparsityView = sparsity.toView();
166166

167167
RAJA::forall< RAJA::omp_parallel_for_exec >(
168168
RAJA::TypedRangeSegment< std::ptrdiff_t >( 0, sparsityView.numRows() ),
@@ -183,7 +183,7 @@ TEST( CRSMatrix, views )
183183
LvArray::CRSMatrixView< double,
184184
int const,
185185
std::ptrdiff_t const,
186-
LvArray::MallocBuffer > const & matrixView = matrix.toViewConstSizes();
186+
LvArray::MallocBuffer > const matrixView = matrix.toViewConstSizes();
187187
RAJA::forall< RAJA::omp_parallel_for_exec >(
188188
RAJA::TypedRangeSegment< std::ptrdiff_t >( 0, matrixView.numRows() ),
189189
[matrixView] ( std::ptrdiff_t const row )

src/ArrayOfArrays.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ class ArrayOfArrays : protected ArrayOfArraysView< T, INDEX_TYPE, false, BUFFER_
9494
* IS_VALID_EXPRESSION and this fails with NVCC.
9595
*/
9696
constexpr inline
97-
ArrayOfArraysView< T, INDEX_TYPE const, false, BUFFER_TYPE > const &
97+
ArrayOfArraysView< T, INDEX_TYPE const, false, BUFFER_TYPE >
9898
toView() const LVARRAY_RESTRICT_THIS
99-
{ return reinterpret_cast< ArrayOfArraysView< T, INDEX_TYPE const, false, BUFFER_TYPE > const & >( *this ); }
99+
{ return ParentClass::toView(); }
100100

101101
/**
102102
* @copydoc ParentClass::toViewConstSizes
@@ -105,7 +105,7 @@ class ArrayOfArrays : protected ArrayOfArraysView< T, INDEX_TYPE, false, BUFFER_
105105
* IS_VALID_EXPRESSION and this fails with NVCC.
106106
*/
107107
constexpr inline
108-
ArrayOfArraysView< T, INDEX_TYPE const, true, BUFFER_TYPE > const &
108+
ArrayOfArraysView< T, INDEX_TYPE const, true, BUFFER_TYPE >
109109
toViewConstSizes() const LVARRAY_RESTRICT_THIS
110110
{ return ParentClass::toViewConstSizes(); }
111111

@@ -116,7 +116,7 @@ class ArrayOfArrays : protected ArrayOfArraysView< T, INDEX_TYPE, false, BUFFER_
116116
* IS_VALID_EXPRESSION and this fails with NVCC.
117117
*/
118118
constexpr inline
119-
ArrayOfArraysView< T const, INDEX_TYPE const, true, BUFFER_TYPE > const &
119+
ArrayOfArraysView< T const, INDEX_TYPE const, true, BUFFER_TYPE >
120120
toViewConst() const LVARRAY_RESTRICT_THIS
121121
{ return ParentClass::toViewConst(); }
122122

src/ArrayOfArraysView.hpp

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ class ArrayOfArraysView
170170
protected:
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+
173177
public:
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

Comments
 (0)