6#ifndef TTG_UTIL_MULTIINDEX_H
7#define TTG_UTIL_MULTIINDEX_H
13 template <std::
size_t Rank,
typename Int =
int>
15 static constexpr const std::size_t
max_index = 1 << 21;
18 template <
typename Integer,
typename = std::enable_if_t<std::is_
integral_v<Int>>>
20 std::copy(ilist.begin(), ilist.end(), data_.begin());
23 template <
typename... Ints,
typename = std::enable_if_t<(std::is_integral_v<Ints> && ...)>>
24 MultiIndex(Ints... ilist) : data_{{
static_cast<Int
>(ilist)...}} {
28 static_assert(Rank == 1 || Rank == 2 || Rank == 3,
29 "MultiIndex<Rank>::MultiIndex(hash) only implemented for Rank={1,2,3}");
31 assert(
hash < max_index);
35 (*this)[0] =
hash / max_index;
36 (*this)[1] =
hash % max_index;
37 }
else if (Rank == 3) {
38 (*this)[0] =
hash / max_index_square;
39 (*this)[1] = (
hash % max_index_square) / max_index;
40 (*this)[2] =
hash % max_index;
44 static_assert(Rank == 1 || Rank == 2 || Rank == 3,
"MultiIndex<Rank>::hash only implemented for Rank={1,2,3}");
45 if constexpr (Rank == 1)
47 else if constexpr (Rank == 2) {
48 return (*
this)[0] * max_index + (*this)[1];
49 }
else if constexpr (Rank == 3) {
50 return ((*
this)[0] * max_index + (*this)[1]) * max_index + (*
this)[2];
55 if (idx >= Rank) assert(idx < Rank);
59 template <
typename Archive>
67 for (
const auto &idx : data_) {
68 result = result && (idx < max_index);
73 std::array<Int, Rank> data_;
76 return lhs.data_ == rhs.data_;
83 template <std::
size_t Rank>
86 for (
size_t i = 0; i != Rank; ++i) os << key[i] << (i + 1 != Rank ?
"," :
"");
93#ifdef TTG_SERIALIZATION_SUPPORTS_MADNESS
96 template <
class Archive, std::
size_t Rank>
97 struct ArchiveStoreImpl<Archive,
ttg::MultiIndex<Rank>> {
99 for (
size_t i = 0; i != Rank; ++i) ar << mi[i];
103 template <
class Archive, std::
size_t Rank>
104 struct ArchiveLoadImpl<Archive,
ttg::MultiIndex<Rank>> {
106 for (
size_t i = 0; i != Rank; ++i) ar >> mi[i];
112static_assert(madness::is_serializable_v<madness::archive::BufferOutputArchive, ttg::MultiIndex<3>>);
top-level TTG namespace contains runtime-neutral functionality
std::array< int, 3 > version()
MultiIndex(std::size_t hash)
MultiIndex(std::initializer_list< Integer > ilist)
MultiIndex(Ints... ilist)
void serialize(Archive &ar, const unsigned int version=0)
static constexpr const std::size_t max_index_square
friend bool operator==(const MultiIndex< Rank > &lhs, const MultiIndex< Rank > &rhs)
static constexpr const std::size_t max_index
friend bool operator!=(const MultiIndex< Rank > &lhs, const MultiIndex< Rank > &rhs)
const auto & operator[](std::size_t idx) const
Computes hash values for objects of type T.