diff --git a/headers/meta.hpp/meta_utilities.hpp b/headers/meta.hpp/meta_utilities.hpp index 33610c8..2d585dc 100644 --- a/headers/meta.hpp/meta_utilities.hpp +++ b/headers/meta.hpp/meta_utilities.hpp @@ -9,6 +9,31 @@ #include "meta_base.hpp" #include "meta_types.hpp" +namespace meta_hpp::detail +{ + template < typename From > + struct cvref_traits { + static constexpr bool is_lvalue = std::is_lvalue_reference_v; + static constexpr bool is_rvalue = std::is_rvalue_reference_v; + static constexpr bool is_const = std::is_const_v>; + static constexpr bool is_volatile = std::is_volatile_v>; + + template < bool yesno, template < typename > typename Q, typename V > + using apply_t_if = std::conditional_t, V>; + + template < typename To > + using copy_to = + apply_t_if>>>>; + }; + + template < typename From, typename To > + using copy_cvref_t = typename cvref_traits::template copy_to; +} + namespace meta_hpp::detail { template < typename T > diff --git a/untests/meta_utilities/detail_tests.cpp b/untests/meta_utilities/detail_tests.cpp new file mode 100644 index 0000000..2669d0d --- /dev/null +++ b/untests/meta_utilities/detail_tests.cpp @@ -0,0 +1,84 @@ +/******************************************************************************* + * This file is part of the "https://github.com/blackmatov/meta.hpp" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2021, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include "../meta_tests.hpp" + +TEST_CASE("features/meta_utilities/detail") { + namespace meta = meta_hpp; + + SUBCASE("cvref_traits") { + static_assert(!meta::detail::cvref_traits::is_lvalue); + static_assert(!meta::detail::cvref_traits::is_rvalue); + static_assert(!meta::detail::cvref_traits::is_const); + static_assert(!meta::detail::cvref_traits::is_volatile); + + static_assert(!meta::detail::cvref_traits::is_lvalue); + static_assert(!meta::detail::cvref_traits::is_rvalue); + static_assert(meta::detail::cvref_traits::is_const); + static_assert(!meta::detail::cvref_traits::is_volatile); + + static_assert(!meta::detail::cvref_traits::is_lvalue); + static_assert(!meta::detail::cvref_traits::is_rvalue); + static_assert(meta::detail::cvref_traits::is_const); + static_assert(meta::detail::cvref_traits::is_volatile); + + static_assert(meta::detail::cvref_traits::is_lvalue); + static_assert(!meta::detail::cvref_traits::is_rvalue); + static_assert(!meta::detail::cvref_traits::is_const); + static_assert(!meta::detail::cvref_traits::is_volatile); + + static_assert(meta::detail::cvref_traits::is_lvalue); + static_assert(!meta::detail::cvref_traits::is_rvalue); + static_assert(meta::detail::cvref_traits::is_const); + static_assert(!meta::detail::cvref_traits::is_volatile); + + static_assert(meta::detail::cvref_traits::is_lvalue); + static_assert(!meta::detail::cvref_traits::is_rvalue); + static_assert(meta::detail::cvref_traits::is_const); + static_assert(meta::detail::cvref_traits::is_volatile); + + static_assert(!meta::detail::cvref_traits::is_lvalue); + static_assert(meta::detail::cvref_traits::is_rvalue); + static_assert(!meta::detail::cvref_traits::is_const); + static_assert(!meta::detail::cvref_traits::is_volatile); + + static_assert(!meta::detail::cvref_traits::is_lvalue); + static_assert(meta::detail::cvref_traits::is_rvalue); + static_assert(meta::detail::cvref_traits::is_const); + static_assert(!meta::detail::cvref_traits::is_volatile); + + static_assert(!meta::detail::cvref_traits::is_lvalue); + static_assert(meta::detail::cvref_traits::is_rvalue); + static_assert(meta::detail::cvref_traits::is_const); + static_assert(meta::detail::cvref_traits::is_volatile); + } + + SUBCASE("cvref_traits::copy_to") { + static_assert(std::same_as::copy_to, int>); + static_assert(std::same_as::copy_to, const int>); + static_assert(std::same_as::copy_to, const volatile int>); + static_assert(std::same_as::copy_to, int&>); + static_assert(std::same_as::copy_to, const int&>); + static_assert(std::same_as::copy_to, volatile int&>); + static_assert(std::same_as::copy_to, const volatile int&&>); + + static_assert(std::same_as::copy_to, int>); + static_assert(std::same_as::copy_to, const int>); + static_assert(std::same_as::copy_to, const volatile int>); + static_assert(std::same_as::copy_to, int&>); + static_assert(std::same_as::copy_to, const int&>); + static_assert(std::same_as::copy_to, volatile int&>); + static_assert(std::same_as::copy_to, const volatile int&&>); + + static_assert(std::same_as::copy_to, int>); + static_assert(std::same_as::copy_to, const int>); + static_assert(std::same_as::copy_to, const volatile int>); + static_assert(std::same_as::copy_to, int&>); + static_assert(std::same_as::copy_to, const int&>); + static_assert(std::same_as::copy_to, volatile int&>); + static_assert(std::same_as::copy_to, const volatile int&&>); + } +}