#pragma once #include "compact_vector.h" namespace NYT { /////////////////////////////////////////////////////////////////////////////// //! A flat map implementation over TCompactVector that tries to keep data inline. /*! * Similarly to SmallSet, this is implemented via binary search over a sorted * vector. Unlike SmallSet, however, this one never falls back to std::map (or * set) for larger sizes. This means that the flat map is only useful * - at small sizes, when there's absolutely no chance of it getting big, or * - when it's filled once and is then only read from. * * In return, the flat map provides * - a smaller size overhead and * - a guarantee that if data fits into inline storage, it goes there. * * Because of the latter, one should be very careful with iterators: virtually * any call to insert or erase may potentially invalidate all iterators. */ template class TCompactFlatMap { public: // NB: can't make this pair as TCompactVector requires its type // parameter to be copy-assignable. using value_type = std::pair; using key_type = K; using mapped_type = V; private: using TStorage = TCompactVector; struct TKeyComparer { bool operator()(const K& lhs, const value_type& rhs) { return lhs < rhs.first; } bool operator()(const value_type& lhs, const K& rhs) { return lhs.first < rhs; } }; public: using iterator = typename TStorage::iterator; using const_iterator = typename TStorage::const_iterator; using size_type = size_t; TCompactFlatMap() = default; template TCompactFlatMap(TInputIterator begin, TInputIterator end); TCompactFlatMap(std::initializer_list values); bool operator==(const TCompactFlatMap& rhs) const; bool operator!=(const TCompactFlatMap& rhs) const; iterator begin(); const_iterator begin() const; const_iterator cbegin() const; iterator end(); const_iterator end() const; const_iterator cend() const; void reserve(size_type n); size_type size() const; int ssize() const; [[nodiscard]] bool empty() const; void clear(); void shrink_to_small(); iterator find(const K& k); const_iterator find(const K& k) const; iterator lower_bound(const K& k); const_iterator lower_bound(const K& k) const; iterator upper_bound(const K& k); const_iterator upper_bound(const K& k) const; std::pair equal_range(const K& k); std::pair equal_range(const K& k) const; bool contains(const K& k) const; std::pair insert(const value_type& value); std::pair insert(value_type&& value); template void insert(TInputIterator begin, TInputIterator end); template std::pair emplace(TArgs&&... args); V& operator[](const K& k); void erase(const K& k); void erase(iterator pos); void erase(iterator b, iterator e); private: TStorage Storage_; template std::pair do_insert(TArg&& value); }; //////////////////////////////////////////////////////////////////////////////// } // namespace NYT #define COMPACT_FLAT_MAP_INL_H_ #include "compact_flat_map-inl.h" #undef COMPACT_FLAT_MAP_INL_H_