12#define CPPGRES_USE_BOOST_PFR 1
23namespace cppgres::utils {
36template <
typename T>
using remove_optional_t =
typename utils::remove_optional<T>::type;
40 requires {
typename T::value_type; } && std::same_as<T, std::optional<typename T::value_type>>;
42template <
typename T>
constexpr std::string_view type_name() {
44 constexpr std::string_view p = __PRETTY_FUNCTION__;
45 constexpr std::string_view key =
"T = ";
46 const auto start = p.find(key) + key.size();
47 const auto end = p.find(
']', start);
48 return p.substr(start, end - start);
49#elif defined(__GNUC__)
50 constexpr std::string_view p = __PRETTY_FUNCTION__;
51 constexpr std::string_view key =
"T = ";
52 const auto start = p.find(key) + key.size();
53 const auto end = p.find(
';', start);
54 return p.substr(start, end - start);
55#elif defined(_MSC_VER)
56 constexpr std::string_view p = __FUNCSIG__;
57 constexpr std::string_view key =
"type_name<";
58 const auto start = p.find(key) + key.size();
59 const auto end = p.find(
">(void)");
60 return p.substr(start, end - start);
62 return "Unsupported compiler";
67 using tuple_size_type = std::integral_constant<std::size_t, 1>;
69 template <std::
size_t I,
typename U = T>
static constexpr decltype(
auto) get(U &&t)
noexcept {
70 return std::forward<U>(t);
83 using tuple_size_type = std::tuple_size<T>;
85 template <std::
size_t I,
typename U = T>
static constexpr decltype(
auto) get(U &&t)
noexcept {
86 return std::get<I>(std::forward<U>(t));
89 template <std::
size_t I>
using tuple_element = std::tuple_element<I, T>;
94#if CPPGRES_USE_BOOST_PFR
95template <
typename T>
struct tuple_traits_impl<T, std::enable_if_t<std::is_aggregate_v<T>>> {
96 using tuple_size_type = boost::pfr::tuple_size<T>;
98 template <std::
size_t I,
typename U = T>
static constexpr decltype(
auto) get(U &&t)
noexcept {
99 return boost::pfr::get<I>(std::forward<U>(t));
102 template <std::
size_t I>
using tuple_element = boost::pfr::tuple_element<I, T>;
107template <
typename T>
using tuple_size =
typename tuple_traits_impl<T>::tuple_size_type;
109template <
typename T>
constexpr std::size_t tuple_size_v = tuple_size<T>::value;
111template <std::
size_t I,
typename T>
114template <std::
size_t I,
typename T>
using tuple_element_t =
typename tuple_element<I, T>::type;
116template <std::
size_t I,
typename T>
constexpr decltype(
auto) get(T &&t)
noexcept {
123template <
typename... Ts>
struct is_std_tuple<std::tuple<Ts...>> : std::true_type {};
128template <
typename T>
decltype(
auto) tie(T &val) {
129#if CPPGRES_USE_BOOST_PFR == 1
130 if constexpr (std::is_aggregate_v<T>) {
131 return boost::pfr::structure_tie(val);
137 return std::tuple(val);
Definition: utils.hpp:126
Definition: utils.hpp:121