using uresult as uvalue for invoke

This commit is contained in:
BlackMATov
2023-02-19 03:32:40 +07:00
parent 704aef878d
commit bace3a2d88
12 changed files with 212 additions and 160 deletions

View File

@@ -1444,6 +1444,19 @@ namespace meta_hpp
class uinst_base;
class uinst;
}
namespace detail
{
template < typename T >
concept uvalue_family //
= std::is_same_v<T, uarg_base> //
|| std::is_same_v<T, uarg> //
|| std::is_same_v<T, uinst_base> //
|| std::is_same_v<T, uinst> //
|| std::is_same_v<T, uerror> //
|| std::is_same_v<T, uresult> //
|| std::is_same_v<T, uvalue>; //
}
}
namespace meta_hpp
@@ -1480,6 +1493,21 @@ namespace meta_hpp
using scope_state_ptr = intrusive_ptr<scope_state>;
using variable_state_ptr = intrusive_ptr<variable_state>;
}
namespace detail
{
template < typename T >
concept state_family //
= std::is_same_v<T, argument> //
|| std::is_same_v<T, constructor> //
|| std::is_same_v<T, destructor> //
|| std::is_same_v<T, evalue> //
|| std::is_same_v<T, function> //
|| std::is_same_v<T, member> //
|| std::is_same_v<T, method> //
|| std::is_same_v<T, scope> //
|| std::is_same_v<T, variable>; //
}
}
namespace meta_hpp
@@ -1516,6 +1544,26 @@ namespace meta_hpp
struct reference_type_data;
struct void_type_data;
}
namespace detail
{
template < typename T >
concept type_family //
= std::is_same_v<T, any_type> //
|| std::is_same_v<T, array_type> //
|| std::is_same_v<T, class_type> //
|| std::is_same_v<T, constructor_type> //
|| std::is_same_v<T, destructor_type> //
|| std::is_same_v<T, enum_type> //
|| std::is_same_v<T, function_type> //
|| std::is_same_v<T, member_type> //
|| std::is_same_v<T, method_type> //
|| std::is_same_v<T, nullptr_type> //
|| std::is_same_v<T, number_type> //
|| std::is_same_v<T, pointer_type> //
|| std::is_same_v<T, reference_type> //
|| std::is_same_v<T, void_type>; //
}
}
namespace meta_hpp
@@ -1529,6 +1577,21 @@ namespace meta_hpp
class method_index;
class scope_index;
class variable_index;
namespace detail
{
template < typename T >
concept index_family //
= std::is_same_v<T, argument_index> //
|| std::is_same_v<T, constructor_index> //
|| std::is_same_v<T, destructor_index> //
|| std::is_same_v<T, evalue_index> //
|| std::is_same_v<T, function_index> //
|| std::is_same_v<T, member_index> //
|| std::is_same_v<T, method_index> //
|| std::is_same_v<T, scope_index> //
|| std::is_same_v<T, variable_index>; //
}
}
namespace meta_hpp
@@ -2061,23 +2124,6 @@ namespace meta_hpp::detail
namespace meta_hpp::detail
{
template < typename T >
concept type_family //
= std::is_same_v<T, any_type> //
|| std::is_same_v<T, array_type> //
|| std::is_same_v<T, class_type> //
|| std::is_same_v<T, constructor_type> //
|| std::is_same_v<T, destructor_type> //
|| std::is_same_v<T, enum_type> //
|| std::is_same_v<T, function_type> //
|| std::is_same_v<T, member_type> //
|| std::is_same_v<T, method_type> //
|| std::is_same_v<T, nullptr_type> //
|| std::is_same_v<T, number_type> //
|| std::is_same_v<T, pointer_type> //
|| std::is_same_v<T, reference_type> //
|| std::is_same_v<T, void_type>; //
template <type_family Type>
struct type_traits;
@@ -2666,21 +2712,6 @@ namespace meta_hpp::detail
};
}
namespace meta_hpp::detail
{
template < typename T >
concept index_family //
= std::is_same_v<T, argument_index> //
|| std::is_same_v<T, constructor_index> //
|| std::is_same_v<T, destructor_index> //
|| std::is_same_v<T, evalue_index> //
|| std::is_same_v<T, function_index> //
|| std::is_same_v<T, member_index> //
|| std::is_same_v<T, method_index> //
|| std::is_same_v<T, scope_index> //
|| std::is_same_v<T, variable_index>; //
}
namespace meta_hpp
{
class argument_index final {
@@ -2874,7 +2905,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uvalue> && //
!detail::uvalue_family<Tp> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uvalue(T&& val);
@@ -2883,7 +2914,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uvalue> && //
!detail::uvalue_family<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uvalue& operator=(T&& val);
@@ -3095,9 +3126,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uerror> && //
!std::is_same_v<Tp, uvalue> && //
!std::is_same_v<Tp, uresult> && //
!detail::uvalue_family<Tp> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uresult(T&& val);
@@ -3106,9 +3135,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uerror> && //
!std::is_same_v<Tp, uvalue> && //
!std::is_same_v<Tp, uresult> && //
!detail::uvalue_family<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uresult& operator=(T&& val);
@@ -3176,18 +3203,6 @@ namespace meta_hpp
namespace meta_hpp::detail
{
template < typename T >
concept state_family //
= std::is_same_v<T, argument> //
|| std::is_same_v<T, constructor> //
|| std::is_same_v<T, destructor> //
|| std::is_same_v<T, evalue> //
|| std::is_same_v<T, function> //
|| std::is_same_v<T, member> //
|| std::is_same_v<T, method> //
|| std::is_same_v<T, scope> //
|| std::is_same_v<T, variable>; //
template < state_family State >
struct state_traits;
@@ -5343,28 +5358,16 @@ namespace meta_hpp
bool is_invocable_with(Method, Instance&& instance, Args&&... args);
}
namespace meta_hpp::detail
{
template < typename T >
concept any_uvalue_kind //
= std::is_same_v<T, uarg_base> //
|| std::is_same_v<T, uarg> //
|| std::is_same_v<T, uinst_base> //
|| std::is_same_v<T, uinst> //
|| std::is_same_v<T, uresult> //
|| std::is_same_v<T, uvalue>; //
}
namespace meta_hpp::detail
{
template < typename T, typename Tp = std::decay_t<T> >
concept arg_lvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
concept arg_lvalue_ref_kind //
= (!uvalue_family<Tp>) //
&& (std::is_lvalue_reference_v<T>);
template < typename T, typename Tp = std::decay_t<T> >
concept arg_rvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
concept arg_rvalue_ref_kind //
= (!uvalue_family<Tp>) //
&& (!std::is_reference_v<T> || std::is_rvalue_reference_v<T>);
}
@@ -5377,13 +5380,13 @@ namespace meta_hpp::detail
template < typename T, typename Tp = std::decay_t<T> >
concept inst_class_lvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
= (!uvalue_family<Tp>) //
&& (std::is_lvalue_reference_v<T>) //
&& (std::is_class_v<std::remove_pointer_t<std::remove_reference_t<T>>>);
template < typename T, typename Tp = std::decay_t<T> >
concept inst_class_rvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
= (!uvalue_family<Tp>) //
&& (!std::is_reference_v<T> || std::is_rvalue_reference_v<T>) //
&& (std::is_class_v<std::remove_pointer_t<std::remove_reference_t<T>>>);
}
@@ -5552,7 +5555,7 @@ namespace meta_hpp::detail
uarg_base& operator=(const uarg_base&) = delete;
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires(!uvalue_family<Tp>)
explicit uarg_base(type_registry& registry, T&&)
: uarg_base{registry, type_list<T&&>{}} {}
@@ -5582,6 +5585,11 @@ namespace meta_hpp::detail
: ref_type_{ref_types::const_rvalue}
, raw_type_{v.get_type()} {}
template < typename T, typename Tp = std::decay_t<T> >
requires std::is_same_v<Tp, uresult>
explicit uarg_base(type_registry& registry, T&& v)
: uarg_base{registry, *std::forward<T>(v)} {}
[[nodiscard]] bool is_ref_const() const noexcept {
return ref_type_ == ref_types::const_lvalue //
|| ref_type_ == ref_types::const_rvalue;
@@ -5629,7 +5637,13 @@ namespace meta_hpp::detail
, data_{const_cast<void*>(v.get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires std::is_same_v<Tp, uresult>
explicit uarg(type_registry& registry, T&& v)
: uarg_base{registry, std::forward<T>(v)}
, data_{const_cast<void*>(v->get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!uvalue_family<Tp>)
explicit uarg(type_registry& registry, T&& v)
: uarg_base{registry, std::forward<T>(v)}
, data_{const_cast<std::remove_cvref_t<T>*>(std::addressof(v))} {} // NOLINT(*-const-cast)
@@ -6115,7 +6129,7 @@ namespace meta_hpp::detail
uinst_base& operator=(const uinst_base&) = delete;
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires(!uvalue_family<Tp>)
explicit uinst_base(type_registry& registry, T&&)
: uinst_base{registry, type_list<T&&>{}} {}
@@ -6145,6 +6159,11 @@ namespace meta_hpp::detail
: ref_type_{ref_types::const_rvalue}
, raw_type_{v.get_type()} {}
template < typename T, typename Tp = std::decay_t<T> >
requires std::is_same_v<Tp, uresult>
explicit uinst_base(type_registry& registry, T&& v)
: uinst_base{registry, *std::forward<T>(v)} {}
[[nodiscard]] bool is_inst_const() const noexcept {
if ( raw_type_.is_pointer() ) {
const pointer_type& from_type_ptr = raw_type_.as_pointer();
@@ -6192,7 +6211,13 @@ namespace meta_hpp::detail
, data_{const_cast<void*>(v.get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires std::is_same_v<Tp, uresult>
explicit uinst(type_registry& registry, T&& v)
: uinst_base{registry, std::forward<T>(v)}
, data_{const_cast<void*>(v->get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!uvalue_family<Tp>)
explicit uinst(type_registry& registry, T&& v)
: uinst_base{registry, std::forward<T>(v)}
, data_{const_cast<std::remove_cvref_t<T>*>(std::addressof(v))} {} // NOLINT(*-const-cast)

View File

@@ -35,15 +35,19 @@ TEST_CASE("meta/meta_utilities/invoke") {
{
CHECK(meta::invoke(&clazz::function, 3).as<int>() == 3);
CHECK(meta::invoke(&clazz::function, meta::uvalue{3}).as<int>() == 3);
CHECK(meta::invoke(&clazz::function, meta::uresult{3}).as<int>() == 3);
CHECK(meta::invoke(clazz_function, 3).as<int>() == 3);
CHECK(meta::invoke(clazz_function, meta::uvalue{3}).as<int>() == 3);
CHECK(meta::invoke(clazz_function, meta::uresult{3}).as<int>() == 3);
CHECK(meta::is_invocable_with(clazz_function, 3));
CHECK(meta::is_invocable_with(clazz_function, meta::uvalue{3}));
CHECK(meta::is_invocable_with(clazz_function, meta::uresult{3}));
CHECK(meta::is_invocable_with<int>(clazz_function));
CHECK(meta::is_invocable_with(&clazz::function, 3));
CHECK(meta::is_invocable_with(&clazz::function, meta::uvalue{3}));
CHECK(meta::is_invocable_with(&clazz::function, meta::uresult{3}));
CHECK(meta::is_invocable_with<int>(&clazz::function));
}
@@ -52,15 +56,19 @@ TEST_CASE("meta/meta_utilities/invoke") {
CHECK(meta::invoke(&clazz::member, cl).as<int>() == 1);
CHECK(meta::invoke(&clazz::member, meta::uvalue{cl}).as<int>() == 1);
CHECK(meta::invoke(&clazz::member, meta::uresult{cl}).as<int>() == 1);
CHECK(meta::invoke(clazz_member, cl).as<int>() == 1);
CHECK(meta::invoke(clazz_member, meta::uvalue{cl}).as<int>() == 1);
CHECK(meta::invoke(clazz_member, meta::uresult{cl}).as<int>() == 1);
CHECK(meta::is_invocable_with(clazz_member, cl));
CHECK(meta::is_invocable_with(clazz_member, meta::uvalue{cl}));
CHECK(meta::is_invocable_with(clazz_member, meta::uresult{cl}));
CHECK(meta::is_invocable_with<const clazz&>(clazz_member));
CHECK(meta::is_invocable_with(&clazz::member, cl));
CHECK(meta::is_invocable_with(&clazz::member, meta::uvalue{cl}));
CHECK(meta::is_invocable_with(&clazz::member, meta::uresult{cl}));
CHECK(meta::is_invocable_with<const clazz&>(&clazz::member));
}
@@ -69,15 +77,19 @@ TEST_CASE("meta/meta_utilities/invoke") {
CHECK(meta::invoke(&clazz::method, cl, 2).as<int>() == 2);
CHECK(meta::invoke(&clazz::method, meta::uvalue{cl}, meta::uvalue{2}).as<int>() == 2);
CHECK(meta::invoke(&clazz::method, meta::uresult{cl}, meta::uresult{2}).as<int>() == 2);
CHECK(meta::invoke(clazz_method, cl, 2).as<int>() == 2);
CHECK(meta::invoke(clazz_method, meta::uvalue{cl}, meta::uvalue{2}).as<int>() == 2);
CHECK(meta::invoke(clazz_method, meta::uresult{cl}, meta::uresult{2}).as<int>() == 2);
CHECK(meta::is_invocable_with(clazz_method, cl, 2));
CHECK(meta::is_invocable_with(clazz_method, meta::uvalue{cl}, meta::uvalue{2}));
CHECK(meta::is_invocable_with(clazz_method, meta::uresult{cl}, meta::uresult{2}));
CHECK(meta::is_invocable_with<const clazz&, int>(clazz_method));
CHECK(meta::is_invocable_with(&clazz::method, cl, 2));
CHECK(meta::is_invocable_with(&clazz::method, meta::uvalue{cl}, meta::uvalue{2}));
CHECK(meta::is_invocable_with(&clazz::method, meta::uresult{cl}, meta::uresult{2}));
CHECK(meta::is_invocable_with<const clazz&, int>(&clazz::method));
}
}

View File

@@ -61,6 +61,19 @@ namespace meta_hpp
class uinst_base;
class uinst;
}
namespace detail
{
template < typename T >
concept uvalue_family //
= std::is_same_v<T, uarg_base> //
|| std::is_same_v<T, uarg> //
|| std::is_same_v<T, uinst_base> //
|| std::is_same_v<T, uinst> //
|| std::is_same_v<T, uerror> //
|| std::is_same_v<T, uresult> //
|| std::is_same_v<T, uvalue>; //
}
}
namespace meta_hpp
@@ -97,6 +110,21 @@ namespace meta_hpp
using scope_state_ptr = intrusive_ptr<scope_state>;
using variable_state_ptr = intrusive_ptr<variable_state>;
}
namespace detail
{
template < typename T >
concept state_family //
= std::is_same_v<T, argument> //
|| std::is_same_v<T, constructor> //
|| std::is_same_v<T, destructor> //
|| std::is_same_v<T, evalue> //
|| std::is_same_v<T, function> //
|| std::is_same_v<T, member> //
|| std::is_same_v<T, method> //
|| std::is_same_v<T, scope> //
|| std::is_same_v<T, variable>; //
}
}
namespace meta_hpp
@@ -133,6 +161,26 @@ namespace meta_hpp
struct reference_type_data;
struct void_type_data;
}
namespace detail
{
template < typename T >
concept type_family //
= std::is_same_v<T, any_type> //
|| std::is_same_v<T, array_type> //
|| std::is_same_v<T, class_type> //
|| std::is_same_v<T, constructor_type> //
|| std::is_same_v<T, destructor_type> //
|| std::is_same_v<T, enum_type> //
|| std::is_same_v<T, function_type> //
|| std::is_same_v<T, member_type> //
|| std::is_same_v<T, method_type> //
|| std::is_same_v<T, nullptr_type> //
|| std::is_same_v<T, number_type> //
|| std::is_same_v<T, pointer_type> //
|| std::is_same_v<T, reference_type> //
|| std::is_same_v<T, void_type>; //
}
}
namespace meta_hpp
@@ -146,6 +194,21 @@ namespace meta_hpp
class method_index;
class scope_index;
class variable_index;
namespace detail
{
template < typename T >
concept index_family //
= std::is_same_v<T, argument_index> //
|| std::is_same_v<T, constructor_index> //
|| std::is_same_v<T, destructor_index> //
|| std::is_same_v<T, evalue_index> //
|| std::is_same_v<T, function_index> //
|| std::is_same_v<T, member_index> //
|| std::is_same_v<T, method_index> //
|| std::is_same_v<T, scope_index> //
|| std::is_same_v<T, variable_index>; //
}
}
namespace meta_hpp

View File

@@ -1,24 +0,0 @@
/*******************************************************************************
* 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-2023, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
#include "../meta_base.hpp"
namespace meta_hpp::detail
{
template < typename T >
concept index_family //
= std::is_same_v<T, argument_index> //
|| std::is_same_v<T, constructor_index> //
|| std::is_same_v<T, destructor_index> //
|| std::is_same_v<T, evalue_index> //
|| std::is_same_v<T, function_index> //
|| std::is_same_v<T, member_index> //
|| std::is_same_v<T, method_index> //
|| std::is_same_v<T, scope_index> //
|| std::is_same_v<T, variable_index>; //
}

View File

@@ -10,18 +10,6 @@
namespace meta_hpp::detail
{
template < typename T >
concept state_family //
= std::is_same_v<T, argument> //
|| std::is_same_v<T, constructor> //
|| std::is_same_v<T, destructor> //
|| std::is_same_v<T, evalue> //
|| std::is_same_v<T, function> //
|| std::is_same_v<T, member> //
|| std::is_same_v<T, method> //
|| std::is_same_v<T, scope> //
|| std::is_same_v<T, variable>; //
template < state_family State >
struct state_traits;

View File

@@ -22,23 +22,6 @@
namespace meta_hpp::detail
{
template < typename T >
concept type_family //
= std::is_same_v<T, any_type> //
|| std::is_same_v<T, array_type> //
|| std::is_same_v<T, class_type> //
|| std::is_same_v<T, constructor_type> //
|| std::is_same_v<T, destructor_type> //
|| std::is_same_v<T, enum_type> //
|| std::is_same_v<T, function_type> //
|| std::is_same_v<T, member_type> //
|| std::is_same_v<T, method_type> //
|| std::is_same_v<T, nullptr_type> //
|| std::is_same_v<T, number_type> //
|| std::is_same_v<T, pointer_type> //
|| std::is_same_v<T, reference_type> //
|| std::is_same_v<T, void_type>; //
template <type_family Type>
struct type_traits;

View File

@@ -8,6 +8,7 @@
#include "../../meta_base.hpp"
#include "../../meta_registry.hpp"
#include "../../meta_uresult.hpp"
#include "../../meta_uvalue.hpp"
#include "utraits.hpp"
@@ -34,7 +35,7 @@ namespace meta_hpp::detail
uarg_base& operator=(const uarg_base&) = delete;
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires(!uvalue_family<Tp>)
explicit uarg_base(type_registry& registry, T&&)
: uarg_base{registry, type_list<T&&>{}} {}
@@ -64,6 +65,11 @@ namespace meta_hpp::detail
: ref_type_{ref_types::const_rvalue}
, raw_type_{v.get_type()} {}
template < typename T, typename Tp = std::decay_t<T> >
requires std::is_same_v<Tp, uresult>
explicit uarg_base(type_registry& registry, T&& v)
: uarg_base{registry, *std::forward<T>(v)} {}
[[nodiscard]] bool is_ref_const() const noexcept {
return ref_type_ == ref_types::const_lvalue //
|| ref_type_ == ref_types::const_rvalue;
@@ -111,7 +117,13 @@ namespace meta_hpp::detail
, data_{const_cast<void*>(v.get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires std::is_same_v<Tp, uresult>
explicit uarg(type_registry& registry, T&& v)
: uarg_base{registry, std::forward<T>(v)}
, data_{const_cast<void*>(v->get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!uvalue_family<Tp>)
explicit uarg(type_registry& registry, T&& v)
: uarg_base{registry, std::forward<T>(v)}
, data_{const_cast<std::remove_cvref_t<T>*>(std::addressof(v))} {} // NOLINT(*-const-cast)

View File

@@ -8,6 +8,7 @@
#include "../../meta_base.hpp"
#include "../../meta_registry.hpp"
#include "../../meta_uresult.hpp"
#include "../../meta_uvalue.hpp"
#include "utraits.hpp"
@@ -34,7 +35,7 @@ namespace meta_hpp::detail
uinst_base& operator=(const uinst_base&) = delete;
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires(!uvalue_family<Tp>)
explicit uinst_base(type_registry& registry, T&&)
: uinst_base{registry, type_list<T&&>{}} {}
@@ -64,6 +65,11 @@ namespace meta_hpp::detail
: ref_type_{ref_types::const_rvalue}
, raw_type_{v.get_type()} {}
template < typename T, typename Tp = std::decay_t<T> >
requires std::is_same_v<Tp, uresult>
explicit uinst_base(type_registry& registry, T&& v)
: uinst_base{registry, *std::forward<T>(v)} {}
[[nodiscard]] bool is_inst_const() const noexcept {
if ( raw_type_.is_pointer() ) {
const pointer_type& from_type_ptr = raw_type_.as_pointer();
@@ -111,7 +117,13 @@ namespace meta_hpp::detail
, data_{const_cast<void*>(v.get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!any_uvalue_kind<Tp>)
requires std::is_same_v<Tp, uresult>
explicit uinst(type_registry& registry, T&& v)
: uinst_base{registry, std::forward<T>(v)}
, data_{const_cast<void*>(v->get_data())} {} // NOLINT(*-const-cast)
template < typename T, typename Tp = std::decay_t<T> >
requires(!uvalue_family<Tp>)
explicit uinst(type_registry& registry, T&& v)
: uinst_base{registry, std::forward<T>(v)}
, data_{const_cast<std::remove_cvref_t<T>*>(std::addressof(v))} {} // NOLINT(*-const-cast)

View File

@@ -8,30 +8,17 @@
#include "../../meta_base.hpp"
#include "../../meta_registry.hpp"
#include "../../meta_uvalue.hpp"
namespace meta_hpp::detail
{
template < typename T >
concept any_uvalue_kind //
= std::is_same_v<T, uarg_base> //
|| std::is_same_v<T, uarg> //
|| std::is_same_v<T, uinst_base> //
|| std::is_same_v<T, uinst> //
|| std::is_same_v<T, uresult> //
|| std::is_same_v<T, uvalue>; //
}
namespace meta_hpp::detail
{
template < typename T, typename Tp = std::decay_t<T> >
concept arg_lvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
concept arg_lvalue_ref_kind //
= (!uvalue_family<Tp>) //
&& (std::is_lvalue_reference_v<T>);
template < typename T, typename Tp = std::decay_t<T> >
concept arg_rvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
concept arg_rvalue_ref_kind //
= (!uvalue_family<Tp>) //
&& (!std::is_reference_v<T> || std::is_rvalue_reference_v<T>);
}
@@ -44,13 +31,13 @@ namespace meta_hpp::detail
template < typename T, typename Tp = std::decay_t<T> >
concept inst_class_lvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
= (!uvalue_family<Tp>) //
&& (std::is_lvalue_reference_v<T>) //
&& (std::is_class_v<std::remove_pointer_t<std::remove_reference_t<T>>>);
template < typename T, typename Tp = std::decay_t<T> >
concept inst_class_rvalue_ref_kind //
= (!any_uvalue_kind<Tp>) //
= (!uvalue_family<Tp>) //
&& (!std::is_reference_v<T> || std::is_rvalue_reference_v<T>) //
&& (std::is_class_v<std::remove_pointer_t<std::remove_reference_t<T>>>);
}

View File

@@ -9,8 +9,6 @@
#include "meta_base.hpp"
#include "meta_types.hpp"
#include "meta_detail/index_family.hpp"
namespace meta_hpp
{
class argument_index final {

View File

@@ -83,9 +83,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uerror> && //
!std::is_same_v<Tp, uvalue> && //
!std::is_same_v<Tp, uresult> && //
!detail::uvalue_family<Tp> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uresult(T&& val);
@@ -94,9 +92,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uerror> && //
!std::is_same_v<Tp, uvalue> && //
!std::is_same_v<Tp, uresult> && //
!detail::uvalue_family<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uresult& operator=(T&& val);

View File

@@ -26,7 +26,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uvalue> && //
!detail::uvalue_family<Tp> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uvalue(T&& val);
@@ -35,7 +35,7 @@ namespace meta_hpp
typename T, //
typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uvalue> && //
!detail::uvalue_family<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uvalue& operator=(T&& val);