1#ifndef MSTL_CORE_TYPEINFO_CONCEPTS_HPP__
2#define MSTL_CORE_TYPEINFO_CONCEPTS_HPP__
14#ifdef MSTL_STANDARD_20__
30template <
typename T1,
typename T2>
31concept same_as = is_same_v<T1, T2> && is_same_v<T2, T1>;
44template <
typename T1,
typename T2>
45concept common_reference_with =
requires {
46 typename common_reference_t<T1, T2>;
47 typename common_reference_t<T2, T1>;
49&& same_as<common_reference_t<T1, T2>, common_reference_t<T2, T1>>
65template <
typename T1,
typename T2>
71&& common_reference_with<add_lvalue_reference_t<common_type_t<T1, T2>>,
82template <
typename Derived,
typename Base>
92template <
typename T,
typename... Args>
93concept constructible_from = is_constructible_v<T, Args...>;
101concept move_constructible = is_move_constructible_v<T>;
113concept copy_constructible = move_constructible<T>
126concept default_initializable = constructible_from<T> &&
requires {
128 ::new (
static_cast<void*
>(
nullptr)) T;
139template <typename To, typename From>
140concept assignable_from = is_lvalue_reference_v<To>
142&& requires(To x, From&& y) {
143 { x =
static_cast<From&&
>(y) } -> same_as<To>;
159concept movable = is_object_v<T>
160&& move_constructible<T>
161&& assignable_from<T&, T>
172concept copyable = copy_constructible<T>
174&& assignable_from<T&, T&>
175&& assignable_from<T&, const T&>
176&& assignable_from<T&, const T>;
187template <
typename T1,
typename T2>
188concept one_way_equality_comparable =
200template <
typename T1,
typename T2>
201concept both_equality_comparable =
202one_way_equality_comparable<T1, T2>&& one_way_equality_comparable<T2, T1>;
210concept equality_comparable = one_way_equality_comparable<T, T>;
218template <
typename T1,
typename T2>
219concept equality_comparable_with = equality_comparable<T1> && equality_comparable<T2>
222&& both_equality_comparable<T1, T2>;
231template <
typename T1,
typename T2>
245template <
typename T1,
typename T2>
246concept both_ordered_with = one_way_ordered<T1, T2>&& one_way_ordered<T2, T1>;
256concept totally_ordered = equality_comparable<T> && one_way_ordered<T, T>;
264template <
typename T1,
typename T2>
265concept totally_ordered_with = totally_ordered<T1> && totally_ordered<T2>
266&& equality_comparable_with<T1, T2>
268&& both_ordered_with<T1, T2>;
279concept semiregular = copyable<T> && default_initializable<T>;
289concept regular = semiregular<T> && equality_comparable<T>;
298concept iterator_typedef =
requires() {
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>;
334template <
typename Iterator>
335concept forward_iterator = both_ordered_with<Iterator, Iterator> && semiregular<Iterator>
336&& input_iterator<Iterator> &&
requires(Iterator it1, Iterator it2) {
347template <
typename Iterator>
348concept bidirectional_iterator = forward_iterator<Iterator> &&
requires(Iterator it) {
349 { --it } -> same_as<Iterator&>;
350 { it-- } -> same_as<Iterator>;
360template <
typename Iterator>
361concept random_access_iterator = bidirectional_iterator<Iterator>
379template <
typename Iterator>
380concept contiguous_iterator = random_access_iterator<Iterator>
381&& is_lvalue_reference_v<iter_reference_t<Iterator>>
383&&
requires(
const Iterator& i) {
384 {
_MSTL to_address(i) } -> same_as<add_pointer_t<iter_reference_t<Iterator>>>;
396template <
typename Sentinel,
typename Iterator>
397concept sentinel_for =
398 input_iterator<Iterator> &&
399 semiregular<Sentinel> &&
400 requires(
const Iterator& i,
const Sentinel& s) {
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>>;
420 requires(
const Iterator& i,
const Sentinel& s) {
421 { i + (s - i) } -> same_as<Iterator>;
446template <
typename Derived>
452 constexpr auto begin()
const {
453 return static_cast<const Derived*
>(
this)->
begin();
459 constexpr auto end()
const {
460 return static_cast<const Derived*
>(
this)->
end();
466 constexpr auto begin() {
467 return static_cast<Derived*
>(
this)->
begin();
473 constexpr auto end() {
474 return static_cast<Derived*
>(
this)->
end();
500MSTL_INLINE17
constexpr bool is_view_v = is_base_of_v<_MSTL_RANGES view_base<T>, T>;
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;
528template <
typename Iterator>
536template <
typename Iterator>
538#ifdef MSTL_STANDARD_20__
539iterator_typedef<Iterator> &&
551template <
typename Iterator>
559template <
typename Iterator>
561#ifdef MSTL_STANDARD_20__
562input_iterator<Iterator> &&
571template <
typename Iterator>
578template <
typename Iterator>
580#ifdef MSTL_STANDARD_20__
581forward_iterator<Iterator> &&
590template <
typename Iterator>
597template <
typename Iterator>
599#ifdef MSTL_STANDARD_20__
600bidirectional_iterator<Iterator> &&
609template <
typename Iterator>
616template <
typename Iterator>
618#ifdef MSTL_STANDARD_20__
619random_access_iterator<Iterator> &&
628template <
typename Iterator>
636template <
typename Iterator>
638#ifdef MSTL_STANDARD_20__
639random_access_iterator<Iterator> &&
641is_lvalue_reference_v<decltype(*_MSTL declval<Iterator&>())> && is_same_v<
remove_cv_t<Iterator>, Iterator>
typename add_reference< T >::lvalue add_lvalue_reference_t
add_lvalue_reference的便捷别名
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的类型