X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FAtomicHashMap-inl.h;h=2dc552559b36bce0e660d07eaf05c92b8ce9eaa3;hb=943afd983a0bce0f1962717a70aa7ab2d3e49a68;hp=184e2b967f9b4fd0bec2488eebd0155e9b4918d9;hpb=ed8c80a0e0988e4ce687f51ca832a00e4a6b7930;p=folly.git diff --git a/folly/AtomicHashMap-inl.h b/folly/AtomicHashMap-inl.h index 184e2b96..2dc55255 100644 --- a/folly/AtomicHashMap-inl.h +++ b/folly/AtomicHashMap-inl.h @@ -24,19 +24,26 @@ namespace folly { // AtomicHashMap constructor -- Atomic wrapper that allows growth // This class has a lot of overhead (184 Bytes) so only use for big maps -template -AtomicHashMap:: -AtomicHashMap(size_t finalSizeEst, const Config& config) - : kGrowthFrac_(config.growthFactor < 0 ? - 1.0 - config.maxLoadFactor : config.growthFactor) { - CHECK(config.maxLoadFactor > 0.0 && config.maxLoadFactor < 1.0); +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> +AtomicHashMap< + KeyT, + ValueT, + HashFcn, + EqualFcn, + Allocator, + ProbeFcn, + KeyConvertFcn>::AtomicHashMap(size_t finalSizeEst, const Config& config) + : kGrowthFrac_( + config.growthFactor < 0 ? 1.0f - config.maxLoadFactor + : config.growthFactor) { + CHECK(config.maxLoadFactor > 0.0f && config.maxLoadFactor < 1.0f); subMaps_[0].store(SubMap::create(finalSizeEst, config).release(), std::memory_order_relaxed); auto subMapCount = kNumSubMaps_; @@ -47,18 +54,20 @@ AtomicHashMap(size_t finalSizeEst, const Config& config) } // emplace -- -template -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> +template < + typename LookupKeyT, + typename LookupHashFcn, + typename LookupEqualFcn, + typename LookupKeyToKeyFcn, + typename... ArgTs> std::pair::iterator, bool> AtomicHashMap -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> +template < + typename LookupKeyT, + typename LookupHashFcn, + typename LookupEqualFcn, + typename LookupKeyToKeyFcn, + typename... ArgTs> typename AtomicHashMap:: SimpleRetT @@ -128,7 +139,7 @@ insertInternal(LookupKeyT key, ArgTs&&... vCtorArgs) { size_t numCellsAllocated = (size_t) (primarySubMap->capacity_ * std::pow(1.0 + kGrowthFrac_, nextMapIdx - 1)); - size_t newSize = (int) (numCellsAllocated * kGrowthFrac_); + size_t newSize = size_t(numCellsAllocated * kGrowthFrac_); DCHECK(subMaps_[nextMapIdx].load(std::memory_order_relaxed) == (SubMap*)kLockedPtr_); // create a new map using the settings stored in the first map @@ -169,13 +180,14 @@ insertInternal(LookupKeyT key, ArgTs&&... vCtorArgs) { } // find -- -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> template typename AtomicHashMap:: @@ -191,13 +203,14 @@ AtomicHashMapmakeIter(ret.j)); } -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> template typename AtomicHashMap::const_iterator @@ -210,13 +223,14 @@ find(LookupKeyT k) const { } // findInternal -- -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> template typename AtomicHashMap:: @@ -232,7 +246,8 @@ AtomicHashMapcapacity_)) { return SimpleRetT(0, ret.idx, ret.success); } - int const numMaps = numMapsAllocated_.load(std::memory_order_acquire); + const unsigned int numMaps = + numMapsAllocated_.load(std::memory_order_acquire); FOR_EACH_RANGE(i, 1, numMaps) { // Check each map successively. If one succeeds, we're done! SubMap* thisMap = subMaps_[i].load(std::memory_order_relaxed); @@ -248,13 +263,14 @@ AtomicHashMap +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> typename AtomicHashMap:: SimpleRetT @@ -277,13 +293,14 @@ findAtInternal(uint32_t idx) const { } // erase -- -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> typename AtomicHashMap:: size_type @@ -302,13 +319,14 @@ erase(const KeyT k) { } // capacity -- summation of capacities of all submaps -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> size_t AtomicHashMap:: capacity() const { @@ -322,13 +340,14 @@ capacity() const { // spaceRemaining -- // number of new insertions until current submaps are all at max load -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> size_t AtomicHashMap:: spaceRemaining() const { @@ -346,13 +365,14 @@ spaceRemaining() const { // clear -- Wipes all keys and values from primary map and destroys // all secondary maps. Not thread safe. -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> void AtomicHashMap:: clear() { @@ -369,13 +389,14 @@ clear() { } // size -- -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> size_t AtomicHashMap:: size() const { @@ -405,13 +426,14 @@ size() const { // 31 1 // 27-30 which subMap // 0-26 subMap offset (index_ret input) -template +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> inline uint32_t AtomicHashMap:: @@ -430,13 +452,14 @@ AtomicHashMap +template < + typename KeyT, + typename ValueT, + typename HashFcn, + typename EqualFcn, + typename Allocator, + typename ProbeFcn, + typename KeyConvertFcn> template struct AtomicHashMap:: @@ -448,7 +471,7 @@ struct AtomicHashMap magic keeps us well-behaved for // is_convertible<> (v. the iterator_facade documentation). - template + template ahm_iterator(const ahm_iterator& o, typename std::enable_if< std::is_convertible::value >::type* = 0)