24#ifndef TYPE_INDEXED_CONTAINERS_H
25#define TYPE_INDEXED_CONTAINERS_H
38template<
typename KEYS,
typename VALUE>
41 std::array<VALUE,KEYS::size> _index;
44 template<
typename TYPE>
46 return KEYS::template contains<TYPE>();
49 template<
typename TYPE>
50 const VALUE&
get()
const {
51 return _index[KEYS::template index<TYPE>()];
53 template<
typename TYPE>
55 return _index[KEYS::template index<TYPE>()];
58 template<
typename TYPE>
59 void set(VALUE value) {
60 _index[KEYS::template index<TYPE>()] = value;
71template<
typename VALUE,
typename CONTEXT=
void>
74 std::vector<std::optional<VALUE>> _index;
76 static std::size_t next_index();
77 template <
typename TYPE>
78 static std::size_t get_index();
85 template<
typename TYPE>
88 template<
typename TYPE>
91 template<
typename TYPE>
92 const VALUE&
get()
const;
93 template<
typename TYPE>
96 template<
typename TYPE>
97 void set(VALUE value);
101template <
typename VALUE,
typename CONTEXT>
105 #ifdef PARALLEL_MODE_OMP
109 static std::size_t index = 0;
115template <
typename VALUE,
typename CONTEXT>
116template <
typename TYPE>
117std::size_t TypeIndexedMap<VALUE,CONTEXT>::get_index()
119 static std::size_t index = next_index();
123template <
typename VALUE,
typename CONTEXT>
124template <
typename TYPE>
127 const std::size_t index = get_index<TYPE>();
128 if (index >= _index.size()) {
131 return _index[index].has_value();
135template <
typename VALUE,
typename CONTEXT>
136template <
typename TYPE>
139 return get_index<TYPE>();
142template <
typename VALUE,
typename CONTEXT>
143template <
typename TYPE>
146 const std::size_t index = get_index<TYPE>();
147 if (
auto& value = _index[index]) {
148 return value.value();
150 throw std::out_of_range(
"VALUE for TYPE doesn't exist as it was not set.");
154template <
typename VALUE,
typename CONTEXT>
155template <
typename TYPE>
158 const std::size_t index = get_index<TYPE>();
159 if (
auto& value = _index[index]) {
160 return value.value();
162 throw std::out_of_range(
"VALUE for TYPE doesn't exist as it was not set.");
166template <
typename VALUE,
typename CONTEXT>
167template <
typename TYPE>
170 const std::size_t index = get_index<TYPE>();
171 if (index >= _index.size()) {
172 _index.resize(2*index);
174 _index[index] = value;
182template <
typename MAP>
185 using tuple_t =
typename MAP::values_t::template decompose_into<std::tuple>;
193 template <typename... KEYS>
195 template <
typename F>
202 template <
typename F>
204 tuple{
typename MAP::keys_t::template decompose_into<generator>{}(f)} { }
206 template <
typename KEY>
207 using value_t =
typename MAP::template value<KEY>;
210 template <
typename KEY>
212 return MAP::keys_t::template contains<KEY>();
216 template <
unsigned I>
218 return std::get<I>(
tuple);
221 template <
unsigned I>
223 return std::get<I>(
tuple);
227 template <
typename KEY>
229 return get<(MAP::keys_t::template index<KEY>())>();
232 template <
typename KEY>
234 return get<(MAP::keys_t::template index<KEY>())>();
238 template <
typename KEY>
243 template <
typename KEY>
249 template <
typename F>
251 MAP::keys_t::for_each([&](
auto key) {
257 template <
typename F>
260 typename MAP::keys_t,
261 typename MAP::keys_t::template map_to_callable_result<F>
267template <
typename MAP>
269 typename MAP::template map_values<std::shared_ptr>
const VALUE & get() const
static constexpr bool provides()
(Time) efficient mapping between TYPEs and VALUEs
std::size_t index() const
const VALUE & get() const
Top level namespace for all of OpenLB.
auto operator()(F f) any_platform
Mapping between KEYs and instances of type VALUEs.
constexpr void set(meta::id< KEY >, typename MAP::template value< KEY > value) any_platform
constexpr auto & get() any_platform
Access Ith element.
constexpr void set(typename MAP::template value< KEY > value) any_platform
Set value assigned to KEY of MAP.
TypeIndexedTuple(F f) any_platform
constexpr bool contains(meta::id< KEY >=meta::id< KEY >{}) any_platform
Return true iff MAP contains KEY.
constexpr void for_each(F f) any_platform
Calls f(name, value) for all pairs.
typename MAP::template value< KEY > value_t
constexpr const auto & get() const any_platform
Access Ith element.
TypeIndexedTuple() any_platform=default
constexpr auto exchange_values(F f) any_platform
Returns new TypeIndexedTuple with same keys but values generated by f(key)
constexpr auto & get(meta::id< KEY >=meta::id< KEY >{}) any_platform
Access by KEY of MAP.
constexpr const auto & get(meta::id< KEY >=meta::id< KEY >{}) const any_platform
Access by KEY of MAP.
typename MAP::values_t::template decompose_into< std::tuple > tuple_t
Storage of values in MAP-order.