11 #include <type_traits>
18 template<std::size_t... Coords>
22 using List = mp_list_c<std::size_t, Coords...>;
24 static constexpr std::size_t
front = mp_front<List>::value;
25 static constexpr std::size_t
back = mp_back<List>::value;
26 static constexpr std::size_t
size =
sizeof...(Coords);
33 using List = mp_list_c<std::size_t>;
35 static constexpr std::size_t
size = 0;
39 template<std::size_t... CoordsA, std::size_t... CoordsB>
46 template<std::size_t... Coords>
53 template<std::size_t... CoordsA, std::size_t... CoordsB>
64 template<std::size_t... Coords>
68 template<std::size_t... RCs>
73 for(
auto rc : std::array<std::size_t,
sizeof...(RCs)>{RCs...})
85 inline namespace literals
89 template<
char... Digits>
90 constexpr
auto operator"" _RC()
92 constexpr
auto coord = []() constexpr
94 const char digits[] = {(Digits - 48)...};
96 std ::size_t powerOf10 = 1;
97 for(
int i =
sizeof...(Digits) - 1; i >= 0; i--)
99 acc += digits[i] * powerOf10;
115 template<
typename... RecordCoords>
120 template<
typename... RecordCoords>
123 return Cat<RecordCoords...>{};
128 template<
typename RecordCoord>
133 template<std::size_t... Coords1, std::size_t... Coords2>
137 std::array<std::size_t,
sizeof...(Coords1)> a1{Coords1...};
138 std::array<std::size_t,
sizeof...(Coords2)> a2{Coords2...};
139 for(std::size_t i = 0; i < std::min(a1.size(), a2.size()); i++)
152 template<
typename First,
typename Second>
158 template<std::size_t... Coords1, std::size_t... Coords2>
162 std::array<std::size_t,
sizeof...(Coords1)> a1{Coords1...};
163 std::array<std::size_t,
sizeof...(Coords2)> a2{Coords2...};
164 for(std::size_t i = 0; i < std::min(a1.size(), a2.size()); i++)
173 template<
typename First,
typename Second>
#define LLAMA_FN_HOST_ACC_INLINE
constexpr auto recordCoordCommonPrefixIsBiggerImpl(RecordCoord< Coords1... >, RecordCoord< Coords2... >) -> bool
constexpr auto recordCoordCommonPrefixIsSameImpl(RecordCoord< Coords1... >, RecordCoord< Coords2... >) -> bool
typename mp_unwrap_values_into_impl< FromList, ToList >::type mp_unwrap_values_into
constexpr auto cat(RecordCoords...)
Concatenate a set of RecordCoords instances.
constexpr auto operator==(ArrayIndex< TA, Dim > a, ArrayIndex< TB, Dim > b) -> bool
constexpr auto recordCoordCommonPrefixIsSame
Checks whether two RecordCoords are the same or one is the prefix of the other.
RecordCoordFromList< mp_pop_front< typename RecordCoord::List > > PopFront
RecordCoord without first coordinate component.
constexpr bool isRecordCoord
auto operator<<(std::ostream &os, const Array< T, N > &a) -> std::ostream &
constexpr auto recordCoordCommonPrefixIsBigger
Checks wether the first RecordCoord is bigger than the second.
constexpr auto operator!=(ArrayIndex< TA, Dim > a, ArrayIndex< TB, Dim > b) -> bool
RecordCoordFromList< mp_append< typename RecordCoords::List... > > Cat
Concatenate a set of RecordCoords.
internal::mp_unwrap_values_into< L, RecordCoord > RecordCoordFromList
Converts a type list of integral constants into a RecordCoord.
mp_list_c< std::size_t > List
static constexpr std::size_t size
static constexpr std::size_t back
mp_list_c< std::size_t, Coords... > List
The list of integral coordinates as mp_list.
static constexpr std::size_t front