Open GuillaumeDua opened 6 months ago
As currently in csl::ag:
namespace csl::mp { // P1450 Enriching type modification traits : https://github.com/cplusplus/papers/issues/216 // Note that this is a good-enough implementation of P1450 to only fit this project's needs // P1450 copy_ref template <typename from, typename to> struct copy_ref : std::remove_reference<to>{}; template <typename from, typename to> struct copy_ref<from&, to> : std::add_lvalue_reference<to>{}; template <typename from, typename to> struct copy_ref<from&&, to> : std::add_rvalue_reference<std::remove_reference_t<to>>{}; template <typename from, typename to> using copy_ref_t = typename copy_ref<from, to>::type; // P1450 - add cv - impl detail (also for ref-qualified types) template <typename T> struct add_const : std::type_identity<const T>{}; template <typename T> struct add_const<T&> : std::type_identity<const T&>{}; template <typename T> struct add_const<T&&> : std::type_identity<const T&&>{}; template <typename T> using add_const_t = typename add_const<T>::type; template <typename T> struct add_volatile : std::type_identity<volatile T>{}; template <typename T> struct add_volatile<T&> : std::type_identity<volatile T&>{}; template <typename T> struct add_volatile<T&&> : std::type_identity<volatile T&&>{}; template <typename T> using add_volatile_t = typename add_volatile<T>::type; template <typename T> struct add_cv : add_const<typename add_volatile<T>::type>{}; template <typename T> using add_cv_t = typename add_cv<T>::type; // P1450 copy_cv template <typename from, typename to> struct copy_cv : std::remove_cv<to>{}; template <typename from, typename to> requires (std::is_reference_v<from>) struct copy_cv<from, to> : copy_cv<std::remove_reference_t<from>, to>{}; template <typename from, typename to> struct copy_cv<const volatile from, to> : add_cv<to>{}; template <typename from, typename to> struct copy_cv<const from, to> : add_const<to>{}; template <typename from, typename to> struct copy_cv<volatile from, to> : add_volatile<to>{}; template <typename from, typename to> using copy_cv_t = typename copy_cv<from, to>::type; // P1450 copy_cvref template <typename from, typename to> struct copy_cvref : copy_cv<from, copy_ref_t<from, to>>{}; template <typename from, typename to> using copy_cvref_t = typename copy_cvref<from, to>::type; }
C++17 version:
namespace csl::mp { template <typename T> struct type_identity{ using type = T; }; template <typename T> struct remove_cvref { using type = std::remove_cv_t<std::remove_reference_t<T>>; }; template <typename T> using remove_cvref_t = typename remove_cvref<T>::type; // P1450 Enriching type modification traits : https://github.com/cplusplus/papers/issues/216 // Note that this is a good-enough implementation of P1450 to only fit this project's needs // P1450 copy_ref template <typename from, typename to> struct copy_ref : std::remove_reference<to>{}; template <typename from, typename to> struct copy_ref<from&, to> : std::add_lvalue_reference<to>{}; template <typename from, typename to> struct copy_ref<from&&, to> : std::add_rvalue_reference<std::remove_reference_t<to>>{}; template <typename from, typename to> using copy_ref_t = typename copy_ref<from, to>::type; // P1450 - add cv - impl detail (also for ref-qualified types) template <typename T> struct add_const : type_identity<const T>{}; template <typename T> struct add_const<T&> : type_identity<const T&>{}; template <typename T> struct add_const<T&&> : type_identity<const T&&>{}; template <typename T> using add_const_t = typename add_const<T>::type; template <typename T> struct add_volatile : type_identity<volatile T>{}; template <typename T> struct add_volatile<T&> : type_identity<volatile T&>{}; template <typename T> struct add_volatile<T&&> : type_identity<volatile T&&>{}; template <typename T> using add_volatile_t = typename add_volatile<T>::type; template <typename T> struct add_cv : add_const<typename add_volatile<T>::type>{}; template <typename T> using add_cv_t = typename add_cv<T>::type; // P1450 copy_cv template <typename from, typename to, typename = void> struct copy_cv : std::remove_cv<to>{}; template <typename from, typename to> struct copy_cv<from, to, std::enable_if_t<std::is_reference_v<from>>> : copy_cv<std::remove_reference_t<from>, to>{}; template <typename from, typename to> struct copy_cv<const volatile from, to> : add_cv<to>{}; template <typename from, typename to> struct copy_cv<const from, to> : add_const<to>{}; template <typename from, typename to> struct copy_cv<volatile from, to> : add_volatile<to>{}; template <typename from, typename to> using copy_cv_t = typename copy_cv<from, to>::type; // P1450 copy_cvref template <typename from, typename to> struct copy_cvref : copy_cv<from, copy_ref_t<from, to>>{}; template <typename from, typename to> using copy_cvref_t = typename copy_cvref<from, to>::type; }
As currently in csl::ag:
C++17 version: