#ifndef COMPACT_FLAT_SET_INL_H_ #error "Direct inclusion of this file is not allowed, include compact_flat_set.h" // For the sake of sane code completion. #include "compact_flat_set.h" #endif namespace NYT { /////////////////////////////////////////////////////////////////////////////// template template TCompactFlatSet::TCompactFlatSet(TInputIterator begin, TInputIterator end) { insert(begin, end); } template TCompactFlatSet::TCompactFlatSet(std::initializer_list values) : TCompactFlatSet(values.begin(), values.end()) { } template typename TCompactFlatSet::iterator TCompactFlatSet::begin() { return Storage_.begin(); } template typename TCompactFlatSet::const_iterator TCompactFlatSet::begin() const { return Storage_.begin(); } template typename TCompactFlatSet::const_iterator TCompactFlatSet::cbegin() const { return Storage_.begin(); } template typename TCompactFlatSet::iterator TCompactFlatSet::end() { return Storage_.end(); } template typename TCompactFlatSet::const_iterator TCompactFlatSet::end() const { return Storage_.end(); } template typename TCompactFlatSet::const_iterator TCompactFlatSet::cend() const { return Storage_.end(); } template typename TCompactFlatSet::reverse_iterator TCompactFlatSet::rbegin() { return Storage_.rbegin(); } template typename TCompactFlatSet::const_reverse_iterator TCompactFlatSet::rbegin() const { return Storage_.rbegin(); } template typename TCompactFlatSet::reverse_iterator TCompactFlatSet::rend() { return Storage_.rend(); } template typename TCompactFlatSet::const_reverse_iterator TCompactFlatSet::rend() const { return Storage_.rend(); } template void TCompactFlatSet::reserve(size_type size) { Storage_.reserve(size); } template typename TCompactFlatSet::size_type TCompactFlatSet::size() const { return Storage_.size(); } template int TCompactFlatSet::ssize() const { return static_cast(Storage_.size()); } template bool TCompactFlatSet::empty() const { return Storage_.empty(); } template void TCompactFlatSet::clear() { Storage_.clear(); } template void TCompactFlatSet::shrink_to_small() { Storage_.shrink_to_small(); } template typename TCompactFlatSet::iterator TCompactFlatSet::find(const TValue& value) { auto [rangeBegin, rangeEnd] = equal_range(value); return rangeBegin == rangeEnd ? end() : rangeBegin; } template typename TCompactFlatSet::const_iterator TCompactFlatSet::find(const TValue& value) const { auto [rangeBegin, rangeEnd] = equal_range(value); return rangeBegin == rangeEnd ? end() : rangeBegin; } template typename TCompactFlatSet::size_type TCompactFlatSet::count(const TValue& value) const { auto [rangeBegin, rangeEnd] = equal_range(value); return rangeEnd - rangeBegin; } template typename TCompactFlatSet::const_iterator TCompactFlatSet::lower_bound(const TValue& value) const { return std::ranges::lower_bound(Storage_, value); } template typename TCompactFlatSet::iterator TCompactFlatSet::lower_bound(const TValue& value) { return std::ranges::lower_bound(Storage_, value); } template typename TCompactFlatSet::const_iterator TCompactFlatSet::upper_bound(const TValue& value) const { return std::ranges::upper_bound(Storage_, value); } template typename TCompactFlatSet::iterator TCompactFlatSet::upper_bound(const TValue& value) { return std::ranges::upper_bound(Storage_, value); } template std::pair::iterator, typename TCompactFlatSet::iterator> TCompactFlatSet::equal_range(const TValue& value) { auto result = std::ranges::equal_range(Storage_.begin(), Storage_.end(), value); YT_ASSERT(result.size() <= 1); return result; } template std::pair::const_iterator, typename TCompactFlatSet::const_iterator> TCompactFlatSet::equal_range(const TValue& value) const { auto result = std::ranges::equal_range(Storage_.begin(), Storage_.end(), value); YT_ASSERT(result.size() <= 1); return result; } template bool TCompactFlatSet::contains(const TValue& value) const { return find(value) != end(); } template auto TCompactFlatSet::insert(const TValue& value) -> std::pair { return DoInsert(value); } template auto TCompactFlatSet::insert(TValue&& value) -> std::pair { return DoInsert(std::move(value)); } template template void TCompactFlatSet::insert(TInputIterator begin, TInputIterator end) { for (auto it = begin; it != end; ++it) { insert(*it); } } template bool TCompactFlatSet::erase(const TValue& value) { auto [rangeBegin, rangeEnd] = equal_range(value); erase(rangeBegin, rangeEnd); return rangeBegin != rangeEnd; } template void TCompactFlatSet::erase(iterator pos) { Storage_.erase(pos); // Try to keep the storage inline. This is why erase doesn't return an iterator. Storage_.shrink_to_small(); } template void TCompactFlatSet::erase(iterator begin, iterator end) { Storage_.erase(begin, end); // Try to keep the storage inline. This is why erase doesn't return an iterator. Storage_.shrink_to_small(); } template template auto TCompactFlatSet::DoInsert(TArg&& value) -> std::pair { auto [rangeBegin, rangeEnd] = equal_range(value); if (rangeBegin != rangeEnd) { return {rangeBegin, false}; } else { auto it = Storage_.insert(rangeBegin, std::forward(value)); return {it, true}; } } //////////////////////////////////////////////////////////////////////////////// } // namespace NYT