uTL
micro Template library
stl.h
Go to the documentation of this file.
1 
21 #ifndef __utl_concepts_stl_h__
22 #define __utl_concepts_stl_h__
23 
24 #include <utl/core/impl.h>
25 #include <utl/meta/meta.h>
26 #include <utl/utility/invoke.h>
27 
28 #include <utl/concepts/defines.h>
29 
38 namespace utl {
40 
41  template <typename T>
42  using remove_cvref_t = std::remove_cv_t< std::remove_reference_t<T> >;
43 
44  template <typename T>
45  using cref_ = const std::remove_reference_t<T>&;
46 
47  template <typename T>
48  using _ref_t = std::add_lvalue_reference_t<T>;
49 
50  template <typename _T1, typename _T2, typename _Ret =_T1>
51  using use_if_same_t = meta::eval<
54  >
55  >;
56 
57 
61  template <class T, class U>
63 
64 // template<class T>
65 // _utlConcept Decayed = Same<T, std::decay_t<T>>;
66 
70  template <class Derived, class Base>
72  std::is_base_of<Base, Derived>::value &&
73  std::is_convertible<const volatile Derived*, const volatile Base*>::value;
74 
75 
79  template <class From, class To>
80  #if CXX_CONCEPTS
82  std::is_convertible<From, To>::value &&
83  requires(From (&f)()) {
84  static_cast<To>(f());
85  };
86  #else
87  _utlConcept ConvertibleTo = std::is_convertible<From, To>::value;
88  #endif
89 
93  namespace common_impl {
96  // ========== common reference ===========
97  template<class T, class U>
98  using __cond_res =
99  decltype(false ? std::declval<T(&)()>()() : std::declval<U(&)()>()());
100 
101  template<class From>
102  struct __copy_cv_ {
103  static_assert(!std::is_reference<From>::value);
104  template<class To> using apply = To;
105  };
106  template<class From>
107  struct __copy_cv_<const From> {
108  template<class To> using apply = const To;
109  };
110  template<class From>
111  struct __copy_cv_<volatile From> {
112  template<class To> using apply = volatile To;
113  };
114  template<class From>
115  struct __copy_cv_<const volatile From> {
116  template<class To> using apply = const volatile To;
117  };
118  template<class From, class To>
120 
121  // CREF [meta.trans.other]/2.1
122  template<class T>
123  using __cref = std::add_lvalue_reference_t<const std::remove_reference_t<T>>;
124 
125  // COMMON_REF [meta.trans.other]/2
126  template<class T, class U, class = void>
127  struct __common_ref_ {
128  static_assert(std::is_reference<T>::value, "");
129  static_assert(std::is_reference<U>::value, "");
130  };
131 
132  template<class T, class U>
134 
135  // [meta.trans.other]/2.5
136  template<class T, class U>
137  using __lref_res = __cond_res<
138  __copy_cv<T, U> &,
140  >;
141 
142  // [meta.trans.other]/2.6
143  template<class T, class U, class R = __common_ref<T&, U&>>
144  using __rref_res = std::remove_reference_t<R>&&;
145 
146  template<class T, class U>
147  struct __common_ref_<T&, U&,
151  };
152 
153  template<class T, class U>
154  struct __common_ref_<T&&, U&&,
159  };
160 
161  // [meta.trans.other]/2.7
162  template<class T, class U>
163  struct __common_ref_<T&&, U&,
167  };
168 
169  // [meta.trans.other]/2.8
170  template<class T, class U>
171  struct __common_ref_<T&, U&&,
175  };
176 
177  template<class>
178  struct __xref {
179  template<class U> using apply = U;
180  };
181  template<class T>
182  struct __xref<const T> {
183  template<class U> using apply = const U;
184  };
185  template<class T>
186  struct __xref<volatile T> {
187  template<class U> using apply = volatile U;
188  };
189  template<class T>
190  struct __xref<const volatile T> {
191  template<class U> using apply = const volatile U;
192  };
193  template<class T>
194  struct __xref<T&> {
195  template<class U> using apply =
196  std::add_lvalue_reference_t<meta::invoke<__xref<T>, U>>;
197  };
198  template<class T>
199  struct __xref<T&&> {
200  template<class U> using apply =
201  std::add_rvalue_reference_t<meta::invoke<__xref<T>, U>>;
202  };
203 
204  template<class,
205  class,
206  template<class> class,
207  template<class> class
208  >
210 
211  template<class T, class U>
218  >
219  >;
220 
221  template<class...>
222  struct common_reference {};
223 
224  template<class... Ts>
226  common_reference<Ts...>
227  >;
228 
229  // [meta.trans.other]/5.2
230  template<class T>
231  struct common_reference<T> {
232  using type = T;
233  };
234 
235  // [meta.trans.other]/5.3.4
236  template<class T, class U, class...>
238  : std::common_type<T, U> {};
239 
240  // [meta.trans.other]/5.3.3
241  template<class T, class U>
242  struct __common_reference3<T, U,
245  };
246 
247  template<class T, class U, class...>
250 
251  // [meta.trans.other]/5.3.2
252  template<class T, class U>
253  struct __common_reference2<T, U,
256  };
257 
258  template <class T, class U, class...>
261 
262  template <class T, class U>
263  struct __common_reference<T, U,
264  meta::when<std::is_reference<T>::value && std::is_reference<U>::value>> {
266  };
267 
268  template<class T, class U>
269  struct common_reference<T, U> : __common_reference<T, U> { };
270 
271  // [meta.trans.other]/5.4
272  template<class T, class U, class V, class... W>
273  //requires requires { typename common_reference_t<T, U>; }
274  struct common_reference<T, U, V, W...>
275  : common_reference <
276  common_reference_t<T, U>, V, W...
277  > {};
278  }
279 
280  template<typename...Ts>
282 
283  template<typename... Ts>
285  common_reference<Ts...>
286  >;
287 
289 
290 
291  //FIXME: CommonReference needs better implementation
292  template <class T, class U>
294  Same<common_reference_t<T, U>, common_reference_t<U, T>> &&
295  ConvertibleTo<T, common_reference_t<T, U>> &&
296  ConvertibleTo<U, common_reference_t<T, U>>;
297 
298 
299  // != std::Common on CommonReference
300  template <class T, class U>
302  #if CXX_CONCEPTS
303  Same<std::common_type_t<T, U>, std::common_type_t<U, T>> &&
304  requires {
305  static_cast<std::common_type_t<T, U>>(std::declval<T>());
306  static_cast<std::common_type_t<T, U>>(std::declval<U>());
307  };
308 // } &&
309 // CommonReference<
310 // std::add_lvalue_reference_t<const T>,
311 // std::add_lvalue_reference_t<const U>> &&
312 // CommonReference<
313 // std::add_lvalue_reference_t<std::common_type_t<T, U>>,
314 // std::common_reference_t<
315 // std::add_lvalue_reference_t<const T>,
316 // std::add_lvalue_reference_t<const U>
317 // >
318 // >;
319  #else
320 // meta::and_ <
321  Same<std::common_type_t<T, U>, std::common_type_t<U, T>>; //>
322 // meta::bool_<CommonReference<
323 // std::add_lvalue_reference_t<const T>,
324 // std::add_lvalue_reference_t<const U>
325 // >>,
326 // meta::bool_< CommonReference<
327 // std::add_lvalue_reference_t<std::common_type_t<T, U>>,
328 // common_reference_t<
329 // std::add_lvalue_reference_t<const T>,
330 // std::add_lvalue_reference_t<const U>
331 // >
332 // >>
333 // >::value;
334  #endif
335 
339  template <class T>
340  _utlConcept Integral = std::is_integral<T>::value;
341 
345  template <class T>
346  _utlConcept SignedIntegral = Integral<T> && std::is_signed<T>::value;
347 
351  template <class T>
352  _utlConcept UnsignedIntegral = Integral<T> && !std::is_signed<T>::value;
353 
354 
355  template <typename T>
356  _utlConcept MoveAssignable = std::is_move_assignable<T>::value;
357 
358  template <typename T>
359  _utlConcept CopyAssignable = std::is_copy_assignable<T>::value;
360 
365  template<class LHS, class RHS>
367  #if CXX_CONCEPTS
368  std::is_lvalue_reference<LHS>::value &&
369 // CommonReference<
370 // const std::remove_reference_t<L>&,
371 // const std::remove_reference_t<R>&> &&
372  requires(LHS lhs, RHS&& rhs) {
373  lhs = std::forward<RHS>(rhs);
374  requires Same<
375  decltype(lhs = std::forward<RHS>(rhs)), LHS
376  >;
377  };
378  #else
379  std::is_assignable<LHS, RHS>::value;
380  #endif
381 
385  #if CXX_VER < CXX_VER_STD_17
387  namespace swappable_with_impl {
388  struct is_swappable_with_ {
389  // can apply std::swap
390  template<typename _Tp,
391  typename _Up,
392  typename
393  = decltype(std::swap(std::declval<_Tp&>(), std::declval<_Up&>())),
394  typename
395  = decltype(std::swap(std::declval<_Up&>(), std::declval<_Tp&>()))>
396  static meta::true_ check(int);
397  // can not apply std::swap
398  template<typename, typename> static meta::false_ check(...);
399  };
400  }
401  template <typename _Tp, typename _Up>
402  struct is_swappable_with
403  : swappable_with_impl::is_swappable_with_ {
404  using type = decltype(check<_Tp, _Up>(0));
405  };
406  #else
409  #endif
410 
411  // != std:: on CommonReference
412  template<class T, class U>
418 // std::CommonReference<
419 // const std::remove_reference_t<T>&,
420 // const std::remove_reference_t<U>&
421 // >;
422 
423  // != std:: we use is_swappable_with now is_swappable
424  template<class T>
427 
431  template <class T>
432  _utlConcept Destructible = std::is_nothrow_destructible<T>::value;
433 
437  template <class T, class... Args>
439  Destructible<T> && std::is_constructible<T, Args...>::value;
443  template <class T>
444  _utlConcept DefaultConstructible = Constructible<T>;
445 
451  template<class T>
453  Constructible<T, T> && ConvertibleTo<T, T>;
454 
458  template <class T>
460  MoveConstructible<T> &&
461  Constructible<T, _ref_t<T>> && ConvertibleTo<_ref_t<T>, T> &&
462  Constructible<T, const _ref_t<T>> && ConvertibleTo<const _ref_t<T>, T> &&
463  Constructible<T, const T> && ConvertibleTo<const T, T>;
464 
468  template <class T>
470  std::is_object<T>::value &&
471  MoveConstructible<T> &&
472  Assignable<_ref_t<T>, T> &&
473  Swappable<T>;
474 
475 
479  template <class T>
481  CopyConstructible<T> &&
482  Movable<T> &&
483  Assignable<_ref_t<T>, const _ref_t<T>>;
484 
485 
489  #if CXX_CONCEPTS
490  template <class B>
492  Movable<remove_cvref_t<B>> &&
493  requires(const std::remove_reference_t<B>& b1,
494  const std::remove_reference_t<B>& b2, const bool a) {
495  requires ConvertibleTo<const std::remove_reference_t<B>&, bool>;
496  !b1; requires ConvertibleTo<decltype(!b1), bool>;
497  b1 && a; requires Same<decltype(b1 && a), bool>;
498  b1 || a; requires Same<decltype(b1 || a), bool>;
499  b1 && b2; requires Same<decltype(b1 && b2), bool>;
500  a && b2; requires Same<decltype(a && b2), bool>;
501  b1 || b2; requires Same<decltype(b1 || b2), bool>;
502  a || b2; requires Same<decltype(a || b2), bool>;
503  b1 == b2; requires ConvertibleTo<decltype(b1 == b2), bool>;
504  b1 == a; requires ConvertibleTo<decltype(b1 == a), bool>;
505  a == b2; requires ConvertibleTo<decltype(a == b2), bool>;
506  b1 != b2; requires ConvertibleTo<decltype(b1 != b2), bool>;
507  b1 != a; requires ConvertibleTo<decltype(b1 != a), bool>;
508  a != b2; requires ConvertibleTo<decltype(a != b2), bool>;
509  };
510  #else
511  namespace details {
512 // template <typename B> using try_op_not_ = decltype(!std::declval<cref_<B>>());
513 // template <typename B> using try_op_eq_ = decltype(std::declval<cref_<B>>() == std::declval<cref_<B>>());
514 // template <typename B> using try_op_neq_ = decltype(std::declval<cref_<B>>() != std::declval<cref_<B>>());
515 // template <typename B> using try_op_and_ = decltype(std::declval<cref_<B>>() && std::declval<cref_<B>>());
516 // template <typename B> using try_op_or_ = decltype(std::declval<cref_<B>>() || std::declval<cref_<B>>());
517 //
518 // template <typename B>
519 // struct is_boolean__ {
520 // using type = meta::and_ <
521 // meta::is_detected<B, try_op_not_>,
522 // meta::is_detected<B, try_op_eq_>,
523 // meta::is_detected<B, try_op_neq_>,
524 // meta::is_detected<B, try_op_and_>,
525 // meta::is_detected<B, try_op_or_>
526 // >;
527 // };
528 
529  template <typename B, typename = void>
530  struct is_boolean_ {
532  };
533 
534  template <typename B>
535  struct is_boolean_ <B, meta::void_t<
536  meta::use_if_same_t<bool, decltype(!std::declval<cref_<B>>())>,
537  meta::use_if_same_t<bool, decltype(std::declval<cref_<B>>() == std::declval<cref_<B>>())>,
538  meta::use_if_same_t<bool, decltype(std::declval<cref_<B>>() != std::declval<cref_<B>>())>,
539  meta::use_if_same_t<bool, decltype(std::declval<cref_<B>>() && std::declval<cref_<B>>())>,
540  meta::use_if_same_t<bool, decltype(std::declval<cref_<B>>() || std::declval<cref_<B>>())>
541  >> {
542  using type = meta::true_;
543  };
544 
545  template <typename B>
546  using is_boolean_t = meta::eval <
548  >;
549  }
550  template <class B>
552  Movable<remove_cvref_t<B>> &&
553  //ConvertibleTo<const std::remove_reference_t<B>&, bool> &&
554  ConvertibleTo<const _ref_t<B>, bool> &&
555  Same<meta::true_, details::is_boolean_t<B>>;
556  #endif
557 
558 
559  namespace details {
560  template <typename T, typename U, typename = void>
563  };
564 
565  template <typename T, typename U>
567  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() == std::declval<cref_<U>>())>,
568  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() != std::declval<cref_<U>>())>,
569  meta::use_if_same_t<bool, decltype(std::declval<cref_<U>>() == std::declval<cref_<T>>())>,
570  meta::use_if_same_t<bool, decltype(std::declval<cref_<U>>() != std::declval<cref_<T>>())>
571  >> {
572  using type = meta::true_;
573  };
574 
575  template <typename T, typename U>
578  >;
579  }
580 
581  template <class T, class U>
583  #if CXX_CONCEPTS
584  requires(const std::remove_reference_t<T>& t,
585  const std::remove_reference_t<U>& u) {
586  t == u; requires Boolean<decltype(t == u)>;
587  t != u; requires Boolean<decltype(t != u)>;
588  u == t; requires Boolean<decltype(u == t)>;
589  u != t; requires Boolean<decltype(u != t)>;
590  };
591  #else
592  Same<meta::true_, details::is_weakly_equality_comparable_with_t<T, U>>;
593  #endif
594 
595  template <class T>
596  _utlConcept EqualityComparable = WeaklyEqualityComparableWith<T, T>;
597 
598  template <class T, class U>
600  EqualityComparable<T> &&
601  EqualityComparable<U> &&
602 // CommonReference<
603 // const std::remove_reference_t<T>&,
604 // const std::remove_reference_t<U>&> &&
605 // EqualityComparable<
606 // common_reference_t<
607 // const std::remove_reference_t<T>&,
608 // const std::remove_reference_t<U>&>> &&
609  WeaklyEqualityComparableWith<T, U>;
610 
611 
612 
613  #if CXX_CONCEPTS
614  template <class T>
616  EqualityComparable<T> &&
617  requires(const std::remove_reference_t<T>& a,
618  const std::remove_reference_t<T>& b) {
619  a < b; requires Boolean<decltype(a < b)>;
620  a > b; requires Boolean<decltype(a > b)>;
621  a <= b; requires Boolean<decltype(a <= b)>;
622  a >= b; requires Boolean<decltype(a >= b)>;
623  };
624  #else
625  namespace details {
626  template <typename T, typename = void>
629  };
630 
631  template <typename T>
633  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() < std::declval<cref_<T>>())>,
634  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() > std::declval<cref_<T>>())>,
635  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() <= std::declval<cref_<T>>())>,
636  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() >= std::declval<cref_<T>>())>
637  >> {
638  using type = meta::true_;
639  };
640 
641  template <typename T>
644  >;
645  }
646  template <class T>
648  EqualityComparable<T> &&
649  Same <meta::true_, details::is_strict_totally_ordered_t<T>>;
650  #endif
651 
652  #if CXX_CONCEPTS
653  template <class T, class U>
655  StrictTotallyOrdered<T> &&
656  StrictTotallyOrdered<U> &&
657 // CommonReference<
658 // const std::remove_reference_t<T>&,
659 // const std::remove_reference_t<U>&
660 // > &&
661 // StrictTotallyOrdered<
662 // common_reference_t<
663 // const std::remove_reference_t<T>&,
664 // const std::remove_reference_t<U>&
665 // >
666 // > &&
667  EqualityComparableWith<T, U> &&
668  requires(const std::remove_reference_t<T>& t,
669  const std::remove_reference_t<U>& u) {
670  t < u; requires Boolean<decltype(t < u)>;
671  t > u; requires Boolean<decltype(t > u)>;
672  t <= u; requires Boolean<decltype(t <= u)>;
673  t >= u; requires Boolean<decltype(t >= u)>;
674  u < t; requires Boolean<decltype(u < t)>;
675  u > t; requires Boolean<decltype(u > t)>;
676  u <= t; requires Boolean<decltype(u <= t)>;
677  u >= t; requires Boolean<decltype(u >= t)>;
678  };
679  #else
680  namespace details {
681  template <typename T, typename U, typename = void>
684  };
685 
686  template <typename T, typename U>
688  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() < std::declval<cref_<U>>())>,
689  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() > std::declval<cref_<U>>())>,
690  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() <= std::declval<cref_<U>>())>,
691  meta::use_if_same_t<bool, decltype(std::declval<cref_<T>>() >= std::declval<cref_<U>>())>,
692  meta::use_if_same_t<bool, decltype(std::declval<cref_<U>>() < std::declval<cref_<T>>())>,
693  meta::use_if_same_t<bool, decltype(std::declval<cref_<U>>() > std::declval<cref_<T>>())>,
694  meta::use_if_same_t<bool, decltype(std::declval<cref_<U>>() <= std::declval<cref_<T>>())>,
695  meta::use_if_same_t<bool, decltype(std::declval<cref_<U>>() >= std::declval<cref_<T>>())>
696  >> {
697  using type = meta::true_;
698  };
699 
700  template <typename T, typename U>
703  >;
704  }
705  template <class T, class U>
707  StrictTotallyOrdered<T> &&
708  StrictTotallyOrdered<U> &&
709  EqualityComparableWith<T, U> &&
710  Same <meta::true_, details::is_strict_totally_ordered_with_t<T, U>>;
711  #endif
712 
716  template <class T>
717  _utlConcept Semiregular = Copyable<T> && DefaultConstructible<T>;
718 
722  template <class T>
723  _utlConcept Regular = Semiregular<T> && EqualityComparable<T>;
724 
728  template<class T>
730  std::is_scalar<T>::value && Regular<T>;
731 
735  template<class T>
737  std::is_arithmetic<T>::value && Scalar<T> && StrictTotallyOrdered<T>;
738 
742  template<class T>
744  std::is_floating_point<T>::value && Arithmetic<T>;
745 
749  template <class F, class... Args>
750  _utlConcept Invocable = is_invocable<F, Args...>::value;
751 // requires(F&& f, Args&&... args) {
752 // invoke(std::forward<F>(f), std::forward<Args>(args)...);
753 // };
754 
755  template< class F, class... Args >
757 
758  template < class F, class... Args >
760  RegularInvocable<F, Args...> &&
761  Boolean<invoke_result_t<F, Args...>>;
762 
763  template <class R, class T, class U>
765  Predicate<R, T, T> && Predicate<R, U, U> &&
766  Predicate<R, T, U> && Predicate<R, U, T>;
767 
768  template < class R, class T, class U >
769  _utlConcept StrictWeakOrder = Relation<R, T, U>;
770 }
772 
773 
774 
775 
776 #endif /* __utl_concepts_stl_h__ */
_utlConcept Semiregular
Definition: stl.h:717
_utlConcept Swappable
Definition: stl.h:425
std::is_swappable is_swappable
Definition: stl.h:407
_utlConcept SwappableWith
Definition: stl.h:413
Include all meta library.
_utlConcept WeaklyEqualityComparableWith
Definition: stl.h:582
_utlConcept Common
Definition: stl.h:301
#define _utlConcept
utl concept keyword syntax wrapper
Definition: defines.h:56
_utlConcept Copyable
Definition: stl.h:480
void void_t
void_t type alias
Definition: detection.h:55
_utlConcept StrictWeakOrder
Definition: stl.h:769
_utlConcept FloatingPoint
Definition: stl.h:743
decltype(false ? std::declval< T(&)()>()() :std::declval< U(&)()>()()) __cond_res
Definition: stl.h:99
meta::eval< __common_ref_< T, U > > __common_ref
Definition: stl.h:133
bool_< true > true_
The type used as a compile-time boolean with true value.
Definition: integral.h:68
const std::remove_reference_t< T > & cref_
Definition: stl.h:45
_utlConcept StrictTotallyOrdered
Definition: stl.h:647
_utlConcept Assignable
Definition: stl.h:366
_utlConcept Scalar
Definition: stl.h:729
_utlConcept ConvertibleTo
Definition: stl.h:87
std::add_lvalue_reference_t< const std::remove_reference_t< T > > __cref
Definition: stl.h:123
_utlConcept CopyAssignable
Definition: stl.h:359
std::add_rvalue_reference_t< meta::invoke< __xref< T >, U > > apply
Definition: stl.h:201
std::enable_if< If, _Tp > enable_if
enable_if, imported from stl
Definition: sfinae.h:60
meta::eval< meta::enable_if< meta::same_< _T1, _T2 >::value, _Ret > > use_if_same_t
Definition: stl.h:55
apply_impl::apply_< Fn, Seq > apply
Definition: typelist.h:197
_utlConcept Destructible
Definition: stl.h:432
_utlConcept Invocable
Definition: stl.h:750
meta::eval< is_strict_totally_ordered_< T > > is_strict_totally_ordered_t
Definition: stl.h:644
_utlConcept Same
Definition: stl.h:62
meta::false_ type
Definition: stl.h:531
meta::eval< common_reference< Ts... > > common_reference_t
Definition: stl.h:286
_utlConcept CommonReference
Definition: stl.h:293
bool_< false > false_
The type used as a compile-time boolean with false value.
Definition: integral.h:69
typename Tp::type eval
Type alias for Tp::type. Used to evaluate/extract return type of metafunctions.
Definition: integral.h:49
invoke() and invoke traits implementation
Concepts defines.
_utlConcept DerivedFrom
Definition: stl.h:71
_utlConcept EqualityComparableWith
Definition: stl.h:599
__cond_res< __copy_cv< T, U > &, __copy_cv< U, T > &> __lref_res
Definition: stl.h:140
std::add_lvalue_reference_t< meta::invoke< __xref< T >, U > > apply
Definition: stl.h:196
STL&#39;s core language concepts.
Definition: _1wire.h:30
_utlConcept Predicate
Definition: stl.h:759
_utlConcept MoveAssignable
Definition: stl.h:356
_utlConcept RegularInvocable
Definition: stl.h:756
_utlConcept DefaultConstructible
Definition: stl.h:444
_utlConcept CopyConstructible
Definition: stl.h:459
std::remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
Definition: stl.h:42
meta::eval< is_boolean_< B > > is_boolean_t
Definition: stl.h:548
_utlConcept EqualityComparable
Definition: stl.h:596
_utlConcept Integral
Definition: stl.h:340
_utlConcept StrictTotallyOrderedWith
Definition: stl.h:706
meta::eval< invoke_result< _Callable, _Args... > > invoke_result_t
invoke_result_t (for C++14)
Definition: invoke.h:180
_utlConcept MoveConstructible
Definition: stl.h:452
std::add_lvalue_reference_t< T > _ref_t
Definition: stl.h:48
_utlConcept Movable
Definition: stl.h:469
_utlConcept UnsignedIntegral
Definition: stl.h:352
std::remove_reference_t< R > && __rref_res
Definition: stl.h:144
meta::eval< common_reference< Ts... > > common_reference_t
Definition: stl.h:227
_utlConcept Boolean
Definition: stl.h:551
meta::invoke< __copy_cv_< From >, To > __copy_cv
Definition: stl.h:119
_utlConcept Regular
Definition: stl.h:723
_utlConcept Constructible
Definition: stl.h:438
meta::eval< is_weakly_equality_comparable_with_< T, U > > is_weakly_equality_comparable_with_t
Definition: stl.h:578
typename Fn::template apply< Args... > invoke
Definition: invoke.h:81
meta::eval< is_strict_totally_ordered_with_< T, U > > is_strict_totally_ordered_with_t
Definition: stl.h:703
void swap(array< _Tp, _Nm > &lhs, array< _Tp, _Nm > &rhs) noexcept(noexcept(lhs.swap(rhs)))
Definition: array.h:214
meta::eval< basic_common_reference< remove_cvref_t< T >, remove_cvref_t< U >, __xref< T >::template apply, __xref< U >::template apply > > __basic_common_reference_t
Definition: stl.h:219
_utlConcept Relation
Definition: stl.h:764
_utlConcept Arithmetic
Definition: stl.h:736
eval< detail::when_< If > > when
Well formed only if If is true.
Definition: sfinae.h:46
_utlConcept SignedIntegral
Definition: stl.h:346
Implementation detail main forward header.
std::is_invocable trait for C++11
Definition: invoke.h:130
std::is_swappable_with is_swappable_with
Definition: stl.h:408