#pragma once #include #include template < typename Key, typename Cell, typename Hash = DefaultHash, typename Grower = TwoLevelHashTableGrower<>, typename Allocator = HashTableAllocator > class TwoLevelHashMapTable : public TwoLevelHashTable> { public: typedef Key key_type; typedef typename Cell::Mapped mapped_type; typedef typename Cell::value_type value_type; using TwoLevelHashTable >::TwoLevelHashTable; mapped_type & ALWAYS_INLINE operator[](Key x) { typename TwoLevelHashMapTable::iterator it; bool inserted; this->emplace(x, it, inserted); if (!__has_trivial_constructor(mapped_type) && inserted) new(&it->second) mapped_type(); return it->second; } }; template < typename Key, typename Mapped, typename Hash = DefaultHash, typename Grower = TwoLevelHashTableGrower<>, typename Allocator = HashTableAllocator > using TwoLevelHashMap = TwoLevelHashMapTable, Hash, Grower, Allocator>; template < typename Key, typename Mapped, typename Hash = DefaultHash, typename Grower = TwoLevelHashTableGrower<>, typename Allocator = HashTableAllocator > using TwoLevelHashMapWithSavedHash = TwoLevelHashMapTable, Hash, Grower, Allocator>;