1 #ifndef DASH__MAP__UNORDERED_MAP_LOCAL_REF_H__INCLUDED 2 #define DASH__MAP__UNORDERED_MAP_LOCAL_REF_H__INCLUDED 27 #else // ifdef DOXYGEN 55 typedef Mapped mapped_type;
57 typedef Pred key_equal;
59 typedef typename map_type::index_type index_type;
60 typedef typename map_type::difference_type difference_type;
61 typedef typename map_type::size_type size_type;
62 typedef typename map_type::value_type value_type;
64 typedef self_t local_type;
66 typedef typename map_type::glob_mem_type glob_mem_type;
68 typedef typename map_type::local_node_pointer node_pointer;
69 typedef typename map_type::local_node_pointer local_node_pointer;
71 typedef typename map_type::local_iterator iterator;
72 typedef typename map_type::const_local_iterator const_iterator;
73 typedef typename map_type::reverse_local_iterator
75 typedef typename map_type::const_reverse_local_iterator
76 const_reverse_iterator;
78 typedef typename map_type::local_iterator local_iterator;
79 typedef typename map_type::const_local_iterator const_local_iterator;
80 typedef typename map_type::reverse_local_iterator
81 reverse_local_iterator;
82 typedef typename map_type::const_reverse_local_iterator
83 const_reverse_local_iterator;
85 typedef typename map_type::local_reference reference;
86 typedef typename map_type::const_local_reference const_reference;
87 typedef typename map_type::local_reference local_reference;
88 typedef typename map_type::const_local_reference const_local_reference;
90 typedef typename map_type::mapped_type_reference
91 mapped_type_reference;
92 typedef typename map_type::const_mapped_type_reference
93 const_mapped_type_reference;
96 map_type * _map =
nullptr;
117 inline const glob_mem_type & globmem()
const 119 return _map->globmem();
126 inline iterator &
begin() noexcept
128 return _map->lbegin();
131 inline const_iterator &
begin() const noexcept
133 return _map->lbegin();
136 inline const_iterator & cbegin() const noexcept
138 return _map->clbegin();
141 inline iterator &
end() noexcept
146 inline const_iterator &
end() const noexcept
151 inline const_iterator & cend() const noexcept
153 return _map->clend();
160 constexpr size_type max_size() const noexcept
162 return _map->max_size();
165 inline size_type
size() const noexcept
167 return _map->lsize();
170 inline size_type capacity() const noexcept
172 return _map->lcapacity();
175 inline bool empty() const noexcept
177 return _map->lsize() == 0;
180 inline size_type lsize() const noexcept
182 return _map->lsize();
185 inline size_type lcapacity() const noexcept
187 return _map->lcapacity();
194 mapped_type_reference operator[](
const key_type & key)
196 DASH_LOG_TRACE(
"UnorderedMapLocalRef.[]()",
"key:", key);
197 iterator git_value = insert(
198 std::make_pair(key, mapped_type()))
200 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.[]", git_value);
202 value_type * lptr_value = git_value.local();
203 mapped_type * lptr_mapped =
nullptr;
205 _lptr_value_to_mapped(lptr_value, gptr_mapped, lptr_mapped);
207 mapped_type_reference mapped(gptr_mapped,
209 DASH_LOG_TRACE(
"UnorderedMapLocalRef.[] >", mapped);
213 const_mapped_type_reference at(
const key_type & key)
const 215 DASH_LOG_TRACE(
"UnorderedMapLocalRef.at() const",
"key:", key);
218 const_iterator git_value =
find(key);
219 if (git_value ==
end()) {
223 "No element in map for key " << key);
226 value_type * lptr_value = git_value.local();
227 mapped_type * lptr_mapped =
nullptr;
229 _lptr_value_to_mapped(lptr_value, gptr_mapped, lptr_mapped);
231 const_mapped_type_reference mapped(gptr_mapped,
233 DASH_LOG_TRACE(
"UnorderedMapLocalRef.at >", mapped);
237 mapped_type_reference at(
const key_type & key)
239 DASH_LOG_TRACE(
"UnorderedMapLocalRef.at()",
"key:", key);
242 const_iterator git_value =
find(key);
243 if (git_value ==
end()) {
247 "No element in map for key " << key);
249 auto mapped = this->operator[](key);
250 DASH_LOG_TRACE(
"UnorderedMapLocalRef.at >", mapped);
258 size_type count(
const key_type & key)
const 260 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.count()", key);
262 const_iterator found =
find(key);
263 if (found !=
end()) {
266 DASH_LOG_TRACE(
"UnorderedMapLocalRef.count >", nelem);
270 iterator
find(
const key_type & key)
272 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.find()", key);
275 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.find()",
first);
276 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.find()", last);
277 auto pred = key_eq();
280 [&](
const value_type & v) {
281 DASH_LOG_TRACE(
"UnorderedMapLocalRef.find.eq",
282 v.first,
"==?", key);
283 return pred(v.first, key);
285 DASH_LOG_TRACE(
"UnorderedMapLocalRef.find >", found);
289 const_iterator
find(
const key_type & key)
const 291 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.find() const", key);
294 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.find()",
first);
295 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.find()", last);
296 auto pred = key_eq();
299 [&](
const value_type & v) {
300 DASH_LOG_TRACE(
"UnorderedMapLocalRef.find.eq",
301 v.first,
"==?", key);
302 return pred(v.first, key);
304 DASH_LOG_TRACE(
"UnorderedMapLocalRef.find const >", found);
312 std::pair<iterator, bool> insert(
314 const value_type & value)
316 auto && key = value.first;
317 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.insert()",
"key:", key);
318 auto result = std::make_pair(_map->_lend,
false);
321 DASH_LOG_TRACE(
"UnorderedMapLocalRef.insert",
"element key lookup");
322 const_iterator found =
find(key);
323 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.insert", found);
325 if (found !=
end()) {
326 DASH_LOG_TRACE(
"UnorderedMapLocalRef.insert",
"key found");
328 result.first = iterator(_map, found.pos());
329 result.second =
false;
331 DASH_LOG_TRACE(
"UnorderedMapLocalRef.insert",
"key not found");
333 auto unit = hash_function()(key);
336 auto myid = _map->_myid;
337 DASH_LOG_TRACE(
"UnorderedMapLocalRef.insert",
"target unit:", unit);
338 DASH_LOG_TRACE(
"UnorderedMapLocalRef.insert",
"local unit:",
myid);
342 "attempted local insert of " <<
343 "key " << key <<
" which is mapped " <<
344 "to unit " << unit <<
" by hash function");
346 auto inserted = _map->_insert_at(unit, value);
347 result.first = inserted.first.local();
348 result.second = inserted.second;
350 _map->_lend = _map->_lbegin + _map->lsize();
351 DASH_LOG_TRACE(
"UnorderedMapLocalRef.insert",
"updated map.lend:",
354 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.insert >",
355 (result.second ?
"inserted" :
"existing"),
":",
360 template<
class InputIterator>
371 for (
auto it = first; it != last; ++it) {
379 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.erase()",
"iterator:", it);
381 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.erase >");
386 const key_type & key)
388 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.erase()",
"key:", key);
389 auto b_idx = bucket(key);
390 auto b_size = bucket_size(b_idx);
391 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.erase", b_idx);
392 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.erase", b_size);
396 "dash::UnorderedMapLocalRef.erase is not implemented.");
398 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.erase >");
403 const_iterator first,
407 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.erase(first,last)");
408 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.erase()", first);
409 DASH_LOG_TRACE_VAR(
"UnorderedMapLocalRef.erase()", last);
410 for (
auto it = first; it != last; ++it) {
413 DASH_LOG_DEBUG(
"UnorderedMapLocalRef.erase(first,last) >");
420 inline size_type bucket(
const key_type & key)
const 422 return _map->bucket(key);
425 inline size_type bucket_size(size_type bucket_index)
const 427 return _map->bucket_size(bucket_index);
434 inline key_equal key_eq()
const 436 return _map->key_eq();
439 inline hasher hash_function()
const 441 return _map->hash_function();
473 void _lptr_value_to_mapped(
475 value_type * lptr_value,
479 mapped_type * & lptr_mapped)
const 482 auto mapped_offs = offsetof(value_type,
second);
483 DASH_LOG_TRACE(
"UnorderedMap.lptr_value_to_mapped()",
484 "byte offset of mapped member:", mapped_offs);
486 if (lptr_value !=
nullptr) {
487 if (std::is_standard_layout<value_type>::value) {
489 auto *b_lptr_mapped =
reinterpret_cast<char *
>(lptr_value);
490 b_lptr_mapped += mapped_offs;
492 lptr_mapped =
reinterpret_cast<mapped_type *
>(b_lptr_mapped);
494 lptr_mapped = &(lptr_value->second);
499 dart_gptr_incaddr(&gptr_mapped, mapped_offs),
502 DASH_LOG_TRACE(
"UnorderedMap.lptr_value_to_mapped >",
503 "gptr to mapped:", gptr_mapped);
504 DASH_LOG_TRACE(
"UnorderedMap.lptr_value_to_mapped >",
505 "lptr to mapped:", lptr_mapped);
510 #endif // ifdef DOXYGEN 514 #endif // DASH__MAP__UNORDERED_MAP_LOCAL_REF_H__INCLUDED
global_unit_t myid()
Shortcut to query the global unit ID of the calling unit.
size_t size()
Return the number of units in the global team.
constexpr auto end(RangeType &&range) -> decltype(std::forward< RangeType >(range).end())
This class is a simple memory pool which holds allocates elements of size ValueType.
constexpr auto begin(RangeType &&range) -> decltype(std::forward< RangeType >(range).begin())
GlobIter find_if(GlobIter first, GlobIter last, UnaryPredicate predicate)
Returns an iterator to the first element in the range [first,last) that satisfies the predicate p...
A Team instance specifies a subset of all available units.
Local view specifier of a dynamic map container with support for workload balancing.
DART Global pointer type.
#define DART_GPTR_ISNULL(gptr_)
Test for NULL global pointer.
GlobIter find(GlobIter first, GlobIter last, const ElementType &value)
Returns an iterator to the first element in the range [first,last) that compares equal to val...