13template <
typename Tuple>
15 return std::tuple_size_v<Tuple> == 0;
19template <
typename Tuple>
20std::string
tuple_to_sql(
const Tuple& tuple,
const char* separator) {
24 [&](
const auto&... items) { ((ss << (i++ > 0 ? separator :
"") << items.to_sql()), ...); },
30template <
typename Tuple>
32 std::vector<std::string> params;
35 [&](
const auto&... items) {
36 auto process_item = [¶ms](
const auto& item) {
37 auto item_params = item.bind_params();
38 if (!item_params.empty()) {
39 params.insert(params.end(), item_params.begin(), item_params.end());
43 (process_item(items), ...);
51template <
typename Func,
typename Tuple>
53 std::apply([&func](
const auto&... args) { (func(args), ...); }, tuple);
60template <
typename Class,
typename T>
69template <auto MemberPtr>
72 using column_type = std::remove_reference_t<decltype(std::declval<table_type>().*MemberPtr)>;
76template <auto MemberPtr>
79 return column_t::name;
std::string tuple_to_sql(const Tuple &tuple, const char *separator)
Helper to convert a tuple of expressions to SQL.
static constexpr bool is_empty_tuple()
Helper to check if a tuple is empty.
static void apply_tuple(Func &&func, const Tuple &tuple)
Helper to apply a function to each element of a tuple.
constexpr auto column_name_of()
Helper to get column name from member pointer.
typename class_of_t< T >::type class_of_t_t
std::vector< std::string > tuple_bind_params(const Tuple &tuple)
Helper to collect bind parameters from a tuple of expressions.
Helper to extract class type from a member pointer.
Helper to extract column type from member pointer.
std::remove_reference_t< decltype(std::declval< table_type >().*MemberPtr)> column_type
class_of_t_t< decltype(MemberPtr)> table_type