Program Listing for File macros.hpp

Return to documentation for file (include/macros.hpp)

// ctql/macros.hpp
#pragma once
// Public macro layer for ctql. Define CTQL_NO_MACROS to opt out entirely.
// Define CTQL_ENABLE_DSL to also export `$...` shorthands (non-standard identifiers).

#ifndef CTQL_NO_MACROS

// ---- Core CTQL_* macros (portable, recommended) ----
#define CTQL_TYPE_LIST(...)            ::ctql::detail::HTList<__VA_ARGS__>
#define CTQL_APPEND(ListL, ListR)      typename ::ctql::detail::append<ListL, ListR>::type

// Extractors
#define CTQL_TO_TUPLE(List)            typename ::ctql::to_tuple<List>::type
#define CTQL_TO_VARIANT(List)          typename ::ctql::to_variant<List>::type
#define CTQL_TUPLE_T(...)              std::tuple<__VA_ARGS__>

// Partition API
#define CTQL_PARTITION_BY(Pivot, Rel, ...)   ::ctql::partition_by<Pivot, Rel, __VA_ARGS__>
#define CTQL_PARTITION_PASS(Pivot, Rel, ...) typename CTQL_PARTITION_BY(Pivot, Rel, __VA_ARGS__)::pass
#define CTQL_PARTITION_FAIL(Pivot, Rel, ...) typename CTQL_PARTITION_BY(Pivot, Rel, __VA_ARGS__)::fail
#define CTQL_PARTITION_CONCAT(Pivot, Rel, ...) typename CTQL_PARTITION_BY(Pivot, Rel, __VA_ARGS__)::concat
#define CTQL_PARTITION_BY_KEY(Pivot, Rel, KeyOf, ...) \
    ::ctql::partition_by_key<Pivot, Rel, KeyOf, __VA_ARGS__>

// Sorting (KeyOf<T> must provide: using type = T; static constexpr size)
#define CTQL_SORT_TYPES(...)              ::ctql::TypeSort<::ctql::Order::Asc, Size, __VA_ARGS__>
#define CTQL_SORT_TYPES_ASC(KeyOf, ...)   ::ctql::TypeSort<::ctql::Order::Asc,  KeyOf, __VA_ARGS__>
#define CTQL_SORT_TYPES_DESC(KeyOf, ...)  ::ctql::TypeSort<::ctql::Order::Desc, KeyOf, __VA_ARGS__>

// Reducers over `.size`
#define CTQL_REDUCE_SIZES(Op, Init, ...)  (::ctql::reduce_sizes_v<Op, Init, __VA_ARGS__>)
#define CTQL_SUM_SIZES(...)               (::ctql::Sum_v<__VA_ARGS__>)

// Matching
#define CTQL_MATCH(arg, ...)               std::invoke(ctql::match {__VA_ARGS__}, arg)

// Operation
#define CTQL_OP(str)                      ctql::op_type<str##_ct>::template pred

// Predicates
#define CTQL_SIZE_OF(...)              ctql::SizeOf_t<__VA_ARGS__>
#define CTQL_ALIGN_OF(...)            ctql::AlignOf_t<__VA_ARGS__>
#define CTQL_APPLY(S, ...)         ctql::Apply<S, __VA_ARGS__>

// Convenience for defining a "size" in wrappers or pivots
#define CTQL_SIZE(n) static constexpr std::size_t size = (n);

#  ifdef CTQL_ENABLE_DSL
    // Lists / transforms
#   define $type_list(...)          CTQL_TYPE_LIST(__VA_ARGS__)
#   define $to_tuple(List)          CTQL_TO_TUPLE(List)
#   define $to_variant(List)        CTQL_TO_VARIANT(List)
#   define $tuple_t(...)            CTQL_TUPLE_T(__VA_ARGS__)

    // Partition helpers
#   define $partition_by(Pivot, Rel, ...)   CTQL_PARTITION_CONCAT(Pivot, Rel, __VA_ARGS__)
#   define $filter_by(Pivot, Rel, ...)      CTQL_PARTITION_PASS(Pivot, Rel, __VA_ARGS__)
#   define $reject_if_by(Pivot, Rel, ...)   CTQL_PARTITION_FAIL(Pivot, Rel, __VA_ARGS__)

    // Sorting short-hands (defaults to ascending)
#   define $sort_types(...)             CTQL_TO_TUPLE(CTQL_SORT_TYPES(__VA_ARGS__))
#   define $sort_types_by(KeyOf, ...)   CTQL_TO_TUPLE(CTQL_SORT_TYPES_ASC(KeyOf, __VA_ARGS__))
#   define $sort_types_desc(KeyOf, ...) CTQL_TO_TUPLE(CTQL_SORT_TYPES_DESC(KeyOf, __VA_ARGS__))

    // Reducers
#   define $reduce_sizes(...)         CTQL_REDUCE_SIZES(__VA_ARGS__)  // (Op, Init, Ts...)
#   define $sum_sizes(...)            CTQL_SUM_SIZES(__VA_ARGS__)     // (Ts...)
#   define $size(n)                   CTQL_SIZE(n)

    // Matching
#   define $match(arg, ...)           CTQL_MATCH(arg, __VA_ARGS__)

    // Operation
#   define $op(str)                   CTQL_OP(str)

    // Predicates
#   define $size_of(...)              CTQL_SIZE_OF(__VA_ARGS__)
#   define $align_of(...)             CTQL_ALIGN_OF(__VA_ARGS__)
#   define $apply(S, ...)             CTQL_APPLY(S, __VA_ARGS__)

#  endif // CTQL_ENABLE_DSL

#endif // CTQL_NO_MACROS