33 #include <type_traits>
34 #include <boost/fusion/include/at_c.hpp>
35 #include <boost/fusion/adapted/struct/adapt_struct.hpp>
36 #include <boost/fusion/include/adapt_struct.hpp>
48 template<
typename T,
typename Concrete>
49 struct IndirectHolderBase
62 template<
typename U = T,
typename Sub =
typename U::value_type>
71 return static_cast<Concrete&> (*
this);
90 template<
typename T,
typename... Tags>
91 struct PKey : IndirectHolderBase<T, PKey<T, Tags...>>
93 using PKey::IndirectHolderBase::IndirectHolderBase;
96 template<
typename T,
typename... Args>
97 using PKeyValue_t =
typename PKey<T, Args...>::value_type;
100 struct Unique : IndirectHolderBase<T, Unique<T>>
102 using Unique::IndirectHolderBase::IndirectHolderBase;
109 struct NotNull : IndirectHolderBase<T, NotNull<T>>
111 using NotNull::IndirectHolderBase::IndirectHolderBase;
123 struct IsReferencesTarget : std::false_type {};
125 template<
typename U,
typename... Tags>
126 struct IsReferencesTarget<
PKey<U, Tags...>> : std::true_type {};
129 struct IsReferencesTarget<
Unique<U>> : std::true_type {};
138 using References::IndirectHolderBase::IndirectHolderBase;
140 template<
typename T,
typename... Tags>
146 template<
typename T,
typename... Tags>
157 template<
int... Fields>
160 template<
int... Fields>
163 template<
typename... Args>
166 template<
auto... Fields>
169 template<
typename... Args>
175 template<
typename T,
typename... Args>
189 inline static struct DefaultTag {}
Default;
190 inline static struct IgnoreTag {}
Ignore;
196 template<
auto... Ptrs>
202 template<
auto... Ptrs>
203 inline static FieldsType<Ptrs...>
Fields {};
205 template<
typename Seq>
211 template<
typename Seq>
212 inline static PKeyType<Seq>
PKey {};
223 template<
typename Tag>