10#include <boost/preprocessor/empty.hpp>
11#include <boost/preprocessor/seq/for_each.hpp>
13#include <userver/utils/forward_like.hpp>
14#include <userver/utils/impl/boost_variadic_to_seq.hpp>
15#include <userver/utils/impl/internal_tag.hpp>
17USERVER_NAMESPACE_BEGIN
19namespace utils::impl {
21struct RequireSemicolon;
23struct NonMovable
final {
24 constexpr explicit NonMovable(InternalTag)
noexcept {}
28constexpr auto IsDefinedAndAggregate() ->
decltype(
static_cast<
void>(
sizeof(T)),
false) {
29 return std::is_aggregate_v<T>;
32template <
typename ,
typename... Args>
33constexpr auto IsDefinedAndAggregate(Args...) ->
bool {
44#define USERVER_IMPL_STRUCT_MAP(r, data, elem)
45 USERVER_NAMESPACE
::utils::ForwardLike<OtherDeps, decltype(other.elem)>(other.elem),
48#define USERVER_IMPL_MAKE_FROM_SUPERSET(Self, ...)
49 template <typename OtherDeps>
50 static Self MakeFromSupersetImpl(OtherDeps&& other, USERVER_NAMESPACE
::utils::impl::InternalTag) {
51 return {BOOST_PP_SEQ_FOR_EACH
(
52 USERVER_IMPL_STRUCT_MAP
,
54 USERVER_IMPL_VARIADIC_TO_SEQ
(__VA_ARGS__)
59#define USERVER_IMPL_STRUCT_SUBSET_MAP(r, data, elem)
61 decltype(data::elem) elem;
64#define USERVER_IMPL_STRUCT_SUBSET_REF_MAP(r, data, elem)
66 std::add_const_t<decltype(data::elem)>& elem;
76#define USERVER_ALLOW_CONVERSIONS_TO_SUBSET()
79 std::enable_if_t<USERVER_NAMESPACE
::utils::impl::IsDefinedAndAggregate<Other>(), int> Enable = 0
>
80 operator
Other() const& {
81 return Other::MakeFromSupersetImpl(*this, USERVER_NAMESPACE
::utils::impl::InternalTag{});
86 std::enable_if_t<USERVER_NAMESPACE
::utils::impl::IsDefinedAndAggregate<Other>(), int> Enable = 0
>
88 return Other::MakeFromSupersetImpl(std::move(*this), USERVER_NAMESPACE
::utils::impl::InternalTag{});
91 friend struct USERVER_NAMESPACE
::utils::impl::RequireSemicolon
113#define USERVER_DEFINE_STRUCT_SUBSET(SubsetStruct, OriginalStruct, ...)
114 struct SubsetStruct {
115 BOOST_PP_SEQ_FOR_EACH
(
116 USERVER_IMPL_STRUCT_SUBSET_MAP
,
118 USERVER_IMPL_VARIADIC_TO_SEQ
(__VA_ARGS__)
121 USERVER_IMPL_MAKE_FROM_SUPERSET
(SubsetStruct, __VA_ARGS__)
152#define USERVER_DEFINE_STRUCT_SUBSET_REF(SubsetStructRef, OriginalStruct, ...)
153 struct SubsetStructRef {
154 BOOST_PP_SEQ_FOR_EACH
(
155 USERVER_IMPL_STRUCT_SUBSET_REF_MAP
,
157 USERVER_IMPL_VARIADIC_TO_SEQ
(__VA_ARGS__)
161 USERVER_NAMESPACE
::utils::impl::NonMovable _impl_non_movable{USERVER_NAMESPACE
::utils::impl::InternalTag{}};
163 USERVER_IMPL_MAKE_FROM_SUPERSET
(SubsetStructRef, __VA_ARGS__)