SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
concept.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <initializer_list>
16 #include <iterator>
17 #include <type_traits>
18 
19 // remove if is_basic_string is not needed anymore
20 #include <string>
21 
22 #include <seqan3/std/iterator>
23 #include <seqan3/std/concepts>
24 
25 #include <seqan3/core/platform.hpp>
26 
27 // TODO:
28 // * remove is_basic_string
29 // * remove #include <string> in this file
30 // once the gcc bug [1] was fixed AND we require at least a gcc version which
31 // contains this fix
32 //
33 // [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83328
34 namespace seqan3::detail
35 {
37 
40 template <typename basic_string_t>
41 struct is_basic_string : std::false_type
42 {};
43 
46 template <typename value_t, typename traits_t, typename allocator_t>
47 struct is_basic_string<std::basic_string<value_t, traits_t, allocator_t>> : std::true_type
48 {};
49 
52 template <typename basic_string_t>
53 constexpr bool is_basic_string_v = is_basic_string<basic_string_t>::value;
54 
56 
57 } // seqan3::detail
58 
59 namespace seqan3
60 {
61 
79 template <typename type>
81 SEQAN3_CONCEPT container = requires (type val, type val2, type const cval, typename type::iterator it)
82 {
83  // member types
84  typename type::value_type;
85  typename type::reference;
86  typename type::const_reference;
87 /*
88  typename type::iterator;
89  requires std::forward_iterator<typename type::iterator>;
90  // NOTE check whether iterator is const convertible
91  SEQAN3_RETURN_TYPE_CONSTRAINT(it, std::same_as, typename type::const_iterator);
92 
93  typename type::const_iterator;
94  requires std::forward_iterator<typename type::const_iterator>;
95 
96  typename type::difference_type;
97  typename type::size_type;
98  requires std::is_same_v<
99  typename type::difference_type,
100  typename std::iterator_traits<typename type::iterator>::difference_type
101  >;
102  requires std::is_same_v<
103  typename std::iterator_traits<typename type::iterator>::difference_type,
104  typename std::iterator_traits<typename type::const_iterator>::difference_type
105  >;
106 */
107  // methods and operator
108  SEQAN3_RETURN_TYPE_CONSTRAINT(type{}, std::same_as, type); // default constructor
109  SEQAN3_RETURN_TYPE_CONSTRAINT(type{type{}}, std::same_as, type); // copy/move constructor
110  SEQAN3_RETURN_TYPE_CONSTRAINT(val = val2, std::same_as, type &); // assignment
111  { (&val)->~type() }; // destructor
112 
113  SEQAN3_RETURN_TYPE_CONSTRAINT(val.begin(), std::same_as, typename type::iterator);
114  SEQAN3_RETURN_TYPE_CONSTRAINT(val.end(), std::same_as, typename type::iterator);
115  SEQAN3_RETURN_TYPE_CONSTRAINT(cval.begin(), std::same_as, typename type::const_iterator);
116  SEQAN3_RETURN_TYPE_CONSTRAINT(cval.end(), std::same_as, typename type::const_iterator);
117  SEQAN3_RETURN_TYPE_CONSTRAINT(val.cbegin(), std::same_as, typename type::const_iterator);
118  SEQAN3_RETURN_TYPE_CONSTRAINT(val.cend(), std::same_as, typename type::const_iterator);
119 
120  requires !std::equality_comparable<typename type::value_type> || std::equality_comparable<type>;
121 
122  SEQAN3_RETURN_TYPE_CONSTRAINT(val.swap(val2), std::same_as, void);
123  SEQAN3_RETURN_TYPE_CONSTRAINT(swap(val, val2), std::same_as, void);
124  SEQAN3_RETURN_TYPE_CONSTRAINT(std::swap(val, val2), std::same_as, void);
125 
126  SEQAN3_RETURN_TYPE_CONSTRAINT(val.size(), std::same_as, typename type::size_type);
127  SEQAN3_RETURN_TYPE_CONSTRAINT(val.max_size(), std::same_as, typename type::size_type);
128  SEQAN3_RETURN_TYPE_CONSTRAINT(val.empty(), std::same_as, bool);
129 };
131 
144 template <typename type>
146 SEQAN3_CONCEPT sequence_container = requires (type val, type val2, type const cval)
147 {
148  requires container<type>;
149 
150  // construction
151  { type{typename type::size_type{}, typename type::value_type{}} };
152  { type{val2.begin(), val2.end()} }; // NOTE that this could be any input iterator:
155 
156  // assignment NOTE return type is type & for std::string and void for other stl containers:
157  { val.assign(val2.begin(), val2.end()) };
159  { val.assign(typename type::size_type{}, typename type::value_type{}) };
160 
161  // modify container
162  // TODO: how do you model this?
163  // SEQAN3_RETURN_TYPE_CONSTRAINT(val.emplace(typename type::const_iterator{}, ?),
164  // std::same_as, typename type::iterator);
165  SEQAN3_RETURN_TYPE_CONSTRAINT(val.insert(val.cbegin(), val2.front()), std::same_as, typename type::iterator);
166  SEQAN3_RETURN_TYPE_CONSTRAINT(val.insert(val.cbegin(), typename type::value_type{}),
167  std::same_as, typename type::iterator);
168  SEQAN3_RETURN_TYPE_CONSTRAINT(val.insert(val.cbegin(), typename type::size_type{}, typename type::value_type{}),
169  std::same_as, typename type::iterator);
170  SEQAN3_RETURN_TYPE_CONSTRAINT(val.insert(val.cbegin(), val2.begin(), val2.end()),
171  std::same_as, typename type::iterator);
172  requires detail::is_basic_string_v<type> || requires(type val)
173  {
174  // TODO this function is not defined on strings (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83328)
176  std::same_as, typename type::iterator);
177  };
178 
179  SEQAN3_RETURN_TYPE_CONSTRAINT(val.erase(val.cbegin()), std::same_as, typename type::iterator);
180  SEQAN3_RETURN_TYPE_CONSTRAINT(val.erase(val.cbegin(), val.cend()), std::same_as, typename type::iterator);
181 
182  SEQAN3_RETURN_TYPE_CONSTRAINT(val.push_back(val.front()), std::same_as, void);
183  SEQAN3_RETURN_TYPE_CONSTRAINT(val.push_back(typename type::value_type{}), std::same_as, void);
184  SEQAN3_RETURN_TYPE_CONSTRAINT(val.pop_back(), std::same_as, void);
185  SEQAN3_RETURN_TYPE_CONSTRAINT(val.clear(), std::same_as, void);
186 
187  // access container
188  SEQAN3_RETURN_TYPE_CONSTRAINT(val.front(), std::same_as, typename type::reference);
189  SEQAN3_RETURN_TYPE_CONSTRAINT(cval.front(), std::same_as, typename type::const_reference);
190  SEQAN3_RETURN_TYPE_CONSTRAINT(val.back(), std::same_as, typename type::reference);
191  SEQAN3_RETURN_TYPE_CONSTRAINT(cval.back(), std::same_as, typename type::const_reference);
192 };
194 
209 template <typename type>
211 SEQAN3_CONCEPT random_access_container = requires (type val)
212 {
213  requires sequence_container<type>;
214 
215  // access container
216  SEQAN3_RETURN_TYPE_CONSTRAINT(val[0], std::same_as, typename type::reference);
217  SEQAN3_RETURN_TYPE_CONSTRAINT(val.at(0), std::same_as, typename type::reference);
218 
219  // modify container
220  SEQAN3_RETURN_TYPE_CONSTRAINT(val.resize(0), std::same_as, void);
221  SEQAN3_RETURN_TYPE_CONSTRAINT(val.resize(0, typename type::value_type{}), std::same_as, void);
222 };
224 
235 template <typename type>
237 SEQAN3_CONCEPT reservible_container = requires (type val)
238 {
240 
241  SEQAN3_RETURN_TYPE_CONSTRAINT(val.capacity(), std::same_as, typename type::size_type);
242  SEQAN3_RETURN_TYPE_CONSTRAINT(val.reserve(0), std::same_as, void);
243  SEQAN3_RETURN_TYPE_CONSTRAINT(val.shrink_to_fit(), std::same_as, void);
244 };
246 
248 
249 } // namespace seqan3
reservible_container
A more refined container concept than seqan3::random_access_container.
std::false_type
sequence_container
A more refined container concept than seqan3::container.
iterator
concepts
The Concepts library.
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
SEQAN3_RETURN_TYPE_CONSTRAINT
#define SEQAN3_RETURN_TYPE_CONSTRAINT(expression, concept_name,...)
Same as writing {expression} -> concept_name<type1[, ...]> in a concept definition.
Definition: platform.hpp:57
std::swap
T swap(T... args)
platform.hpp
Provides platform and dependency checks.
container
The (most general) container concept as defined by the standard library.
std
SeqAn specific customisations in the standard namespace.
random_access_container
A more refined container concept than seqan3::sequence_container.
initializer_list
string