24inline constexpr bool is_mpl_na<T, std::void_t<
decltype(std::declval<T>().~na())>> =
true;
37 return boost::multi_index::indexed_by<boost::multi_index::sequenced<>, std::tuple_element_t<I, Tuple>...>{};
67 explicit Container(size_t max_size)
71 template <
typename... Args>
72 bool emplace(Args&&... args) {
73 auto& seq_index = container_.
template get<0>();
74 auto result = seq_index.emplace_front(std::forward<Args>(args)...);
77 seq_index.relocate(seq_index.begin(), result.first);
78 }
else if (seq_index.size() > max_size_) {
84 bool insert(
const Value& value) {
return emplace(value); }
86 bool insert(Value&& value) {
return emplace(std::move(value)); }
88 template <
typename Tag,
typename Key>
89 auto find(
const Key& key) {
90 auto& primary_index = container_.
template get<Tag>();
91 auto it = primary_index.find(key);
93 if (it != primary_index.end()) {
94 auto& seq_index = container_.
template get<0>();
95 auto seq_it = container_.
template project<0>(it);
96 seq_index.relocate(seq_index.begin(), seq_it);
102 template <
typename Tag,
typename Key>
103 bool contains(
const Key& key) {
104 return this->
template find<Tag, Key>(key) != container_.
template get<Tag>().end();
107 template <
typename Tag,
typename Key>
108 bool erase(
const Key& key) {
109 return container_.
template get<Tag>().erase(key) > 0;
112 std::size_t size()
const {
return container_.size(); }
113 bool empty()
const {
return container_.empty(); }
114 std::size_t capacity()
const {
return max_size_; }
116 void set_capacity(std::size_t new_capacity) {
117 max_size_ = new_capacity;
118 auto& seq_index = container_.
template get<0>();
119 while (container_.size() > max_size_) {
120 seq_index.pop_back();
124 void clear() { container_.clear(); }
126 template <
typename Tag>
128 return container_.
template get<Tag>().end();
132 using ExtendedIndexSpecifierList = impl::add_seq_index_t<IndexSpecifierList>;
134 using BoostContainer = boost::multi_index::multi_index_container<Value, ExtendedIndexSpecifierList, Allocator>;
136 BoostContainer container_;
137 std::size_t max_size_;