fix recursive concepts (copy ctors on itself)

This commit is contained in:
BlackMATov
2023-02-17 05:58:09 +07:00
parent 2f3a6740b7
commit 72c4d54b60
6 changed files with 88 additions and 90 deletions

View File

@@ -419,15 +419,20 @@ namespace meta_hpp::detail
return *this; return *this;
} }
template < typename F > template < //
requires(!std::is_same_v<fixed_function, std::decay_t<F>>) typename F, //
// NOLINTNEXTLINE(*-forwarding-reference-overload) typename Fp = std::decay_t<F>, //
typename = std::enable_if_t< //
!std::is_same_v<Fp, fixed_function>>> //
fixed_function(F&& fun) { fixed_function(F&& fun) {
vtable_t::construct(*this, std::forward<F>(fun)); vtable_t::construct(*this, std::forward<F>(fun));
} }
template < typename F > template < //
requires(!std::is_same_v<fixed_function, std::decay_t<F>>) typename F, //
typename Fp = std::decay_t<F>, //
typename = std::enable_if_t< //
!std::is_same_v<Fp, fixed_function>>> //
fixed_function& operator=(F&& fun) { fixed_function& operator=(F&& fun) {
fixed_function{std::forward<F>(fun)}.swap(*this); fixed_function{std::forward<F>(fun)}.swap(*this);
return *this; return *this;
@@ -2875,16 +2880,21 @@ namespace meta_hpp
uvalue& operator=(uvalue&& other) noexcept; uvalue& operator=(uvalue&& other) noexcept;
uvalue& operator=(const uvalue& other); uvalue& operator=(const uvalue& other);
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uvalue>) // typename T, //
&& (!detail::is_in_place_type_v<Tp>) // typename Tp = std::decay_t<T>, //
&& (std::is_copy_constructible_v<Tp>) // typename = std::enable_if_t< //
// NOLINTNEXTLINE(*-forwarding-reference-overload) !std::is_same_v<Tp, uvalue> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uvalue(T&& val); uvalue(T&& val);
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uvalue>) // typename T, //
&& (std::is_copy_constructible_v<Tp>) // typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uvalue> && //
std::is_copy_constructible_v<Tp>>> //
uvalue& operator=(T&& val); uvalue& operator=(T&& val);
template < typename T, typename... Args, typename Tp = std::decay_t<T> > template < typename T, typename... Args, typename Tp = std::decay_t<T> >
@@ -8224,20 +8234,25 @@ namespace meta_hpp
uresult& operator=(uerror error) noexcept; uresult& operator=(uerror error) noexcept;
uresult& operator=(uvalue value) noexcept; uresult& operator=(uvalue value) noexcept;
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uerror>) // typename T, //
&& (!std::is_same_v<Tp, uvalue>) // typename Tp = std::decay_t<T>, //
&& (!std::is_same_v<Tp, uresult>) // typename = std::enable_if_t< //
&& (!detail::is_in_place_type_v<Tp>) // !std::is_same_v<Tp, uerror> && //
&& (std::is_copy_constructible_v<Tp>) // !std::is_same_v<Tp, uvalue> && //
// NOLINTNEXTLINE(*-forwarding-reference-overload) !std::is_same_v<Tp, uresult> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uresult(T&& val); uresult(T&& val);
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uerror>) // typename T, //
&& (!std::is_same_v<Tp, uvalue>) // typename Tp = std::decay_t<T>, //
&& (!std::is_same_v<Tp, uresult>) // typename = std::enable_if_t< //
&& (std::is_copy_constructible_v<Tp>) // !std::is_same_v<Tp, uerror> && //
!std::is_same_v<Tp, uvalue> && //
!std::is_same_v<Tp, uresult> && //
std::is_copy_constructible_v<Tp>>> //
uresult& operator=(T&& val); uresult& operator=(T&& val);
template < typename T, typename... Args, typename Tp = std::decay_t<T> > template < typename T, typename... Args, typename Tp = std::decay_t<T> >
@@ -8716,18 +8731,12 @@ namespace meta_hpp
return *this; return *this;
} }
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uvalue>) //
&& (!detail::is_in_place_type_v<Tp>) //
&& (std::is_copy_constructible_v<Tp>) //
// NOLINTNEXTLINE(*-forwarding-reference-overload)
uvalue::uvalue(T&& val) { uvalue::uvalue(T&& val) {
vtable_t::do_ctor<T>(*this, std::forward<T>(val)); vtable_t::do_ctor<T>(*this, std::forward<T>(val));
} }
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uvalue>) //
&& (std::is_copy_constructible_v<Tp>) //
uvalue& uvalue::operator=(T&& val) { uvalue& uvalue::operator=(T&& val) {
vtable_t::do_reset(*this); vtable_t::do_reset(*this);
vtable_t::do_ctor<T>(*this, std::forward<T>(val)); vtable_t::do_ctor<T>(*this, std::forward<T>(val));
@@ -9176,21 +9185,11 @@ namespace meta_hpp
return *this; return *this;
} }
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uerror>) //
&& (!std::is_same_v<Tp, uvalue>) //
&& (!std::is_same_v<Tp, uresult>) //
&& (!detail::is_in_place_type_v<Tp>) //
&& (std::is_copy_constructible_v<Tp>) //
// NOLINTNEXTLINE(*-forwarding-reference-overload)
uresult::uresult(T&& val) uresult::uresult(T&& val)
: value_{std::forward<T>(val)} {} : value_{std::forward<T>(val)} {}
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uerror>) //
&& (!std::is_same_v<Tp, uvalue>) //
&& (!std::is_same_v<Tp, uresult>) //
&& (std::is_copy_constructible_v<Tp>) //
uresult& uresult::operator=(T&& val) { uresult& uresult::operator=(T&& val) {
value_ = std::forward<T>(val); value_ = std::forward<T>(val);
error_ = error_code::no_error; error_ = error_code::no_error;

View File

@@ -41,15 +41,20 @@ namespace meta_hpp::detail
return *this; return *this;
} }
template < typename F > template < //
requires(!std::is_same_v<fixed_function, std::decay_t<F>>) typename F, //
// NOLINTNEXTLINE(*-forwarding-reference-overload) typename Fp = std::decay_t<F>, //
typename = std::enable_if_t< //
!std::is_same_v<Fp, fixed_function>>> //
fixed_function(F&& fun) { fixed_function(F&& fun) {
vtable_t::construct(*this, std::forward<F>(fun)); vtable_t::construct(*this, std::forward<F>(fun));
} }
template < typename F > template < //
requires(!std::is_same_v<fixed_function, std::decay_t<F>>) typename F, //
typename Fp = std::decay_t<F>, //
typename = std::enable_if_t< //
!std::is_same_v<Fp, fixed_function>>> //
fixed_function& operator=(F&& fun) { fixed_function& operator=(F&& fun) {
fixed_function{std::forward<F>(fun)}.swap(*this); fixed_function{std::forward<F>(fun)}.swap(*this);
return *this; return *this;

View File

@@ -75,20 +75,25 @@ namespace meta_hpp
uresult& operator=(uerror error) noexcept; uresult& operator=(uerror error) noexcept;
uresult& operator=(uvalue value) noexcept; uresult& operator=(uvalue value) noexcept;
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uerror>) // typename T, //
&& (!std::is_same_v<Tp, uvalue>) // typename Tp = std::decay_t<T>, //
&& (!std::is_same_v<Tp, uresult>) // typename = std::enable_if_t< //
&& (!detail::is_in_place_type_v<Tp>) // !std::is_same_v<Tp, uerror> && //
&& (std::is_copy_constructible_v<Tp>) // !std::is_same_v<Tp, uvalue> && //
// NOLINTNEXTLINE(*-forwarding-reference-overload) !std::is_same_v<Tp, uresult> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uresult(T&& val); uresult(T&& val);
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uerror>) // typename T, //
&& (!std::is_same_v<Tp, uvalue>) // typename Tp = std::decay_t<T>, //
&& (!std::is_same_v<Tp, uresult>) // typename = std::enable_if_t< //
&& (std::is_copy_constructible_v<Tp>) // !std::is_same_v<Tp, uerror> && //
!std::is_same_v<Tp, uvalue> && //
!std::is_same_v<Tp, uresult> && //
std::is_copy_constructible_v<Tp>>> //
uresult& operator=(T&& val); uresult& operator=(T&& val);
template < typename T, typename... Args, typename Tp = std::decay_t<T> > template < typename T, typename... Args, typename Tp = std::decay_t<T> >

