21 explicit Container(size_t max_size)
25 template <
typename... Args>
26 auto emplace(Args&&... args) {
27 auto& seq_index = get_sequenced();
28 auto result = seq_index.emplace_front(std::forward<Args>(args)...);
31 seq_index.relocate(seq_index.begin(), result.first);
32 }
else if (seq_index.size() > max_size_) {
38 bool insert(
const Value& value) {
return emplace(value).second; }
40 bool insert(Value&& value) {
return emplace(std::move(value)).second; }
42 template <
typename Tag,
typename Key>
43 auto find(
const Key& key) {
44 auto& primary_index = get_index<Tag>();
45 auto it = primary_index.find(key);
47 if (it != primary_index.end()) {
48 auto& seq_index = get_sequenced();
49 auto seq_it = container_.
template project<0>(it);
50 seq_index.relocate(seq_index.begin(), seq_it);
56 template <
typename Tag,
typename Key>
57 auto find_no_update(
const Key& key)
const {
58 return get_index<Tag>().find(key);
61 template <
typename Tag,
typename Key>
62 auto equal_range(
const Key& key) {
63 auto& primary_index = get_index<Tag>();
65 auto [begin, end] = primary_index.equal_range(key);
68 auto& seq_index = get_sequenced();
70 seq_index.relocate(seq_index.begin(), project_to_sequenced(it));
74 return std::pair{begin, end};
77 template <
typename Tag,
typename Key>
78 auto equal_range_no_update(
const Key& key)
const {
79 return get_index<Tag>().equal_range(key);
82 template <
typename Tag,
typename Key>
83 bool contains(
const Key& key) {
84 return this->
template find<Tag, Key>(key) != end<Tag>();
87 template <
typename Tag,
typename Key>
88 bool contains_no_update(
const Key& key)
const {
89 return this->
template find_no_update<Tag, Key>(key) != end<Tag>();
92 template <
typename Tag,
typename Key>
93 bool erase(
const Key& key) {
94 return get_index<Tag>().erase(key) > 0;
97 std::size_t size()
const noexcept {
return container_.size(); }
98 bool empty()
const noexcept {
return container_.empty(); }
99 std::size_t capacity()
const noexcept {
return max_size_; }
101 void set_capacity(std::size_t new_capacity) {
102 max_size_ = new_capacity;
103 auto& seq_index = get_sequenced();
104 while (container_.size() > max_size_) {
105 seq_index.pop_back();
109 void clear() { container_.clear(); }
111 template <
typename Tag>
113 return get_index<Tag>().end();
117 template <
typename V,
typename I,
typename A>
118 friend class ExpirableContainer;
120 using ExtendedIndexSpecifierList = impl::add_index_t<boost::multi_index::sequenced<>, IndexSpecifierList>;
121 using BoostContainer = boost::multi_index::multi_index_container<Value, ExtendedIndexSpecifierList, Allocator>;
123 BoostContainer container_;
124 std::size_t max_size_;
126 auto& get_sequenced()
noexcept {
return container_.
template get<0>(); }
128 const auto& get_sequenced()
const noexcept {
return container_.
template get<0>(); }
130 template <
typename Tag>
132 return container_.
template get<Tag>();
135 template <
typename Tag>
136 const auto& get_index()
const noexcept {
137 return container_.
template get<Tag>();
140 template <
typename IterT>
141 auto project_to_sequenced(IterT it) {
142 return container_.
template project<0>(it);