1*0be1883cSHui //===----------------------------------------------------------------------===// 2*0be1883cSHui // 3*0be1883cSHui // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0be1883cSHui // See https://llvm.org/LICENSE.txt for license information. 5*0be1883cSHui // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0be1883cSHui // 7*0be1883cSHui //===----------------------------------------------------------------------===// 8*0be1883cSHui 9*0be1883cSHui #ifndef SUPPORT_MIN_SEQUENCE_CONTAINER_H 10*0be1883cSHui #define SUPPORT_MIN_SEQUENCE_CONTAINER_H 11*0be1883cSHui 12*0be1883cSHui #include <initializer_list> 13*0be1883cSHui #include <vector> 14*0be1883cSHui 15*0be1883cSHui #include "test_iterators.h" 16*0be1883cSHui 17*0be1883cSHui template <class T, class Iterator = random_access_iterator<T*>, class ConstIterator = random_access_iterator<const T*>> 18*0be1883cSHui struct MinSequenceContainer { 19*0be1883cSHui using value_type = T; 20*0be1883cSHui using difference_type = int; 21*0be1883cSHui using size_type = unsigned int; 22*0be1883cSHui using iterator = Iterator; 23*0be1883cSHui using const_iterator = ConstIterator; 24*0be1883cSHui 25*0be1883cSHui explicit MinSequenceContainer() = default; 26*0be1883cSHui template <class It> 27*0be1883cSHui explicit MinSequenceContainer(It first, It last) : data_(first, last) {} 28*0be1883cSHui MinSequenceContainer(std::initializer_list<T> il) : data_(il) {} 29*0be1883cSHui iterator begin() { return iterator(data_.data()); } 30*0be1883cSHui const_iterator begin() const { return const_iterator(data_.data()); } 31*0be1883cSHui const_iterator cbegin() const { return const_iterator(data_.data()); } 32*0be1883cSHui iterator end() { return begin() + size(); } 33*0be1883cSHui const_iterator end() const { return begin() + size(); } 34*0be1883cSHui size_type size() const { return data_.size(); } 35*0be1883cSHui bool empty() const { return data_.empty(); } 36*0be1883cSHui 37*0be1883cSHui void clear() { data_.clear(); } 38*0be1883cSHui 39*0be1883cSHui template <class It> 40*0be1883cSHui iterator insert(const_iterator p, It first, It last) { 41*0be1883cSHui return from_vector_iterator(data_.insert(to_vector_iterator(p), first, last)); 42*0be1883cSHui } 43*0be1883cSHui 44*0be1883cSHui iterator insert(const_iterator p, T value) { 45*0be1883cSHui return from_vector_iterator(data_.insert(to_vector_iterator(p), std::move(value))); 46*0be1883cSHui } 47*0be1883cSHui 48*0be1883cSHui iterator erase(const_iterator first, const_iterator last) { 49*0be1883cSHui return from_vector_iterator(data_.erase(to_vector_iterator(first), to_vector_iterator(last))); 50*0be1883cSHui } 51*0be1883cSHui 52*0be1883cSHui iterator erase(const_iterator iter) { return from_vector_iterator(data_.erase(to_vector_iterator(iter))); } 53*0be1883cSHui 54*0be1883cSHui template <class... Args> 55*0be1883cSHui iterator emplace(const_iterator pos, Args&&... args) { 56*0be1883cSHui return from_vector_iterator(data_.emplace(to_vector_iterator(pos), std::forward<Args>(args)...)); 57*0be1883cSHui } 58*0be1883cSHui 59*0be1883cSHui private: 60*0be1883cSHui std::vector<T>::const_iterator to_vector_iterator(const_iterator cit) const { return cit - cbegin() + data_.begin(); } 61*0be1883cSHui 62*0be1883cSHui iterator from_vector_iterator(std::vector<T>::iterator it) { return it - data_.begin() + begin(); } 63*0be1883cSHui 64*0be1883cSHui std::vector<T> data_; 65*0be1883cSHui }; 66*0be1883cSHui 67*0be1883cSHui namespace MinSequenceContainer_detail { 68*0be1883cSHui 69*0be1883cSHui // MinSequenceContainer is non-allocator-aware, because flat_set supports 70*0be1883cSHui // such (non-STL) container types, and we want to make sure they are supported. 71*0be1883cSHui template <class T> 72*0be1883cSHui concept HasAllocatorType = requires { typename T::allocator_type; }; 73*0be1883cSHui static_assert(!HasAllocatorType<MinSequenceContainer<int>>); 74*0be1883cSHui 75*0be1883cSHui // MinSequenceContainer by itself doesn't support .emplace(), because we want 76*0be1883cSHui // to at least somewhat support (non-STL) container types with nothing but .insert(). 77*0be1883cSHui template <class T> 78*0be1883cSHui concept HasEmplace = requires(T& t) { t.emplace(42); }; 79*0be1883cSHui static_assert(!HasEmplace<MinSequenceContainer<int>>); 80*0be1883cSHui 81*0be1883cSHui } // namespace MinSequenceContainer_detail 82*0be1883cSHui 83*0be1883cSHui #endif // SUPPORT_MIN_SEQUENCE_CONTAINER_H 84