View File

@@ -59,21 +59,11 @@ namespace meta_hpp
return *this; return *this;
} }
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uerror>) //
&& (!std::is_same_v<Tp, uvalue>) //
&& (!std::is_same_v<Tp, uresult>) //
&& (!detail::is_in_place_type_v<Tp>) //
&& (std::is_copy_constructible_v<Tp>) //
// NOLINTNEXTLINE(*-forwarding-reference-overload)
uresult::uresult(T&& val) uresult::uresult(T&& val)
: value_{std::forward<T>(val)} {} : value_{std::forward<T>(val)} {}
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uerror>) //
&& (!std::is_same_v<Tp, uvalue>) //
&& (!std::is_same_v<Tp, uresult>) //
&& (std::is_copy_constructible_v<Tp>) //
uresult& uresult::operator=(T&& val) { uresult& uresult::operator=(T&& val) {
value_ = std::forward<T>(val); value_ = std::forward<T>(val);
error_ = error_code::no_error; error_ = error_code::no_error;

View File

@@ -22,16 +22,21 @@ namespace meta_hpp
uvalue& operator=(uvalue&& other) noexcept; uvalue& operator=(uvalue&& other) noexcept;
uvalue& operator=(const uvalue& other); uvalue& operator=(const uvalue& other);
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uvalue>) // typename T, //
&& (!detail::is_in_place_type_v<Tp>) // typename Tp = std::decay_t<T>, //
&& (std::is_copy_constructible_v<Tp>) // typename = std::enable_if_t< //
// NOLINTNEXTLINE(*-forwarding-reference-overload) !std::is_same_v<Tp, uvalue> && //
!detail::is_in_place_type_v<Tp> && //
std::is_copy_constructible_v<Tp>>> //
uvalue(T&& val); uvalue(T&& val);
template < typename T, typename Tp = std::decay_t<T> > template < //
requires(!std::is_same_v<Tp, uvalue>) // typename T, //
&& (std::is_copy_constructible_v<Tp>) // typename Tp = std::decay_t<T>, //
typename = std::enable_if_t< //
!std::is_same_v<Tp, uvalue> && //
std::is_copy_constructible_v<Tp>>> //
uvalue& operator=(T&& val); uvalue& operator=(T&& val);
template < typename T, typename... Args, typename Tp = std::decay_t<T> > template < typename T, typename... Args, typename Tp = std::decay_t<T> >

View File

@@ -282,18 +282,12 @@ namespace meta_hpp
return *this; return *this;
} }
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uvalue>) //
&& (!detail::is_in_place_type_v<Tp>) //
&& (std::is_copy_constructible_v<Tp>) //
// NOLINTNEXTLINE(*-forwarding-reference-overload)
uvalue::uvalue(T&& val) { uvalue::uvalue(T&& val) {
vtable_t::do_ctor<T>(*this, std::forward<T>(val)); vtable_t::do_ctor<T>(*this, std::forward<T>(val));
} }
template < typename T, typename Tp > template < typename T, typename Tp, typename >
requires(!std::is_same_v<Tp, uvalue>) //
&& (std::is_copy_constructible_v<Tp>) //
uvalue& uvalue::operator=(T&& val) { uvalue& uvalue::operator=(T&& val) {
vtable_t::do_reset(*this); vtable_t::do_reset(*this);
vtable_t::do_ctor<T>(*this, std::forward<T>(val)); vtable_t::do_ctor<T>(*this, std::forward<T>(val));