20 #ifndef RAJA_PATTERN_WORKGROUP_WorkStorage_HPP
21 #define RAJA_PATTERN_WORKGROUP_WorkStorage_HPP
23 #include "RAJA/config.hpp"
28 #include <type_traits>
50 template<
typename iterator_base>
53 using base = iterator_base;
70 return *
static_cast<base const&
>(*this);
110 static_cast<base&
>(*this) += rhs;
151 return static_cast<base const&
>(lhs) -
static_cast<base const&
>(rhs);
158 return static_cast<base const&
>(lhs) ==
static_cast<base const&
>(rhs);
165 return !(lhs == rhs);
172 return static_cast<base const&
>(lhs) <
static_cast<base const&
>(rhs);
201 template<
typename STORAGE_POLICY_T,
typename ALLOCATOR_T,
typename Dispatcher_T>
204 template<
typename ALLOCATOR_T,
typename Dispatcher_T>
207 using allocator_traits_type = std::allocator_traits<ALLOCATOR_T>;
208 using propagate_on_container_copy_assignment =
209 typename allocator_traits_type::propagate_on_container_copy_assignment;
210 using propagate_on_container_move_assignment =
211 typename allocator_traits_type::propagate_on_container_move_assignment;
212 using propagate_on_container_swap =
213 typename allocator_traits_type::propagate_on_container_swap;
215 std::is_same<typename allocator_traits_type::value_type, char>::value,
216 "WorkStorage expects an allocator for 'char's.");
222 template<
typename holder>
236 struct pointer_and_size
245 struct const_iterator_base
248 using pointer =
typename WorkStorage::const_pointer;
249 using reference =
typename WorkStorage::const_reference;
264 const_iterator_base
const& lhs_iter,
265 const_iterator_base
const& rhs_iter)
267 return lhs_iter.m_ptrptr - rhs_iter.m_ptrptr;
271 const_iterator_base
const& lhs_iter,
272 const_iterator_base
const& rhs_iter)
274 return lhs_iter.m_ptrptr == rhs_iter.m_ptrptr;
278 const_iterator_base
const& lhs_iter,
279 const_iterator_base
const& rhs_iter)
281 return lhs_iter.m_ptrptr < rhs_iter.m_ptrptr;
285 const pointer_and_size* m_ptrptr;
299 : m_vec(
std::move(rhs.m_vec)),
300 m_aloc(
std::move(rhs.m_aloc))
307 move_assign_private(std::move(rhs),
308 propagate_on_container_move_assignment {});
319 m_vec.reserve(num_loops);
333 for (
size_t i = 0; i < m_vec.size(); ++i)
335 storage_size_nbytes += m_vec[i].size;
337 return storage_size_nbytes;
340 template<
typename holder,
typename... holder_ctor_args>
342 holder_ctor_args&&... ctor_args)
344 m_vec.emplace_back(create_value<holder>(
345 dispatcher, std::forward<holder_ctor_args>(ctor_args)...));
351 while (!m_vec.empty())
353 destroy_value(m_vec.back());
356 m_vec.shrink_to_fit();
364 typename allocator_traits_type::template rebind_alloc<pointer_and_size>>
366 allocator_type m_aloc;
369 void move_assign_private(
WorkStorage&& rhs, std::true_type)
372 m_vec = std::move(rhs.m_vec);
373 m_aloc = std::move(rhs.m_aloc);
377 void move_assign_private(WorkStorage&& rhs, std::false_type)
380 if (m_aloc == rhs.m_aloc)
383 m_vec = std::move(rhs.m_vec);
388 for (size_type i = 0; i < rhs.m_vec.size(); ++i)
390 m_vec.emplace_back(move_destroy_value(std::move(rhs), rhs.m_vec[i]));
398 template<
typename holder,
typename... holder_ctor_args>
399 pointer_and_size create_value(
const dispatcher_type* dispatcher,
400 holder_ctor_args&&... ctor_args)
402 const size_type value_size =
sizeof(true_value_type<holder>);
404 pointer value_ptr =
reinterpret_cast<pointer
>(
405 allocator_traits_type::allocate(m_aloc, value_size));
407 value_type::template construct<holder>(
408 value_ptr, dispatcher, std::forward<holder_ctor_args>(ctor_args)...);
410 return pointer_and_size {value_ptr, value_size};
415 pointer_and_size move_destroy_value(WorkStorage&& rhs,
416 pointer_and_size other_value_and_size)
418 pointer value_ptr =
reinterpret_cast<pointer
>(
419 allocator_traits_type::allocate(m_aloc, other_value_and_size.size));
421 value_type::move_destroy(value_ptr, other_value_and_size.ptr);
423 allocator_traits_type::deallocate(
424 rhs.m_aloc,
reinterpret_cast<char*
>(other_value_and_size.ptr),
425 other_value_and_size.size);
427 return pointer_and_size {value_ptr, other_value_and_size.
size};
431 void destroy_value(pointer_and_size value_and_size_ptr)
433 value_type::destroy(value_and_size_ptr.ptr);
434 allocator_traits_type::deallocate(
435 m_aloc,
reinterpret_cast<char*
>(value_and_size_ptr.ptr),
436 value_and_size_ptr.size);
440 template<
typename ALLOCATOR_T,
typename Dispatcher_T>
443 using allocator_traits_type = std::allocator_traits<ALLOCATOR_T>;
444 using propagate_on_container_copy_assignment =
445 typename allocator_traits_type::propagate_on_container_copy_assignment;
446 using propagate_on_container_move_assignment =
447 typename allocator_traits_type::propagate_on_container_move_assignment;
448 using propagate_on_container_swap =
449 typename allocator_traits_type::propagate_on_container_swap;
451 std::is_same<typename allocator_traits_type::value_type, char>::value,
452 "WorkStorage expects an allocator for 'char's.");
458 template<
typename holder>
472 struct const_iterator_base
475 using pointer =
typename WorkStorage::const_pointer;
476 using reference =
typename WorkStorage::const_reference;
481 : m_array_begin(array_begin),
482 m_offset_iter(offset_iter)
487 return *
reinterpret_cast<pointer>(m_array_begin + *m_offset_iter);
497 const_iterator_base
const& lhs_iter,
498 const_iterator_base
const& rhs_iter)
500 return lhs_iter.m_offset_iter - rhs_iter.m_offset_iter;
504 const_iterator_base
const& lhs_iter,
505 const_iterator_base
const& rhs_iter)
507 return lhs_iter.m_offset_iter == rhs_iter.m_offset_iter;
511 const_iterator_base
const& lhs_iter,
512 const_iterator_base
const& rhs_iter)
514 return lhs_iter.m_offset_iter < rhs_iter.m_offset_iter;
518 const char* m_array_begin;
525 : m_offsets(0, aloc),
533 : m_offsets(
std::move(rhs.m_offsets)),
534 m_array_begin(rhs.m_array_begin),
535 m_array_end(rhs.m_array_end),
536 m_array_cap(rhs.m_array_cap),
537 m_aloc(
std::move(rhs.m_aloc))
539 rhs.m_array_begin =
nullptr;
540 rhs.m_array_end =
nullptr;
541 rhs.m_array_cap =
nullptr;
548 move_assign_private(std::move(rhs),
549 propagate_on_container_move_assignment {});
558 m_offsets.reserve(num_loops);
559 array_reserve(loop_storage_size);
578 template<
typename holder,
typename... holder_ctor_args>
580 holder_ctor_args&&... ctor_args)
583 size_type value_size = create_value<holder>(
584 value_offset, dispatcher, std::forward<holder_ctor_args>(ctor_args)...);
585 m_offsets.emplace_back(value_offset);
586 m_array_end += value_size;
593 if (m_array_begin !=
nullptr)
595 allocator_traits_type::deallocate(m_aloc, m_array_begin,
597 m_array_begin =
nullptr;
598 m_array_end =
nullptr;
599 m_array_cap =
nullptr;
607 typename allocator_traits_type::template rebind_alloc<size_type>>
609 char* m_array_begin =
nullptr;
610 char* m_array_end =
nullptr;
611 char* m_array_cap =
nullptr;
612 allocator_type m_aloc;
615 void move_assign_private(
WorkStorage&& rhs, std::true_type)
619 m_offsets = std::move(rhs.m_offsets);
620 m_array_begin = rhs.m_array_begin;
621 m_array_end = rhs.m_array_end;
622 m_array_cap = rhs.m_array_cap;
623 m_aloc = std::move(rhs.m_aloc);
625 rhs.m_array_begin =
nullptr;
626 rhs.m_array_end =
nullptr;
627 rhs.m_array_cap =
nullptr;
631 void move_assign_private(WorkStorage&& rhs, std::false_type)
634 if (m_aloc == rhs.m_aloc)
637 m_offsets = std::move(rhs.m_offsets);
638 m_array_begin = rhs.m_array_begin;
639 m_array_end = rhs.m_array_end;
640 m_array_cap = rhs.m_array_cap;
642 rhs.m_array_begin =
nullptr;
643 rhs.m_array_end =
nullptr;
644 rhs.m_array_cap =
nullptr;
648 array_reserve(rhs.storage_size());
650 for (size_type i = 0; i < rhs.size(); ++i)
652 m_array_end = m_array_begin + rhs.m_offsets[i];
653 move_destroy_value(m_array_end, rhs.m_array_begin + rhs.m_offsets[i]);
654 m_offsets.emplace_back(rhs.m_offsets[i]);
656 m_array_end = m_array_begin + rhs.storage_size();
657 rhs.m_array_end = rhs.m_array_begin;
658 rhs.m_offsets.clear();
664 size_type storage_capacity()
const {
return m_array_cap - m_array_begin; }
667 size_type storage_unused()
const {
return m_array_cap - m_array_end; }
670 void array_reserve(size_type loop_storage_size)
672 if (loop_storage_size > storage_capacity())
675 char* new_array_begin =
676 allocator_traits_type::allocate(m_aloc, loop_storage_size);
677 char* new_array_end = new_array_begin + storage_size();
678 char* new_array_cap = new_array_begin + loop_storage_size;
680 for (size_type i = 0; i < size(); ++i)
682 move_destroy_value(new_array_begin + m_offsets[i],
683 m_array_begin + m_offsets[i]);
686 if (m_array_begin !=
nullptr)
688 allocator_traits_type::deallocate(m_aloc, m_array_begin,
692 m_array_begin = new_array_begin;
693 m_array_end = new_array_end;
694 m_array_cap = new_array_cap;
701 while (!m_offsets.empty())
703 destroy_value(m_offsets.back());
704 m_array_end = m_array_begin + m_offsets.back();
705 m_offsets.pop_back();
707 m_offsets.shrink_to_fit();
712 template<
typename holder,
typename... holder_ctor_args>
713 size_type create_value(size_type value_offset,
714 const dispatcher_type* dispatcher,
715 holder_ctor_args&&... ctor_args)
717 const size_type value_size =
sizeof(true_value_type<holder>);
719 if (value_size > storage_unused())
722 std::max(storage_size() + value_size, 2 * storage_capacity()));
725 pointer value_ptr =
reinterpret_cast<pointer
>(m_array_begin + value_offset);
727 value_type::template construct<holder>(
728 value_ptr, dispatcher, std::forward<holder_ctor_args>(ctor_args)...);
735 void move_destroy_value(
char* value_ptr,
char* other_value_ptr)
737 value_type::move_destroy(
reinterpret_cast<pointer
>(value_ptr),
738 reinterpret_cast<pointer
>(other_value_ptr));
742 void destroy_value(size_type value_offset)
744 pointer value_ptr =
reinterpret_cast<pointer
>(m_array_begin + value_offset);
745 value_type::destroy(value_ptr);
749 template<
typename ALLOCATOR_T,
typename Dispatcher_T>
754 using allocator_traits_type = std::allocator_traits<ALLOCATOR_T>;
755 using propagate_on_container_copy_assignment =
756 typename allocator_traits_type::propagate_on_container_copy_assignment;
757 using propagate_on_container_move_assignment =
758 typename allocator_traits_type::propagate_on_container_move_assignment;
759 using propagate_on_container_swap =
760 typename allocator_traits_type::propagate_on_container_swap;
762 std::is_same<typename allocator_traits_type::value_type, char>::value,
763 "WorkStorage expects an allocator for 'char's.");
769 template<
typename holder>
783 struct const_iterator_base
786 using pointer =
typename WorkStorage::const_pointer;
787 using reference =
typename WorkStorage::const_reference;
792 : m_array_pos(array_pos),
798 return *
reinterpret_cast<const value_type*
>(m_array_pos);
803 m_array_pos += n * m_stride;
808 const_iterator_base
const& lhs_iter,
809 const_iterator_base
const& rhs_iter)
811 return (lhs_iter.m_array_pos - rhs_iter.m_array_pos) / lhs_iter.m_stride;
815 const_iterator_base
const& lhs_iter,
816 const_iterator_base
const& rhs_iter)
818 return lhs_iter.m_array_pos == rhs_iter.m_array_pos;
822 const_iterator_base
const& lhs_iter,
823 const_iterator_base
const& rhs_iter)
825 return lhs_iter.m_array_pos < rhs_iter.m_array_pos;
829 const char* m_array_pos;
841 : m_aloc(
std::move(rhs.m_aloc)),
842 m_stride(rhs.m_stride),
843 m_array_begin(rhs.m_array_begin),
844 m_array_end(rhs.m_array_end),
845 m_array_cap(rhs.m_array_cap)
848 rhs.m_array_begin =
nullptr;
849 rhs.m_array_end =
nullptr;
850 rhs.m_array_cap =
nullptr;
857 move_assign_private(std::move(rhs),
858 propagate_on_container_move_assignment {});
868 std::max(num_loops, (loop_storage_size + m_stride - 1) / m_stride);
869 array_reserve(num_storage_loops * m_stride, m_stride);
885 template<
typename holder,
typename... holder_ctor_args>
887 holder_ctor_args&&... ctor_args)
889 create_value<holder>(dispatcher,
890 std::forward<holder_ctor_args>(ctor_args)...);
891 m_array_end += m_stride;
898 if (m_array_begin !=
nullptr)
900 allocator_traits_type::deallocate(m_aloc, m_array_begin,
902 m_array_begin =
nullptr;
903 m_array_end =
nullptr;
904 m_array_cap =
nullptr;
911 allocator_type m_aloc;
912 size_type m_stride = 1;
913 char* m_array_begin =
nullptr;
914 char* m_array_end =
nullptr;
915 char* m_array_cap =
nullptr;
918 void move_assign_private(
WorkStorage&& rhs, std::true_type)
922 m_aloc = std::move(rhs.m_aloc);
923 m_stride = rhs.m_stride;
924 m_array_begin = rhs.m_array_begin;
925 m_array_end = rhs.m_array_end;
926 m_array_cap = rhs.m_array_cap;
929 rhs.m_array_begin =
nullptr;
930 rhs.m_array_end =
nullptr;
931 rhs.m_array_cap =
nullptr;
935 void move_assign_private(WorkStorage&& rhs, std::false_type)
938 if (m_aloc == rhs.m_aloc)
941 m_stride = rhs.m_stride;
942 m_array_begin = rhs.m_array_begin;
943 m_array_end = rhs.m_array_end;
944 m_array_cap = rhs.m_array_cap;
947 rhs.m_array_begin =
nullptr;
948 rhs.m_array_end =
nullptr;
949 rhs.m_array_cap =
nullptr;
954 m_stride = rhs.m_stride;
955 array_reserve(rhs.storage_size(), rhs.m_stride);
957 for (size_type i = 0; i < rhs.size(); ++i)
959 move_destroy_value(m_array_end, rhs.m_array_begin + i * rhs.m_stride);
960 m_array_end += m_stride;
962 rhs.m_array_end = rhs.m_array_begin;
968 size_type storage_capacity()
const {
return m_array_cap - m_array_begin; }
971 size_type storage_unused()
const {
return m_array_cap - m_array_end; }
978 void array_reserve(size_type loop_storage_size, size_type new_stride)
980 if (loop_storage_size > storage_capacity() || new_stride > m_stride)
983 char* new_array_begin =
984 allocator_traits_type::allocate(m_aloc, loop_storage_size);
985 char* new_array_end = new_array_begin + size() * new_stride;
986 char* new_array_cap = new_array_begin + loop_storage_size;
988 for (size_type i = 0; i < size(); ++i)
990 move_destroy_value(new_array_begin + i * new_stride,
991 m_array_begin + i * m_stride);
994 if (m_array_begin !=
nullptr)
996 allocator_traits_type::deallocate(m_aloc, m_array_begin,
1000 m_stride = new_stride;
1001 m_array_begin = new_array_begin;
1002 m_array_end = new_array_end;
1003 m_array_cap = new_array_cap;
1010 for (size_type value_offset = storage_size(); value_offset > 0;
1011 value_offset -= m_stride)
1013 destroy_value(value_offset - m_stride);
1014 m_array_end -= m_stride;
1020 template<
typename holder,
typename... holder_ctor_args>
1021 void create_value(
const dispatcher_type* dispatcher,
1022 holder_ctor_args&&... ctor_args)
1024 const size_type value_size =
sizeof(true_value_type<holder>);
1026 if (value_size > storage_unused() && value_size <= m_stride)
1028 array_reserve(
std::max(storage_size() + m_stride, 2 * storage_capacity()),
1031 else if (value_size > m_stride)
1033 array_reserve((size() + 1) * value_size, value_size);
1036 size_type value_offset = storage_size();
1037 pointer value_ptr =
reinterpret_cast<pointer
>(m_array_begin + value_offset);
1039 value_type::template construct<holder>(
1040 value_ptr, dispatcher, std::forward<holder_ctor_args>(ctor_args)...);
1045 void move_destroy_value(
char* value_ptr,
char* other_value_ptr)
1047 value_type::move_destroy(
reinterpret_cast<pointer
>(value_ptr),
1048 reinterpret_cast<pointer
>(other_value_ptr));
1052 void destroy_value(size_type value_offset)
1054 pointer value_ptr =
reinterpret_cast<pointer
>(m_array_begin + value_offset);
1055 value_type::destroy(value_ptr);
Header file for RAJA operator definitions.
RAJA header file for simple vector template class that enables RAJA to be used with or without the C+...
Header file providing RAJA WorkStruct for workgroup.
Class template that provides a simple vector implementation sufficient to insulate RAJA entities from...
Definition: RAJAVec.hpp:56
size_type size() const
Definition: RAJAVec.hpp:199
std::ptrdiff_t difference_type
Definition: WorkStorage.hpp:228
WorkStorage & operator=(WorkStorage const &)=delete
size_type storage_size() const
Definition: WorkStorage.hpp:330
WorkStorage(WorkStorage &&rhs)
Definition: WorkStorage.hpp:298
const_iterator begin() const
Definition: WorkStorage.hpp:325
WorkStorage(allocator_type const &aloc)
Definition: WorkStorage.hpp:290
Dispatcher_T dispatcher_type
Definition: WorkStorage.hpp:220
WorkStorage & operator=(WorkStorage &&rhs)
Definition: WorkStorage.hpp:303
WorkStorage(WorkStorage const &)=delete
~WorkStorage()
Definition: WorkStorage.hpp:359
void clear()
Definition: WorkStorage.hpp:349
std::size_t size_type
Definition: WorkStorage.hpp:227
void emplace(const dispatcher_type *dispatcher, holder_ctor_args &&... ctor_args)
Definition: WorkStorage.hpp:341
size_type size() const
Definition: WorkStorage.hpp:323
ALLOCATOR_T allocator_type
Definition: WorkStorage.hpp:226
void reserve(size_type num_loops, size_type loop_storage_size)
Definition: WorkStorage.hpp:316
const_iterator end() const
Definition: WorkStorage.hpp:327
~WorkStorage()
Definition: WorkStorage.hpp:908
Dispatcher_T dispatcher_type
Definition: WorkStorage.hpp:767
void clear()
Definition: WorkStorage.hpp:895
std::size_t size_type
Definition: WorkStorage.hpp:774
size_type size() const
Definition: WorkStorage.hpp:873
void emplace(const dispatcher_type *dispatcher, holder_ctor_args &&... ctor_args)
Definition: WorkStorage.hpp:886
void reserve(size_type num_loops, size_type loop_storage_size)
Definition: WorkStorage.hpp:865
std::ptrdiff_t difference_type
Definition: WorkStorage.hpp:775
WorkStorage(WorkStorage const &)=delete
size_type storage_size() const
Definition: WorkStorage.hpp:883
const_iterator end() const
Definition: WorkStorage.hpp:880
ALLOCATOR_T allocator_type
Definition: WorkStorage.hpp:773
const_iterator begin() const
Definition: WorkStorage.hpp:875
WorkStorage & operator=(WorkStorage const &)=delete
WorkStorage(allocator_type const &aloc)
Definition: WorkStorage.hpp:835
WorkStorage(WorkStorage &&rhs)
Definition: WorkStorage.hpp:840
WorkStorage & operator=(WorkStorage &&rhs)
Definition: WorkStorage.hpp:853
std::ptrdiff_t difference_type
Definition: WorkStorage.hpp:464
WorkStorage(WorkStorage &&rhs)
Definition: WorkStorage.hpp:532
void reserve(size_type num_loops, size_type loop_storage_size)
Definition: WorkStorage.hpp:556
void emplace(const dispatcher_type *dispatcher, holder_ctor_args &&... ctor_args)
Definition: WorkStorage.hpp:579
const_iterator begin() const
Definition: WorkStorage.hpp:565
WorkStorage & operator=(WorkStorage const &)=delete
const_iterator end() const
Definition: WorkStorage.hpp:570
size_type size() const
Definition: WorkStorage.hpp:563
Dispatcher_T dispatcher_type
Definition: WorkStorage.hpp:456
WorkStorage(allocator_type const &aloc)
Definition: WorkStorage.hpp:524
size_type storage_size() const
Definition: WorkStorage.hpp:576
WorkStorage(WorkStorage const &)=delete
void clear()
Definition: WorkStorage.hpp:590
ALLOCATOR_T allocator_type
Definition: WorkStorage.hpp:462
WorkStorage & operator=(WorkStorage &&rhs)
Definition: WorkStorage.hpp:544
std::size_t size_type
Definition: WorkStorage.hpp:463
~WorkStorage()
Definition: WorkStorage.hpp:603
Definition: WorkStorage.hpp:202
Header file for common RAJA internal macro definitions.
RAJA_HOST_DEVICE RAJA_INLINE void RAJA_UNUSED_VAR(T &&...) noexcept
Definition: macros.hpp:120
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_HOST_DEVICE constexpr RAJA_INLINE Result max(Args... args)
Definition: foldl.hpp:155
Definition: ListSegment.hpp:416
typename WorkStorage::const_pointer pointer
Definition: WorkStorage.hpp:248
typename WorkStorage::const_reference reference
Definition: WorkStorage.hpp:249
typename WorkStorage::difference_type difference_type
Definition: WorkStorage.hpp:250
RAJA_HOST_DEVICE reference operator*() const
Definition: WorkStorage.hpp:255
RAJA_HOST_DEVICE const_iterator_base & operator+=(difference_type n)
Definition: WorkStorage.hpp:257
RAJA_HOST_DEVICE friend bool operator<(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:277
const_iterator_base(const pointer_and_size *ptrptr)
Definition: WorkStorage.hpp:253
std::random_access_iterator_tag iterator_category
Definition: WorkStorage.hpp:251
RAJA_HOST_DEVICE friend difference_type operator-(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:263
const typename WorkStorage::value_type value_type
Definition: WorkStorage.hpp:247
RAJA_HOST_DEVICE friend bool operator==(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:270
typename WorkStorage::difference_type difference_type
Definition: WorkStorage.hpp:788
RAJA_HOST_DEVICE friend bool operator<(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:821
const_iterator_base(const char *array_pos, size_type stride)
Definition: WorkStorage.hpp:791
typename WorkStorage::const_pointer pointer
Definition: WorkStorage.hpp:786
RAJA_HOST_DEVICE const_iterator_base & operator+=(difference_type n)
Definition: WorkStorage.hpp:801
std::random_access_iterator_tag iterator_category
Definition: WorkStorage.hpp:789
RAJA_HOST_DEVICE friend difference_type operator-(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:807
RAJA_HOST_DEVICE reference operator*() const
Definition: WorkStorage.hpp:796
const typename WorkStorage::value_type value_type
Definition: WorkStorage.hpp:785
RAJA_HOST_DEVICE friend bool operator==(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:814
typename WorkStorage::const_reference reference
Definition: WorkStorage.hpp:787
typename WorkStorage::const_reference reference
Definition: WorkStorage.hpp:476
RAJA_HOST_DEVICE reference operator*() const
Definition: WorkStorage.hpp:485
RAJA_HOST_DEVICE friend bool operator<(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:510
RAJA_HOST_DEVICE const_iterator_base & operator+=(difference_type n)
Definition: WorkStorage.hpp:490
typename WorkStorage::difference_type difference_type
Definition: WorkStorage.hpp:477
std::random_access_iterator_tag iterator_category
Definition: WorkStorage.hpp:478
RAJA_HOST_DEVICE friend difference_type operator-(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:496
typename WorkStorage::const_pointer pointer
Definition: WorkStorage.hpp:475
const_iterator_base(const char *array_begin, const size_type *offset_iter)
Definition: WorkStorage.hpp:480
RAJA_HOST_DEVICE friend bool operator==(const_iterator_base const &lhs_iter, const_iterator_base const &rhs_iter)
Definition: WorkStorage.hpp:503
const typename WorkStorage::value_type value_type
Definition: WorkStorage.hpp:474
Definition: WorkStruct.hpp:40
Definition: WorkStorage.hpp:52
std::random_access_iterator_tag iterator_category
Definition: WorkStorage.hpp:58
RAJA_HOST_DEVICE friend bool operator<=(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:175
RAJA_HOST_DEVICE random_access_iterator operator--(int)
Definition: WorkStorage.hpp:101
random_access_iterator(random_access_iterator const &)=default
RAJA_HOST_DEVICE friend random_access_iterator operator+(random_access_iterator const &lhs, difference_type rhs)
Definition: WorkStorage.hpp:120
RAJA_HOST_DEVICE friend bool operator==(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:154
typename base::pointer pointer
Definition: WorkStorage.hpp:55
RAJA_HOST_DEVICE random_access_iterator & operator+=(difference_type rhs)
Definition: WorkStorage.hpp:108
const typename base::value_type value_type
Definition: WorkStorage.hpp:54
RAJA_HOST_DEVICE pointer operator->() const
Definition: WorkStorage.hpp:73
RAJA_HOST_DEVICE friend random_access_iterator operator+(difference_type lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:129
RAJA_HOST_DEVICE friend difference_type operator-(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:147
RAJA_HOST_DEVICE random_access_iterator & operator--()
Definition: WorkStorage.hpp:95
RAJA_HOST_DEVICE random_access_iterator & operator-=(difference_type rhs)
Definition: WorkStorage.hpp:114
random_access_iterator(random_access_iterator &&)=default
RAJA_HOST_DEVICE friend bool operator>=(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:189
random_access_iterator & operator=(random_access_iterator &&)=default
RAJA_HOST_DEVICE random_access_iterator & operator++()
Definition: WorkStorage.hpp:82
random_access_iterator & operator=(random_access_iterator const &)=default
typename base::reference reference
Definition: WorkStorage.hpp:56
RAJA_HOST_DEVICE friend bool operator<(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:168
RAJA_HOST_DEVICE friend random_access_iterator operator-(random_access_iterator const &lhs, difference_type rhs)
Definition: WorkStorage.hpp:138
typename base::difference_type difference_type
Definition: WorkStorage.hpp:57
RAJA_HOST_DEVICE reference operator[](difference_type i) const
Definition: WorkStorage.hpp:75
RAJA_HOST_DEVICE friend bool operator>(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:182
RAJA_HOST_DEVICE random_access_iterator operator++(int)
Definition: WorkStorage.hpp:88
RAJA_HOST_DEVICE friend bool operator!=(random_access_iterator const &lhs, random_access_iterator const &rhs)
Definition: WorkStorage.hpp:161
iterator_base base
Definition: WorkStorage.hpp:53
RAJA_HOST_DEVICE reference operator*() const
Definition: WorkStorage.hpp:68
Definition: WorkGroup.hpp:59
Definition: WorkGroup.hpp:71
Definition: WorkGroup.hpp:65