mirror of
https://github.com/BlackMATov/meta.hpp.git
synced 2025-12-15 03:45:30 +07:00
fix recursive concepts (copy ctors on itself)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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> >
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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> >
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user