18using BoolConstant = std::integral_constant<
bool, Value>;
19template <std::size_t Value>
20using SizeConstant = std::integral_constant<std::size_t, Value>;
28inline constexpr bool kIsMappedToSystemType = IsMappedToSystemType<T>::value;
34inline constexpr bool kIsMappedToUserType = IsMappedToUserType<T>::value;
38struct IsMappedToArray;
40inline constexpr bool kIsMappedToArray = IsMappedToArray<T>::value;
43template <
typename T,
typename = USERVER_NAMESPACE::
utils::void_t<>>
44struct IsMappedToPg : BoolConstant<kIsMappedToUserType<T> || kIsMappedToSystemType<T> || kIsMappedToArray<T>> {};
46inline constexpr bool kIsMappedToPg = IsMappedToPg<T>::value;
49template <
typename T,
typename = USERVER_NAMESPACE::
utils::void_t<>>
52inline constexpr bool kIsSpecialMapping = IsSpecialMapping<T>::value;
58using HasOutputOperator =
decltype(std::declval<std::ostream&>() << std::declval<T&>());
61inline constexpr bool kHasOutputOperator = meta::kIsDetected<HasOutputOperator, T>;
64using HasInputOperator =
decltype(std::declval<std::istream&>() >> std::declval<T&>());
67inline constexpr bool kHasInputOperator = meta::kIsDetected<HasInputOperator, T>;
76inline constexpr bool kIsCompatibleContainer = IsCompatibleContainer<T>::value;
79inline constexpr bool kIsFixedSizeContainer = meta::kIsFixedSizeContainer<T>;
84template <
typename T,
typename Enable = USERVER_NAMESPACE::
utils::void_t<>>
89 : SizeConstant<1 +
DimensionCount<
typename T::value_type>::value> {};
91inline constexpr std::size_t kDimensionCount = DimensionCount<T>::value;
97struct ContainerFinalElement;
102struct FinalElementImpl {
107struct ContainerFinalElementImpl {
108 using type =
typename ContainerFinalElement<
typename T::value_type>::type;
114struct ContainerFinalElement
115 : std::conditional_t<kIsCompatibleContainer<T>, detail::ContainerFinalElementImpl<T>, detail::FinalElementImpl<T>> {
119using ContainerFinaleElementType =
typename ContainerFinalElement<T>::type;
126template <
typename Container>
127constexpr bool EnableContainerMapping() {
128 if constexpr (!
traits::kIsCompatibleContainer<Container>) {
131 return traits::kIsMappedToPg<
typename traits::ContainerFinalElement<Container>::type>;
138struct IsMappedToArray : BoolConstant<detail::EnableContainerMapping<T>()> {};
141template <
typename T,
typename = USERVER_NAMESPACE::
utils::void_t<>>
144struct CanReserve<T, USERVER_NAMESPACE::
utils::void_t<
decltype(std::declval<T>().reserve(std::declval<std::size_t>()))>>
147inline constexpr bool kCanReserve = CanReserve<T>::value;
149template <
typename T,
typename = USERVER_NAMESPACE::
utils::void_t<>>
153struct CanResize<T, USERVER_NAMESPACE::
utils::void_t<
decltype(std::declval<T>().resize(std::declval<std::size_t>()))>>
156inline constexpr bool kCanResize = CanResize<T>::value;
158template <
typename T,
typename = USERVER_NAMESPACE::
utils::void_t<>>
162struct CanClear<T, USERVER_NAMESPACE::
utils::void_t<
decltype(std::declval<T>().clear())>> : std::true_type {};
164inline constexpr bool kCanClear = CanClear<T>::value;
167auto Inserter(T& container) {
168 return meta::Inserter(container);
172struct RemoveTupleReferences;
174template <
typename... T>
175struct RemoveTupleReferences<std::tuple<T...>> {
176 using type = std::tuple<std::remove_reference_t<T>...>;
181template <
typename... T>
185struct AddTupleConstRef;
187template <
typename... T>
188struct AddTupleConstRef<std::tuple<T...>> {
189 using type = std::tuple<std::add_const_t<std::add_lvalue_reference_t<std::decay_t<T>>>...>;
192template <
typename Tuple>
193struct TupleHasParsers;
195template <
typename... T>
196struct TupleHasParsers<std::tuple<T...>> : std::bool_constant<(
HasParser<std::decay_t<T>>::value && ...)> {};
198template <
typename Tuple>
199struct TupleHasFormatters;
201template <
typename... T>
202struct TupleHasFormatters<std::tuple<T...>> : std::bool_constant<(
HasFormatter<std::decay_t<T>>::value && ...)> {};