20 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE 
   21 #include <Kokkos_Macros.hpp> 
   23               "Including non-public Kokkos header files is not allowed.");
 
   25 #ifndef KOKKOS_LAYOUT_HPP 
   26 #define KOKKOS_LAYOUT_HPP 
   29 #include <impl/Kokkos_Traits.hpp> 
   33 enum { ARRAY_LAYOUT_MAX_RANK = 8 };
 
   54   size_t dimension[ARRAY_LAYOUT_MAX_RANK];
 
   60   enum : 
bool { is_extent_constructible = 
true };
 
   67   KOKKOS_INLINE_FUNCTION
 
   68   explicit constexpr 
LayoutLeft(
size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   69                                 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   70                                 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   71                                 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   72                                 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   73                                 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   74                                 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
   75                                 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
 
   76       : dimension{N0, N1, N2, N3, N4, N5, N6, N7},
 
   77         stride(KOKKOS_IMPL_CTOR_DEFAULT_ARG) {}
 
   79   friend bool operator==(
const LayoutLeft& left, 
const LayoutLeft& right) {
 
   80     for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
 
   81       if (left.dimension[rank] != right.dimension[rank]) 
return false;
 
   85   friend bool operator!=(
const LayoutLeft& left, 
const LayoutLeft& right) {
 
   86     return !(left == right);
 
  108   size_t dimension[ARRAY_LAYOUT_MAX_RANK];
 
  114   enum : 
bool { is_extent_constructible = 
true };
 
  121   KOKKOS_INLINE_FUNCTION
 
  122   explicit constexpr 
LayoutRight(
size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  123                                  size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  124                                  size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  125                                  size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  126                                  size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  127                                  size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  128                                  size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
 
  129                                  size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
 
  130       : dimension{N0, N1, N2, N3, N4, N5, N6, N7},
 
  131         stride{KOKKOS_IMPL_CTOR_DEFAULT_ARG} {}
 
  133   friend bool operator==(
const LayoutRight& left, 
const LayoutRight& right) {
 
  134     for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
 
  135       if (left.dimension[rank] != right.dimension[rank]) 
return false;
 
  139   friend bool operator!=(
const LayoutRight& left, 
const LayoutRight& right) {
 
  140     return !(left == right);
 
  152   size_t dimension[ARRAY_LAYOUT_MAX_RANK];
 
  153   size_t stride[ARRAY_LAYOUT_MAX_RANK];
 
  155   enum : 
bool { is_extent_constructible = 
false };
 
  169   template <
typename iTypeOrder, 
typename iTypeDimen>
 
  171       int const rank, iTypeOrder 
const* 
const order,
 
  172       iTypeDimen 
const* 
const dimen) {
 
  175     int check_input = ARRAY_LAYOUT_MAX_RANK < rank ? 0 : int(1 << rank) - 1;
 
  176     for (
int r = 0; r < ARRAY_LAYOUT_MAX_RANK; ++r) {
 
  177       tmp.dimension[r] = KOKKOS_IMPL_CTOR_DEFAULT_ARG;
 
  180     for (
int r = 0; r < rank; ++r) {
 
  181       check_input &= ~int(1 << order[r]);
 
  183     if (0 == check_input) {
 
  185       for (
int r = 0; r < rank; ++r) {
 
  186         tmp.stride[order[r]] = n;
 
  187         n *= (dimen[order[r]]);
 
  188         tmp.dimension[r] = dimen[r];
 
  194   KOKKOS_INLINE_FUNCTION
 
  196       size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S0 = 0,
 
  197       size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S1 = 0,
 
  198       size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S2 = 0,
 
  199       size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S3 = 0,
 
  200       size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S4 = 0,
 
  201       size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S5 = 0,
 
  202       size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S6 = 0,
 
  203       size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, 
size_t S7 = 0)
 
  204       : dimension{N0, N1, N2, N3, N4, N5, N6, N7},
 
  205         stride{S0, S1, S2, S3, S4, S5, S6, S7} {}
 
  207   friend bool operator==(
const LayoutStride& left, 
const LayoutStride& right) {
 
  208     for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
 
  209       if (left.dimension[rank] != right.dimension[rank] ||
 
  210           left.stride[rank] != right.stride[rank])
 
  215   friend bool operator!=(
const LayoutStride& left, 
const LayoutStride& right) {
 
  216     return !(left == right);
 
  230 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 
  231 template <
typename Layout, 
class Enable = 
void>
 
  232 struct KOKKOS_DEPRECATED is_layouttiled : std::false_type {};
 
  237 template <
typename... Layout>
 
  238 struct layout_iterate_type_selector {
 
  239   static const Kokkos::Iterate outer_iteration_pattern =
 
  240       Kokkos::Iterate::Default;
 
  241   static const Kokkos::Iterate inner_iteration_pattern =
 
  242       Kokkos::Iterate::Default;
 
  246 struct layout_iterate_type_selector<Kokkos::LayoutRight> {
 
  247   static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Right;
 
  248   static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Right;
 
  252 struct layout_iterate_type_selector<Kokkos::LayoutLeft> {
 
  253   static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Left;
 
  254   static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Left;
 
  258 struct layout_iterate_type_selector<Kokkos::LayoutStride> {
 
  259   static const Kokkos::Iterate outer_iteration_pattern =
 
  260       Kokkos::Iterate::Default;
 
  261   static const Kokkos::Iterate inner_iteration_pattern =
 
  262       Kokkos::Iterate::Default;
 
  266 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4 
  267 template <
typename... Layout>
 
  268 using layout_iterate_type_selector KOKKOS_DEPRECATED =
 
  269     Impl::layout_iterate_type_selector<Layout...>;
 
  274 #endif  // #ifndef KOKKOS_LAYOUT_HPP 
Memory layout tag indicating left-to-right (Fortran scheme) striding of multi-indices. 
 
Memory layout tag indicated arbitrarily strided multi-index mapping into contiguous memory...
 
Memory layout tag indicating right-to-left (C or lexigraphical scheme) striding of multi-indices...
 
static KOKKOS_INLINE_FUNCTION LayoutStride order_dimensions(int const rank, iTypeOrder const *const order, iTypeDimen const *const dimen)
Compute strides from ordered dimensions.