17 #include <type_traits>
32 namespace seqan3::detail
38 template <
typename basic_
string_t>
44 template <
typename value_t,
typename traits_t,
typename allocator_t>
45 struct is_basic_string<
std::basic_string<value_t, traits_t, allocator_t>> :
std::true_type
50 template <
typename basic_
string_t>
51 constexpr
bool is_basic_string_v = is_basic_string<basic_string_t>::value;
77 template <
typename type>
79 SEQAN3_CONCEPT
container = requires (type val, type val2, type
const cval,
typename type::iterator it)
82 typename type::value_type;
83 typename type::reference;
84 typename type::const_reference;
106 { type{type{}} } -> type;
107 { val = val2 } -> type &;
110 { val.begin() } ->
typename type::iterator;
111 { val.end() } ->
typename type::iterator;
112 { cval.begin() } ->
typename type::const_iterator;
113 { cval.end() } ->
typename type::const_iterator;
114 { val.cbegin() } ->
typename type::const_iterator;
115 { val.cend() } ->
typename type::const_iterator;
119 { val.swap(val2) } -> void;
120 {
swap(val, val2) } -> void;
123 { val.size() } ->
typename type::size_type;
124 { val.max_size() } ->
typename type::size_type;
125 { val.empty() } -> bool;
141 template <
typename type>
148 { type{
typename type::size_type{},
typename type::value_type{}} };
149 { type{val2.begin(), val2.end()} };
154 { val.assign(val2.begin(), val2.end()) };
156 { val.assign(
typename type::size_type{},
typename type::value_type{}) };
161 { val.insert(val.cbegin(), val2.front()) } ->
typename type::iterator;
162 { val.insert(val.cbegin(),
typename type::value_type{}) } ->
typename type::iterator;
163 { val.insert(val.cbegin(),
typename type::size_type{},
typename type::value_type{})} ->
typename type::iterator;
164 { val.insert(val.cbegin(), val2.begin(), val2.end()) } ->
typename type::iterator;
165 requires detail::is_basic_string_v<type> || requires(type val)
171 { val.erase(val.cbegin()) } ->
typename type::iterator;
172 { val.erase(val.cbegin(), val.cend()) } ->
typename type::iterator;
174 { val.push_back(val.front()) } -> void;
175 { val.push_back(
typename type::value_type{}) } -> void;
176 { val.pop_back() } -> void;
177 { val.clear() } -> void;
180 { val.front() } ->
typename type::reference;
181 { cval.front() } ->
typename type::const_reference;
182 { val.back() } ->
typename type::reference;
183 { cval.back() } ->
typename type::const_reference;
201 template <
typename type>
208 { val[0] } ->
typename type::reference;
209 { val.at(0) } ->
typename type::reference;
212 { val.resize(0) } -> void;
213 { val.resize(0,
typename type::value_type{}) } -> void;
227 template <
typename type>
233 { val.capacity() } ->
typename type::size_type;
234 { val.reserve(0) } -> void;
235 { val.shrink_to_fit() } -> void;