LvArray
ArrayOfArrays.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021, Lawrence Livermore National Security, LLC and LvArray contributors.
3  * All rights reserved.
4  * See the LICENSE file for details.
5  * SPDX-License-Identifier: (BSD-3-Clause)
6  */
7 
13 #pragma once
14 
15 #include "ArrayOfArraysView.hpp"
16 
17 namespace LvArray
18 {
19 
20 // Forward declaration of the ArrayOfSets class so that we can define the assimilate method.
21 template< typename T, typename INDEX_TYPE, template< typename > class BUFFER_TYPE >
23 
30 template< typename T,
31  typename INDEX_TYPE,
32  template< typename > class BUFFER_TYPE >
33 class ArrayOfArrays : protected ArrayOfArraysView< T, INDEX_TYPE, false, BUFFER_TYPE >
34 {
37 
38 public:
39  using typename ParentClass::ValueType;
40  using typename ParentClass::IndexType;
41  using typename ParentClass::value_type;
42  using typename ParentClass::size_type;
43 
47 
54  inline
55  ArrayOfArrays( INDEX_TYPE const numArrays=0, INDEX_TYPE const defaultArrayCapacity=0 ):
56  ParentClass( true )
57  {
58  resize( numArrays, defaultArrayCapacity );
59  setName( "" );
60  }
61 
66  inline
67  ArrayOfArrays( ArrayOfArrays const & src ):
68  ParentClass( true )
69  { *this = src; }
70 
74  inline
75  ArrayOfArrays( ArrayOfArrays && ) = default;
76 
81  { ParentClass::free(); }
82 
84 
88 
96  constexpr inline
98  toView() const &
99  { return ParentClass::toView(); }
100 
108  constexpr inline
110  toView() const && = delete;
111 
118  constexpr inline
121  { return ParentClass::toViewConstSizes(); }
122 
130  constexpr inline
132  toViewConstSizes() const && = delete;
133 
140  constexpr inline
142  toViewConst() const &
143  { return ParentClass::toViewConst(); }
144 
152  constexpr inline
154  toViewConst() const && = delete;
155 
157 
161 
168  inline
170  {
172  src.m_offsets[ src.m_numArrays ],
173  src.m_offsets,
174  src.m_sizes,
175  src.m_values );
176  return *this;
177  }
178 
184  inline
186  {
188  ParentClass::operator=( std::move( src ) );
189  return *this;
190  }
191 
196  inline
198  {
200  ParentClass::assimilate( reinterpret_cast< ParentClass && >( src ) );
201  }
202 
205 
207 
211 
219  inline
220  INDEX_TYPE size() const
221  { return ParentClass::size(); }
222 
224  using ParentClass::capacity;
227 
229 
233 
235  using ParentClass::operator[];
236  using ParentClass::operator();
237 
239 
243 
245  using ParentClass::reserve;
247 
254  void resize( INDEX_TYPE const newSize, INDEX_TYPE const defaultArrayCapacity=0 )
255  { return ParentClass::resize( newSize, defaultArrayCapacity ); }
256 
257  using ParentClass::compress;
258 
260 
264 
270  void appendArray( INDEX_TYPE const n )
271  {
273 
274  INDEX_TYPE const maxOffset = this->m_offsets[ this->m_numArrays ];
275  bufferManipulation::emplaceBack( this->m_offsets, this->m_numArrays + 1, maxOffset );
277  ++this->m_numArrays;
278 
279  resizeArray( this->m_numArrays - 1, n );
280  }
281 
288  template< typename ITER >
289  void appendArray( ITER const first, ITER const last )
290  {
291  INDEX_TYPE const maxOffset = this->m_offsets[ this->m_numArrays ];
292  bufferManipulation::emplaceBack( this->m_offsets, this->m_numArrays + 1, maxOffset );
294  ++this->m_numArrays;
295 
296  appendToArray( this->m_numArrays - 1, first, last );
297  }
298 
306  template< typename ITER >
307  void insertArray( INDEX_TYPE const i, ITER const first, ITER const last )
308  {
310 
311  // Insert an array of capacity zero at the given location
312  INDEX_TYPE const offset = this->m_offsets[ i ];
313  bufferManipulation::emplace( this->m_offsets, this->m_numArrays + 1, i + 1, offset );
314  bufferManipulation::emplace( this->m_sizes, this->m_numArrays, i, 0 );
315  ++this->m_numArrays;
316 
317  // Append to the new array
318  appendToArray( i, first, last );
319  }
320 
325  void eraseArray( INDEX_TYPE const i )
326  {
328 
329  setCapacityOfArray( i, 0 );
330  bufferManipulation::erase( this->m_offsets, this->m_numArrays + 1, i + 1 );
331  bufferManipulation::erase( this->m_sizes, this->m_numArrays, i );
332  --this->m_numArrays;
333  }
334 
336 
340 
348  template< typename ... ARGS >
349  void emplaceBack( INDEX_TYPE const i, ARGS && ... args )
350  {
351  dynamicallyGrowArray( i, 1 );
352  ParentClass::emplaceBack( i, std::forward< ARGS >( args )... );
353  }
354 
362  template< typename ITER >
363  void appendToArray( INDEX_TYPE const i, ITER const first, ITER const last )
364  {
365  INDEX_TYPE const n = arrayManipulation::iterDistance( first, last );
366  dynamicallyGrowArray( i, n );
367  ParentClass::appendToArray( i, first, last );
368  }
369 
371 
379  template< typename ... ARGS >
380  void emplace( INDEX_TYPE const i, INDEX_TYPE const j, ARGS && ... args )
381  {
382  dynamicallyGrowArray( i, 1 );
383  ParentClass::emplace( i, j, std::forward< ARGS >( args )... );
384  }
385 
394  template< typename ITER >
395  void insertIntoArray( INDEX_TYPE const i, INDEX_TYPE const j, ITER const first, ITER const last )
396  {
397  INDEX_TYPE const n = arrayManipulation::iterDistance( first, last );
398  dynamicallyGrowArray( i, n );
399  ParentClass::insertIntoArray( i, j, first, last );
400  }
401 
403 
411  template< class ... ARGS >
412  void resizeArray( INDEX_TYPE const i, INDEX_TYPE const newSize, ARGS && ... args )
413  {
416 
417  if( newSize > capacityOfArray( i ) )
418  {
419  setCapacityOfArray( i, newSize );
420  }
421 
422  INDEX_TYPE const prevSize = sizeOfArray( i );
423  T * const values = (*this)[i];
424  arrayManipulation::resize( values, prevSize, newSize, std::forward< ARGS >( args )... );
425  this->m_sizes[ i ] = newSize;
426  }
427 
432  void clearArray( INDEX_TYPE const i )
433  { resizeArray( i, 0 ); }
434 
440  void setCapacityOfArray( INDEX_TYPE const i, INDEX_TYPE const newCapacity )
441  { ParentClass::setCapacityOfArray( i, newCapacity ); }
442 
444 
448 
456  void move( MemorySpace const space, bool touch=true ) const
457  { ParentClass::move( space, touch ); }
458 
460 
465  void setName( std::string const & name )
466  { ParentClass::template setName< decltype( *this ) >( name ); }
467 
468 private:
469 
475  void dynamicallyGrowArray( INDEX_TYPE const i, INDEX_TYPE const increase )
476  {
478 
479  INDEX_TYPE const newArraySize = sizeOfArray( i ) + increase;
480  if( newArraySize > capacityOfArray( i ))
481  {
482  setCapacityOfArray( i, 2 * newArraySize );
483  }
484  }
485 };
486 
487 } /* namespace LvArray */
void emplace(BUFFER &buf, std::ptrdiff_t const size, std::ptrdiff_t const pos, ARGS &&... args)
Construct a new value at position pos.
Definition: bufferManipulation.hpp:315
void assimilate(ArrayOfSets< T, INDEX_TYPE, BUFFER_TYPE > &&src)
Steal the resources from an ArrayOfSets and convert it to an ArrayOfArrays.
Definition: ArrayOfArrays.hpp:197
#define LVARRAY_ASSERT(EXP)
Assert EXP is true with no message.
Definition: Macros.hpp:223
LVARRAY_HOST_DEVICE constexpr ArrayOfArraysView< T, INDEX_TYPE const, CONST_SIZES, BUFFER_TYPE > toView() const
Definition: ArrayOfArraysView.hpp:279
constexpr ArrayOfArraysView< T, INDEX_TYPE const, false, BUFFER_TYPE > toView() const &
Definition: ArrayOfArrays.hpp:98
void emplaceBack(BUFFER &buf, std::ptrdiff_t const size, ARGS &&... args)
Construct a new value at the end of the buffer.
Definition: bufferManipulation.hpp:297
#define ARRAYOFARRAYS_CHECK_BOUNDS(i)
Check that i is a valid array index.
Definition: ArrayOfArraysView.hpp:106
ArrayOfArrays(INDEX_TYPE const numArrays=0, INDEX_TYPE const defaultArrayCapacity=0)
Constructor.
Definition: ArrayOfArrays.hpp:55
INDEX_TYPE size_type
The integer type used for indexing, here for stl compatability.
Definition: ArrayOfArraysView.hpp:194
void emplaceBack(INDEX_TYPE const i, ARGS &&... args)
Append a value to an array constructing it in place with the given arguments.
Definition: ArrayOfArrays.hpp:349
void reserve(INDEX_TYPE const newCapacity)
Reserve space for the given number of arrays.
Definition: ArrayOfArraysView.hpp:638
void dynamicallyGrowArray(INDEX_TYPE const i, INDEX_TYPE const increase)
Dynamically grow the capacity of an array.
Definition: ArrayOfArrays.hpp:475
INDEX_TYPE IndexType
The integer type used for indexing.
Definition: ArrayOfArraysView.hpp:188
constexpr ArrayOfArraysView< T, INDEX_TYPE const, true, BUFFER_TYPE > toViewConstSizes() const &
Definition: ArrayOfArrays.hpp:120
void resize(INDEX_TYPE const newSize, INDEX_TYPE const defaultArrayCapacity=0)
Set the number of arrays.
Definition: ArrayOfArrays.hpp:254
BUFFER_TYPE< INDEX_TYPE > m_offsets
Definition: ArrayOfArraysView.hpp:965
LVARRAY_HOST_DEVICE CONSTEXPR_WITH_NDEBUG INDEX_TYPE_NC capacity() const
Definition: ArrayOfArraysView.hpp:373
BUFFER_TYPE< T > m_values
Definition: ArrayOfArraysView.hpp:972
void move(MemorySpace const space, bool touch=true) const
Move this ArrayOfArrays to the given memory space.
Definition: ArrayOfArraysView.hpp:584
void insertIntoArray(INDEX_TYPE const i, INDEX_TYPE const j, ITER const first, ITER const last)
Insert values into an array.
Definition: ArrayOfArrays.hpp:395
LVARRAY_HOST_DEVICE void emplaceBack(INDEX_TYPE const i, ARGS &&... args) const
Append a value to an array.
Definition: ArrayOfArraysView.hpp:444
INDEX_TYPE size() const
Definition: ArrayOfArrays.hpp:220
BUFFER_TYPE< SIZE_TYPE > m_sizes
Holds the size of each array.
Definition: ArrayOfArraysView.hpp:968
LVARRAY_HOST_DEVICE void appendToArray(INDEX_TYPE const i, ITER const first, ITER const last) const
Append values to an array.
Definition: ArrayOfArraysView.hpp:487
DISABLE_HD_WARNING LVARRAY_HOST_DEVICE void resize(T *const LVARRAY_RESTRICT ptr, std::ptrdiff_t const size, std::ptrdiff_t const newSize, ARGS &&... args)
Resize the give array.
Definition: arrayManipulation.hpp:283
T value_type
An alias for the type contained in the inner arrays, here for stl compatability.
Definition: ArrayOfArraysView.hpp:191
void appendArray(ITER const first, ITER const last)
Append an array.
Definition: ArrayOfArrays.hpp:289
void compress(BUFFERS &... buffers)
Compress the arrays so that the values of each array are contiguous with no extra capacity in between...
Definition: ArrayOfArraysView.hpp:669
LVARRAY_HOST_DEVICE void emplace(INDEX_TYPE const i, INDEX_TYPE const j, ARGS &&... args) const
Insert a value into an array.
Definition: ArrayOfArraysView.hpp:508
This class implements an array of arrays like object with contiguous storage.
Definition: ArrayOfArrays.hpp:33
LVARRAY_HOST_DEVICE constexpr std::enable_if< std::is_signed< INDEX_TYPE >::value, bool >::type isPositive(INDEX_TYPE const i)
Definition: arrayManipulation.hpp:82
ArrayOfArraysView & operator=(ArrayOfArraysView const &)=default
Default copy assignment operator.
void resize(INDEX_TYPE const newSize, INDEX_TYPE const defaultArrayCapacity=0)
Set the number of arrays.
Definition: ArrayOfArraysView.hpp:631
void setCapacityOfArray(INDEX_TYPE const i, INDEX_TYPE const newCapacity)
Set the capacity of an array.
Definition: ArrayOfArrays.hpp:440
void insertArray(INDEX_TYPE const i, ITER const first, ITER const last)
Insert an array.
Definition: ArrayOfArrays.hpp:307
ArrayOfArrays(ArrayOfArrays const &src)
Copy constructor, performs a deep copy.
Definition: ArrayOfArrays.hpp:67
This class provides a view into an array of arrays like object.
Definition: ArrayOfArraysView.hpp:170
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC valueCapacity() const
Definition: ArrayOfArraysView.hpp:394
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK INDEX_TYPE_NC sizeOfArray(INDEX_TYPE const i) const
Definition: ArrayOfArraysView.hpp:332
#define ARRAYOFARRAYS_CHECK_INSERT_BOUNDS(i)
Check that i is a valid index to insert an array at.
Definition: ArrayOfArraysView.hpp:121
void appendToArray(INDEX_TYPE const i, ITER const first, ITER const last)
Append values to an array.
Definition: ArrayOfArrays.hpp:363
camp::resources::Platform MemorySpace
an alias for camp::resources::Platform.
Definition: bufferManipulation.hpp:31
LVARRAY_HOST_DEVICE constexpr ArrayOfArraysView< T, INDEX_TYPE const, true, BUFFER_TYPE > toViewConstSizes() const
Definition: ArrayOfArraysView.hpp:292
LVARRAY_HOST_DEVICE void emplaceBackAtomic(INDEX_TYPE const i, ARGS &&... args) const
Append a value to an array in a thread safe manner.
Definition: ArrayOfArraysView.hpp:465
The top level namespace.
Definition: Array.hpp:24
void appendArray(INDEX_TYPE const n)
Append an array.
Definition: ArrayOfArrays.hpp:270
Contains the implementation of LvArray::ArrayOfArraysView.
ArrayOfArrays & operator=(ArrayOfArrays &&src)
Default move assignment operator, performs a shallow copy.
Definition: ArrayOfArrays.hpp:185
This class implements an array of sets like object with contiguous storage.
Definition: ArrayOfArrays.hpp:22
void resizeFromCapacities(INDEX_TYPE const numSubArrays, INDEX_TYPE const *const capacities, BUFFERS &... buffers)
Clears the array and creates a new array with the given number of sub-arrays.
Definition: ArrayOfArraysView.hpp:725
~ArrayOfArrays()
Destructor, frees the values, sizes and offsets buffers.
Definition: ArrayOfArrays.hpp:80
void setEqualTo(INDEX_TYPE const srcNumArrays, INDEX_TYPE const srcMaxOffset, BUFFER_TYPE< INDEX_TYPE > const &srcOffsets, BUFFER_TYPE< INDEX_TYPE > const &srcSizes, BUFFER_TYPE< T > const &srcValues, PAIRS_OF_BUFFERS &&... pairs)
Set this ArrayOfArraysView equal to the provided arrays.
Definition: ArrayOfArraysView.hpp:830
void clearArray(INDEX_TYPE const i)
Clear the given array.
Definition: ArrayOfArrays.hpp:432
INDEX_TYPE_NC m_numArrays
The number of arrays contained.
Definition: ArrayOfArraysView.hpp:961
void emplace(INDEX_TYPE const i, INDEX_TYPE const j, ARGS &&... args)
Insert a value into an array constructing it in place.
Definition: ArrayOfArrays.hpp:380
void free(BUFFERS &... buffers)
Destroy all the objects held by this array and free all associated memory.
Definition: ArrayOfArraysView.hpp:806
LVARRAY_HOST_DEVICE CONSTEXPR_WITHOUT_BOUNDS_CHECK INDEX_TYPE_NC capacityOfArray(INDEX_TYPE const i) const
Definition: ArrayOfArraysView.hpp:384
LVARRAY_HOST_DEVICE void insertIntoArray(INDEX_TYPE const i, INDEX_TYPE const j, ITER const first, ITER const last) const
Insert values into an array.
Definition: ArrayOfArraysView.hpp:530
LVARRAY_HOST_DEVICE void eraseFromArray(INDEX_TYPE const i, INDEX_TYPE const j, INDEX_TYPE const n=1) const
Erase values from an array.
Definition: ArrayOfArraysView.hpp:551
void setCapacityOfArray(INDEX_TYPE const i, INDEX_TYPE const newCapacity, BUFFERS &... buffers)
Set the capacity of the given array.
Definition: ArrayOfArraysView.hpp:877
void assimilate(ArrayOfArraysView< T, INDEX_TYPE, CONST_SIZES, BUFFER_TYPE > &&src)
Steal the resources of src, clearing it in the process.
Definition: ArrayOfArraysView.hpp:749
void move(MemorySpace const space, bool touch=true) const
Move this ArrayOfArrays to the given memory space.
Definition: ArrayOfArrays.hpp:456
void setName(std::string const &name)
Set the name to be displayed whenever the underlying Buffer&#39;s user call back is called.
Definition: ArrayOfArrays.hpp:465
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC size() const
Definition: ArrayOfArraysView.hpp:324
LVARRAY_HOST_DEVICE constexpr ArrayOfArraysView< T const, INDEX_TYPE const, true, BUFFER_TYPE > toViewConst() const
Definition: ArrayOfArraysView.hpp:305
DISABLE_HD_WARNING constexpr LVARRAY_HOST_DEVICE std::iterator_traits< ITER >::difference_type iterDistance(ITER first, ITER const last, std::input_iterator_tag)
Definition: arrayManipulation.hpp:105
void eraseArray(INDEX_TYPE const i)
Erase an array.
Definition: ArrayOfArrays.hpp:325
ArrayOfArrays & operator=(ArrayOfArrays const &src)
Copy assignment operator, performs a deep copy.
Definition: ArrayOfArrays.hpp:169
void reserveValues(INDEX_TYPE const newValueCapacity, BUFFERS &... buffers)
Reserve space for the given number of values.
Definition: ArrayOfArraysView.hpp:652
void resizeArray(INDEX_TYPE const i, INDEX_TYPE const newSize, ARGS &&... args)
Set the number of values in an array.
Definition: ArrayOfArrays.hpp:412
void erase(BUFFER &buf, std::ptrdiff_t const size, std::ptrdiff_t const pos)
Erase a value from the buffer.
Definition: bufferManipulation.hpp:373
T ValueType
An alias for the type contained in the inner arrays.
Definition: ArrayOfArraysView.hpp:185
void resizeFromOffsets(INDEX_TYPE const numSubArrays, INDEX_TYPE const *const offsets, BUFFERS &... buffers)
Clears the array and creates a new array with the given number of sub-arrays.
Definition: ArrayOfArraysView.hpp:702
constexpr ArrayOfArraysView< T const, INDEX_TYPE const, true, BUFFER_TYPE > toViewConst() const &
Definition: ArrayOfArrays.hpp:142