Template<typename Key, TypeName Value, typename Hash = std::hash<key>>classthreadsafelookuptable{Private: classBuckettype {Private: typedef std::p Air<key, value>Bucketvalue; typedef std::list<bucketValue>Bucketdata; typedef typename Bucketdata::iterator Bucketiterator; Bucketdata data; mutable Boost::shared_mutex Mutex; Bucketiterator findentryfor (KeyConst& key)Const { returnstd::find_if (Data.cbegin (), Data.cend (), [&] (bucketvalueConst&Item) {returnItem.first = =key;}); } Public: Value valuefor (KeyConst& Key, ValueConst& DefaultValue)Const{Boost::shared_lock<boost::shared_mutex>Lock(mutex); AutoConstFoundentry =findentryfor (key); return(Foundentry = = Data.cend ()? defaultvalue:foundentry->second); } voidAddOrUpdate (KeyConst& Key, ValueConst&value) {Std::unique_lock<boost::shared_mutex>Lock(mutex); AutoConstFoundentry =findentryfor (key); if(Foundentry = =Data.cend ()) {Data.push_back ({key, value}); } Else{foundentry->second =value; } } voidRemovemapping (KeyConst&key) {Std::unique_lock<boost::shared_mutex>Lock(mutex); AutoConstFoundentry =findentryfor (key); if(Foundentry! =Data.cend ()) {data.erase (foundentry); } } }; Std::vector<std::unique_ptr<BucketType>>buckets; Hash Hasher; Buckettype& Getbucket (KeyConst& key)Const{AutoConstBucketidnex = hasher (key)%buckets.size (); return*Buckets[bucketidnex]; } Public: Threadsafelookuptable (Constthreadsafelookuptable&) =Delete; Threadsafelookuptable&operator=(Constthreadsafelookuptable&) =Delete; typedef Key KEYTYPE; typedef Value Mappedvalue; Threadsafelookuptable (size_t numbuckets= +, HashConst& hasher_ =Hash ()): Buckets (std::vector<std::unique_ptr<BucketType>>(Numbuckets)), Hasher (hasher_) { for(size_t i =0; i < numbuckets; ++i) {Buckets[i].reset (Std::make_unique<BucketType>()); }} Value valuefor (KeyConst& Key, ValueConst&DefaultValue) {Getbucket (key). Valuefor (key, DefaultValue); } voidAddorupdatemapping (KeyConst& Key, ValueConst&value) {Getbucket (key). AddOrUpdate (key, value); } voidRemovemapping (KeyConst&key) {Getbucket (key). removemapping (key); }};
Thread-Safe Lookup tables