10#include <boost/preprocessor/empty.hpp>
11#include <boost/preprocessor/seq/for_each.hpp>
13#include <userver/utils/impl/boost_variadic_to_seq.hpp>
14#include <userver/utils/impl/internal_tag.hpp>
16USERVER_NAMESPACE_BEGIN
18namespace utils::
impl {
20struct RequireSemicolon;
22struct NonMovable
final {
23 constexpr explicit NonMovable(InternalTag)
noexcept {}
27constexpr auto IsDefinedAndAggregate() ->
decltype(
static_cast<
void>(
sizeof(T)),
false) {
28 return std::is_aggregate_v<T>;
31template <
typename ,
typename... Args>
32constexpr auto IsDefinedAndAggregate(Args...) ->
bool {
43#define USERVER_IMPL_STRUCT_MAP(r, data, elem) std::forward<OtherDeps>(other).elem,
46#define USERVER_IMPL_MAKE_FROM_SUPERSET(Self, ...)
47 template <typename OtherDeps>
48 static Self MakeFromSupersetImpl(OtherDeps&& other, USERVER_NAMESPACE
::utils::impl::InternalTag) {
49 return {BOOST_PP_SEQ_FOR_EACH
(
50 USERVER_IMPL_STRUCT_MAP
,
52 USERVER_IMPL_VARIADIC_TO_SEQ
(__VA_ARGS__)
57#define USERVER_IMPL_STRUCT_SUBSET_MAP(r, data, elem)
59 decltype(data::elem) elem;
62#define USERVER_IMPL_STRUCT_SUBSET_REF_MAP(r, data, elem)
64 std::add_const_t<decltype(data::elem)>& elem;
74#define USERVER_ALLOW_CONVERSIONS_TO_SUBSET()
77 std::enable_if_t<USERVER_NAMESPACE
::utils::impl::IsDefinedAndAggregate<Other>(), int> Enable = 0
>
78 operator
Other() const& {
79 return Other::MakeFromSupersetImpl(*this, USERVER_NAMESPACE
::utils::impl::InternalTag{});
84 std::enable_if_t<USERVER_NAMESPACE
::utils::impl::IsDefinedAndAggregate<Other>(), int> Enable = 0
>
86 return Other::MakeFromSupersetImpl(std::move(*this), USERVER_NAMESPACE
::utils::impl::InternalTag{});
89 friend struct USERVER_NAMESPACE
::utils::impl::RequireSemicolon
111#define USERVER_DEFINE_STRUCT_SUBSET(SubsetStruct, OriginalStruct, ...)
112 struct SubsetStruct {
113 BOOST_PP_SEQ_FOR_EACH
(
114 USERVER_IMPL_STRUCT_SUBSET_MAP
,
116 USERVER_IMPL_VARIADIC_TO_SEQ
(__VA_ARGS__)
119 USERVER_IMPL_MAKE_FROM_SUPERSET
(SubsetStruct, __VA_ARGS__)
150#define USERVER_DEFINE_STRUCT_SUBSET_REF(SubsetStructRef, OriginalStruct, ...)
151 struct SubsetStructRef {
152 BOOST_PP_SEQ_FOR_EACH
(
153 USERVER_IMPL_STRUCT_SUBSET_REF_MAP
,
155 USERVER_IMPL_VARIADIC_TO_SEQ
(__VA_ARGS__)
159 USERVER_NAMESPACE
::utils::impl::NonMovable _impl_non_movable{USERVER_NAMESPACE
::utils::impl::InternalTag{}};
161 USERVER_IMPL_MAKE_FROM_SUPERSET
(SubsetStructRef, __VA_ARGS__)