MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
concepts.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_TYPEINFO_CONCEPTS_HPP__
2#define MSTL_CORE_TYPEINFO_CONCEPTS_HPP__
3
10
13
14#ifdef MSTL_STANDARD_20__
15
21
30template <typename T1, typename T2>
31concept same_as = is_same_v<T1, T2> && is_same_v<T2, T1>;
32
44template <typename T1, typename T2>
45concept common_reference_with = requires {
46 typename common_reference_t<T1, T2>;
47 typename common_reference_t<T2, T1>;
48}
49&& same_as<common_reference_t<T1, T2>, common_reference_t<T2, T1>>
52
65template <typename T1, typename T2>
66concept common_with = requires { typename common_type_t<T1, T2>; typename common_type_t<T2, T1>; }
67&& same_as<common_type_t<T1, T2>, common_type_t<T2, T1>> && requires {
70} && common_reference_with<add_lvalue_reference_t<const T1>, add_lvalue_reference_t<const T2>>
71&& common_reference_with<add_lvalue_reference_t<common_type_t<T1, T2>>,
72 common_reference_t<add_lvalue_reference_t<const T1>, add_lvalue_reference_t<const T2>>>;
73
82template <typename Derived, typename Base>
83concept derived_from = is_base_of_v<Base, Derived> && convertible_to<const volatile Derived*, const volatile Base*>;
84
85
92template <typename T, typename... Args>
93concept constructible_from = is_constructible_v<T, Args...>;
94
100template <typename T>
101concept move_constructible = is_move_constructible_v<T>;
102
112template <typename T>
113concept copy_constructible = move_constructible<T>
114&& constructible_from<T, T&>&& convertible_to<T&, T>
115&& constructible_from<T, const T&>&& convertible_to<const T&, T>
116&& constructible_from<T, const T>&& convertible_to<const T, T>;
117
125template <typename T>
126concept default_initializable = constructible_from<T> && requires {
127 T{};
128 ::new (static_cast<void*>(nullptr)) T;
129};
130
139template <typename To, typename From>
140concept assignable_from = is_lvalue_reference_v<To>
141&& common_reference_with<const remove_reference_t<To>&, const remove_reference_t<From>&>
142&& requires(To x, From&& y) {
143 { x = static_cast<From&&>(y) } -> same_as<To>;
144};
145
146
158template <typename T>
159concept movable = is_object_v<T>
160&& move_constructible<T>
161&& assignable_from<T&, T>
162&& is_swappable_v<T>;
163
171template <typename T>
172concept copyable = copy_constructible<T>
173&& movable<T>
174&& assignable_from<T&, T&>
175&& assignable_from<T&, const T&>
176&& assignable_from<T&, const T>;
177
178
187template <typename T1, typename T2>
188concept one_way_equality_comparable =
189 requires(const remove_reference_t<T1>& x, const remove_reference_t<T2>& y) {
190 { x == y } -> convertible_to<bool>;
191 { x != y } -> convertible_to<bool>;
192};
193
200template <typename T1, typename T2>
201concept both_equality_comparable =
202one_way_equality_comparable<T1, T2>&& one_way_equality_comparable<T2, T1>;
203
209template <typename T>
210concept equality_comparable = one_way_equality_comparable<T, T>;
211
218template <typename T1, typename T2>
219concept equality_comparable_with = equality_comparable<T1> && equality_comparable<T2>
220&& common_reference_with<const remove_reference_t<T1>&, const remove_reference_t<T2>&>
221&& equality_comparable<common_reference_t<const remove_reference_t<T1>&, const remove_reference_t<T2>&>>
222&& both_equality_comparable<T1, T2>;
223
224
231template <typename T1, typename T2>
232concept one_way_ordered = requires(const remove_reference_t<T1>& x, const remove_reference_t<T2>& y) {
233 { x < y } -> convertible_to<bool>;
234 { x > y } -> convertible_to<bool>;
235 { x <= y } -> convertible_to<bool>;
236 { x >= y } -> convertible_to<bool>;
237};
238
245template <typename T1, typename T2>
246concept both_ordered_with = one_way_ordered<T1, T2>&& one_way_ordered<T2, T1>;
247
255template <typename T>
256concept totally_ordered = equality_comparable<T> && one_way_ordered<T, T>;
257
264template <typename T1, typename T2>
265concept totally_ordered_with = totally_ordered<T1> && totally_ordered<T2>
266&& equality_comparable_with<T1, T2>
267&& totally_ordered<common_reference_t<const remove_reference_t<T1>&, const remove_reference_t<T2>&>>
268&& both_ordered_with<T1, T2>;
269
270
278template <typename T>
279concept semiregular = copyable<T> && default_initializable<T>;
280
288template <typename T>
289concept regular = semiregular<T> && equality_comparable<T>;
290
291
297template <typename T>
298concept iterator_typedef = requires() {
304};
305
316template <typename Iterator>
317concept input_iterator = both_equality_comparable<Iterator, Iterator>
318&& iterator_typedef<Iterator> && requires(Iterator it) {
320 { ++it } -> same_as<Iterator&>;
321 { it++ } -> same_as<Iterator>;
322};
323
334template <typename Iterator>
335concept forward_iterator = both_ordered_with<Iterator, Iterator> && semiregular<Iterator>
336&& input_iterator<Iterator> && requires(Iterator it1, Iterator it2) {
338};
339
347template <typename Iterator>
348concept bidirectional_iterator = forward_iterator<Iterator> && requires(Iterator it) {
349 { --it } -> same_as<Iterator&>;
350 { it-- } -> same_as<Iterator>;
351};
352
360template <typename Iterator>
361concept random_access_iterator = bidirectional_iterator<Iterator>
362&& requires(Iterator it1, Iterator it2, typename iterator_traits<Iterator>::difference_type n) {
363 { it1 + n } -> convertible_to<Iterator>;
364 { n + it1 } -> convertible_to<Iterator>;
365 { it1 - n } -> convertible_to<Iterator>;
366 { it1 += n } -> convertible_to<Iterator>;
367 { it1 -= n } -> convertible_to<Iterator>;
370};
371
379template <typename Iterator>
380concept contiguous_iterator = random_access_iterator<Iterator>
381&& is_lvalue_reference_v<iter_reference_t<Iterator>>
382&& same_as<iter_value_t<Iterator>, remove_cvref_t<iter_reference_t<Iterator>>>
383&& requires(const Iterator& i) {
384 { _MSTL to_address(i) } -> same_as<add_pointer_t<iter_reference_t<Iterator>>>;
385};
386
387
396template <typename Sentinel, typename Iterator>
397concept sentinel_for =
398 input_iterator<Iterator> &&
399 semiregular<Sentinel> &&
400 requires(const Iterator& i, const Sentinel& s) {
401 { i == s } -> convertible_to<bool>;
402 { i != s } -> convertible_to<bool>;
403 };
404
413template <typename Sentinel, typename Iterator>
414concept sized_sentinel_for =
415 input_iterator<Iterator> &&
416 sentinel_for<Sentinel, Iterator> &&
417 requires(const Iterator& i, const Sentinel& s) {
418 { s - i } -> same_as<iter_difference_t<Iterator>>;
419 } &&
420 requires(const Iterator& i, const Sentinel& s) {
421 { i + (s - i) } -> same_as<Iterator>;
422 };
423 // Concepts
425
431
437
446template <typename Derived>
447struct view_base {
452 constexpr auto begin() const {
453 return static_cast<const Derived*>(this)->begin();
454 }
459 constexpr auto end() const {
460 return static_cast<const Derived*>(this)->end();
461 }
466 constexpr auto begin() {
467 return static_cast<Derived*>(this)->begin();
468 }
473 constexpr auto end() {
474 return static_cast<Derived*>(this)->end();
475 }
476};
477
479
485template <typename T>
486struct is_view : false_type {};
487
492template <typename D>
493struct is_view<_MSTL_RANGES view_base<D>> : true_type {};
494
499template <typename T>
500MSTL_INLINE17 constexpr bool is_view_v = is_base_of_v<_MSTL_RANGES view_base<T>, T>;
501 // View
503
504#endif // MSTL_STANDARD_20__
505
511
514template <typename, typename = void>
515MSTL_INLINE17 constexpr bool __is_iterator_with_cate_v = false;
516template <typename Iterator>
517MSTL_INLINE17 constexpr bool __is_iterator_with_cate_v<Iterator, void_t<iter_category_t<Iterator>>> = true;
520
528template <typename Iterator>
529MSTL_INLINE17 constexpr bool is_ranges_iter_v = _INNER __is_iterator_with_cate_v<Iterator>;
530
536template <typename Iterator>
537MSTL_INLINE17 constexpr bool is_iter_v =
538#ifdef MSTL_STANDARD_20__
539iterator_typedef<Iterator> &&
540#endif
542
543
551template <typename Iterator>
552MSTL_INLINE17 constexpr bool is_ranges_input_iter_v = is_convertible_v<iter_category_t<Iterator>, input_iterator_tag>;
553
559template <typename Iterator>
560MSTL_INLINE17 constexpr bool is_input_iter_v =
561#ifdef MSTL_STANDARD_20__
562input_iterator<Iterator> &&
563#endif
565
566
571template <typename Iterator>
572MSTL_INLINE17 constexpr bool is_ranges_fwd_iter_v = is_convertible_v<iter_category_t<Iterator>, forward_iterator_tag>;
573
578template <typename Iterator>
579MSTL_INLINE17 constexpr bool is_fwd_iter_v =
580#ifdef MSTL_STANDARD_20__
581forward_iterator<Iterator> &&
582#endif
584
585
590template <typename Iterator>
591MSTL_INLINE17 constexpr bool is_ranges_bid_iter_v = is_convertible_v<iter_category_t<Iterator>, bidirectional_iterator_tag>;
592
597template <typename Iterator>
598MSTL_INLINE17 constexpr bool is_bid_iter_v =
599#ifdef MSTL_STANDARD_20__
600bidirectional_iterator<Iterator> &&
601#endif
603
604
609template <typename Iterator>
610MSTL_INLINE17 constexpr bool is_ranges_rnd_iter_v = is_convertible_v<iter_category_t<Iterator>, random_access_iterator_tag>;
611
616template <typename Iterator>
617MSTL_INLINE17 constexpr bool is_rnd_iter_v =
618#ifdef MSTL_STANDARD_20__
619random_access_iterator<Iterator> &&
620#endif
622
623
628template <typename Iterator>
629MSTL_INLINE17 constexpr bool is_ranges_cot_iter_v =
630is_convertible_v<iter_category_t<Iterator>, contiguous_iterator_tag>;
631
636template <typename Iterator>
637MSTL_INLINE17 constexpr bool is_cot_iter_v =
638#ifdef MSTL_STANDARD_20__
639random_access_iterator<Iterator> &&
640#endif // MSTL_STANDARD_20__
641is_lvalue_reference_v<decltype(*_MSTL declval<Iterator&>())> && is_same_v<remove_cv_t<Iterator>, Iterator>
643 // IteratorChecks
645
647#endif // MSTL_CORE_TYPEINFO_CONCEPTS_HPP__
检查类型From是否可以转换为类型To
typename add_reference< T >::lvalue add_lvalue_reference_t
add_lvalue_reference的便捷别名
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
MSTL_INLINE17 constexpr bool is_iter_v
检查类型是否为迭代器
MSTL_INLINE17 constexpr bool is_cot_iter_v
检查是否为连续迭代器
MSTL_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
MSTL_INLINE17 constexpr bool is_rnd_iter_v
检查是否为随机访问迭代器
MSTL_INLINE17 constexpr bool is_fwd_iter_v
检查是否为前向迭代器
MSTL_INLINE17 constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
MSTL_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
MSTL_INLINE17 constexpr bool is_ranges_cot_iter_v
检查是否为范围连续迭代器
MSTL_INLINE17 constexpr bool is_input_iter_v
检查是否为输入迭代器
MSTL_INLINE17 constexpr bool is_bid_iter_v
检查是否为双向迭代器
MSTL_INLINE17 constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
MSTL_INLINE17 constexpr bool is_ranges_iter_v
检查类型是否为范围迭代器
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_END_RANGES__
结束ranges命名空间
#define _MSTL_RANGES
ranges命名空间前缀
#define MSTL_BEGIN_INNER__
开始inner命名空间
#define MSTL_BEGIN_RANGES__
开始ranges命名空间
constexpr T * to_address(T *ptr) noexcept
安全地获取原始指针指向的地址
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
typename remove_reference< T >::type remove_reference_t
remove_reference的便捷别名
typename remove_cv< T >::type remove_cv_t
remove_cv的便捷别名
typename common_type< Types... >::type common_type_t
common_type的便捷别名
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
bool_constant< true > true_type
表示true的类型
bool_constant< false > false_type
表示false的类型
MSTL迭代器萃取和指针萃取
双向迭代器标签
连续迭代器标签
前向迭代器标签
输入迭代器标签
迭代器特性主模板
随机访问迭代器标签