Skip to content

Commit a39e9a3

Browse files
committed
refactor virtual_ptr (requires)
1 parent 3849208 commit a39e9a3

File tree

2 files changed

+46
-20
lines changed

2 files changed

+46
-20
lines changed

include/boost/openmethod/core.hpp

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ namespace boost::openmethod {
3737
template<class Registry, class Class>
3838
constexpr bool is_polymorphic = Registry::rtti::template is_polymorphic<Class>;
3939

40+
template<
41+
class Class, class Registry = BOOST_OPENMETHOD_DEFAULT_REGISTRY,
42+
typename = void>
43+
class virtual_ptr;
44+
4045
// =============================================================================
4146
// Helpers
4247

@@ -191,6 +196,17 @@ struct parameter_traits {
191196
}
192197
};
193198

199+
template<typename T, class Registry>
200+
struct parameter_traits<virtual_<T>, Registry> : virtual_traits<T, Registry> {};
201+
202+
template<class Class, class Registry>
203+
struct parameter_traits<virtual_ptr<Class, Registry, void>, Registry>
204+
: virtual_traits<virtual_ptr<Class, Registry, void>, Registry> {};
205+
206+
template<class Class, class Registry>
207+
struct parameter_traits<const virtual_ptr<Class, Registry, void>&, Registry>
208+
: virtual_traits<const virtual_ptr<Class, Registry, void>&, Registry> {};
209+
194210
} // namespace detail
195211

196212
// =============================================================================
@@ -264,17 +280,30 @@ struct use_classes {
264280
tuple_type tuple;
265281
};
266282

283+
namespace detail {
284+
285+
template<typename, class, typename = void>
286+
struct is_virtual_smart_ptr_aux : std::false_type {};
287+
288+
template<typename Class, class Registry>
289+
struct is_virtual_smart_ptr_aux<
290+
Class, Registry,
291+
std::void_t<
292+
typename virtual_traits<Class, Registry>::template rebind<Class>>>
293+
: std::true_type {};
294+
295+
} // namespace detail
296+
297+
template<typename T, class Registry>
298+
constexpr bool is_virtual_smart_ptr =
299+
detail::is_virtual_smart_ptr_aux<T, Registry>::value;
300+
267301
// =============================================================================
268302
// virtual_ptr
269303

270304
template<class Registry, typename Argype>
271305
inline auto final_virtual_ptr(Argype&& obj);
272306

273-
template<
274-
class Class, class Registry = BOOST_OPENMETHOD_DEFAULT_REGISTRY,
275-
typename = void>
276-
class virtual_ptr;
277-
278307
namespace detail {
279308

280309
template<class Class, class Registry>
@@ -516,10 +545,12 @@ constexpr bool same_smart_ptr =
516545
same_smart_ptr_aux<Class, Other, Registry>::value;
517546

518547
template<class Class, class Registry>
548+
BOOST_OPENMETHOD_DETAIL_CXX20(requires(is_virtual_smart_ptr<Class, Registry>))
519549
class virtual_ptr<
520550
Class, Registry,
521-
std::void_t<
522-
typename virtual_traits<Class, Registry>::template rebind<Class>>> {
551+
BOOST_OPENMETHOD_DETAIL_CXX17(
552+
std::void_t<typename virtual_traits<Class, Registry>::template rebind<
553+
Class>>) BOOST_OPENMETHOD_DETAIL_CXX20(void)> {
523554

524555
template<class, class, typename>
525556
friend class virtual_ptr;
@@ -1245,19 +1276,6 @@ auto method<Name, ReturnType(Parameters...), Registry>::check_static_offset(
12451276
// -----------------------------------------------------------------------------
12461277
// method dispatch
12471278

1248-
namespace detail {
1249-
template<typename T, class Registry>
1250-
struct parameter_traits<virtual_<T>, Registry> : virtual_traits<T, Registry> {};
1251-
1252-
template<class Class, class Registry>
1253-
struct parameter_traits<virtual_ptr<Class, Registry, void>, Registry>
1254-
: virtual_traits<virtual_ptr<Class, Registry, void>, Registry> {};
1255-
1256-
template<class Class, class Registry>
1257-
struct parameter_traits<const virtual_ptr<Class, Registry, void>&, Registry>
1258-
: virtual_traits<const virtual_ptr<Class, Registry, void>&, Registry> {};
1259-
} // namespace detail
1260-
12611279
template<
12621280
typename Name, typename... Parameters, typename ReturnType, class Registry>
12631281
BOOST_FORCEINLINE auto

include/boost/openmethod/detail/types.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@
1010

1111
#include <boost/openmethod/detail/static_list.hpp>
1212

13+
#if BOOST_CXX_VERSION > 202002L
14+
#define BOOST_OPENMETHOD_DETAIL_CXX17(...)
15+
#define BOOST_OPENMETHOD_DETAIL_CXX20(...) __VA_ARGS__
16+
#else
17+
#define BOOST_OPENMETHOD_DETAIL_CXX17(...) __VA_ARGS__
18+
#define BOOST_OPENMETHOD_DETAIL_CXX20(...)
19+
#endif
20+
1321
namespace boost::openmethod {
1422

1523
namespace detail {

0 commit comments

Comments
 (0)