MeshLib C++ Docs
Loading...
Searching...
No Matches
MRMapOrHashMap.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRVector.h"
4#include "MRphmap.h"
5#include <variant>
6
7namespace MR
8{
9
13template <typename K, typename V>
14struct MapOrHashMap
15{
18 // default construction will select dense map
19 std::variant<Dense, Hash> var;
20
21 [[nodiscard]] static MapOrHashMap createMap( size_t size = 0 );
22 [[nodiscard]] static MapOrHashMap createHashMap( size_t capacity = 0 );
23
24 void setMap( Dense && m ) { var = std::move( m ); }
25 void setHashMap( Hash && m ) { var = std::move( m ); }
26
29 void resizeReserve( size_t denseTotalSize, size_t hashAdditionalCapacity );
30
33 void pushBack( K key, V val );
34
36 template<typename F>
37 void forEach( F && f ) const;
38
39 [[nodiscard]] Dense* getMap() { return get_if<Dense>( &var ); }
40 [[nodiscard]] const Dense* getMap() const { return get_if<Dense>( &var ); }
41
42 [[nodiscard]] Hash* getHashMap() { return get_if<Hash>( &var ); }
43 [[nodiscard]] const Hash* getHashMap() const { return get_if<Hash>( &var ); }
44
45 void clear();
46};
47
48template <typename K, typename V>
50{
52 res.var = Dense( size );
53 return res;
54}
55
56template <typename K, typename V>
58{
60 Hash hmap;
61 if ( capacity > 0 )
62 hmap.reserve( capacity );
63 res.var = std::move( hmap );
64 return res;
65}
66
67template <typename K, typename V>
68void MapOrHashMap<K,V>::resizeReserve( size_t denseTotalSize, size_t hashAdditionalCapacity )
69{
70 std::visit( overloaded{
71 [denseTotalSize]( Dense& map ) { map.resize( denseTotalSize ); },
72 [hashAdditionalCapacity]( Hash& hashMap ) { hashMap.reserve( hashMap.size() + hashAdditionalCapacity ); }
73 }, var );
74}
75
76template <typename K, typename V>
77void MapOrHashMap<K,V>::pushBack( K key, V val )
78{
79 std::visit( overloaded{
80 [=]( Dense& map ) { assert( key == map.endId() ); map.push_back( val ); },
81 [=]( Hash& hashMap ) { hashMap[key] = val; }
82 }, var );
83}
84
85template <typename K, typename V>
86template <typename F>
87void MapOrHashMap<K,V>::forEach( F && f ) const
88{
89 std::visit( overloaded{
90 [&f]( const Dense& map )
91 {
92 for ( K key( 0 ); key < map.size(); ++key )
93 if ( auto val = map[key] )
94 f( key, val );
95 },
96 [&f]( const Hash& hashMap )
97 {
98 for ( const auto & [ key, val ] : hashMap )
99 f( key, val );
100 }
101 }, var );
102}
103
104template <typename K, typename V>
106{
107 std::visit( overloaded{
108 []( Dense& map ) { map.clear(); },
109 []( Hash& hashMap ) { hashMap.clear(); }
110 }, var );
111}
112
113template <typename K, typename V>
114[[nodiscard]] inline V getAt( const MapOrHashMap<K, V> & m, K key, V def = {} )
115{
116 return std::visit( overloaded{
117 [key, def]( const Vector<V, K>& map ) { return getAt( map, key, def ); },
118 [key, def]( const HashMap<K, V>& hashMap ) { return getAt( hashMap, key, def ); }
119 }, m.var );
120}
121
122template <typename K, typename V>
123inline void setAt( MapOrHashMap<K, V> & m, K key, V val )
124{
125 std::visit( overloaded{
126 [key, val]( Vector<V, K>& map ) { map[key] = val; },
127 [key, val]( HashMap<K, V>& hashMap ) { hashMap[key] = val; }
128 }, m.var );
129}
130
131} //namespace MR
std::vector<T>-like container that requires specific indexing type,
Definition MRMesh/MRVector.h:19
Definition MRCameraOrientationPlugin.h:8
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:29
T getAt(const Buffer< T, I > &bmap, I key, T def={})
given some buffer map and a key, returns the value associated with the key, or default value if key i...
Definition MRBuffer.h:119
overloaded(Ts...) -> overloaded< Ts... >
void setAt(MapOrHashMap< K, V > &m, K key, V val)
Definition MRMapOrHashMap.h:123
phmap::flat_hash_map< K, V, Hash, Eq > HashMap
Definition MRMesh/MRMeshFwd.h:528
Definition MRMesh/MRMeshFwd.h:540
Dense * getMap()
Definition MRMapOrHashMap.h:39
std::variant< Dense, Hash > var
Definition MRMapOrHashMap.h:19
const Hash * getHashMap() const
Definition MRMapOrHashMap.h:43
static MapOrHashMap createMap(size_t size=0)
Definition MRMapOrHashMap.h:49
Hash * getHashMap()
Definition MRMapOrHashMap.h:42
void pushBack(K key, V val)
Definition MRMapOrHashMap.h:77
void setMap(Dense &&m)
Definition MRMapOrHashMap.h:24
void resizeReserve(size_t denseTotalSize, size_t hashAdditionalCapacity)
Definition MRMapOrHashMap.h:68
const Dense * getMap() const
Definition MRMapOrHashMap.h:40
void forEach(F &&f) const
executes given function for all pairs (key, value) with valid value for dense map
Definition MRMapOrHashMap.h:87
HashMap< K, V > Hash
Definition MRMapOrHashMap.h:17
void clear()
Definition MRMapOrHashMap.h:105
void setHashMap(Hash &&m)
Definition MRMapOrHashMap.h:25
static MapOrHashMap createHashMap(size_t capacity=0)
Definition MRMapOrHashMap.h:57
Definition MRMesh/MRMeshFwd.h:710