Skip to content

Commit 476a75a

Browse files
authored
Simplify builder holders (#13384)
1 parent 2e52880 commit 476a75a

File tree

1 file changed

+16
-59
lines changed

1 file changed

+16
-59
lines changed

Framework/Core/include/Framework/TableBuilder.h

Lines changed: 16 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <memory>
3434
#include <tuple>
3535
#include <type_traits>
36+
#include <concepts>
3637

3738
namespace arrow
3839
{
@@ -462,10 +463,10 @@ struct CachedInsertion {
462463
int pos = 0;
463464
};
464465

465-
template <size_t I, typename T, template <typename U> typename InsertionPolicy>
466-
struct BuilderHolder : InsertionPolicy<T> {
466+
template <size_t I, typename T, typename P>
467+
struct BuilderHolder : P {
467468
static constexpr size_t index = I;
468-
using Policy = InsertionPolicy<T>;
469+
using Policy = P;
469470
using ArrowType = typename detail::ConversionTraits<T>::ArrowType;
470471
using BuilderType = typename arrow::TypeTraits<ArrowType>::BuilderType;
471472

@@ -562,60 +563,16 @@ template <class T, std::size_t N>
562563
struct is_bounded_array<std::array<T, N>> : std::true_type {
563564
};
564565

565-
template <size_t I, typename T>
566-
struct HolderTrait {
567-
568-
using Holder = BuilderHolder<I, T, DirectInsertion>;
569-
};
570-
571-
template <size_t I>
572-
struct HolderTrait<I, int8_t> {
573-
using Holder = BuilderHolder<I, int8_t, CachedInsertion>;
574-
};
575-
576-
template <size_t I>
577-
struct HolderTrait<I, uint8_t> {
578-
using Holder = BuilderHolder<I, uint8_t, CachedInsertion>;
579-
};
580-
581-
template <size_t I>
582-
struct HolderTrait<I, uint16_t> {
583-
using Holder = BuilderHolder<I, uint16_t, CachedInsertion>;
584-
};
585-
586-
template <size_t I>
587-
struct HolderTrait<I, int16_t> {
588-
using Holder = BuilderHolder<I, int16_t, CachedInsertion>;
589-
};
590-
591-
template <size_t I>
592-
struct HolderTrait<I, int> {
593-
using Holder = BuilderHolder<I, int, CachedInsertion>;
594-
};
595-
596-
template <size_t I>
597-
struct HolderTrait<I, float> {
598-
using Holder = BuilderHolder<I, float, CachedInsertion>;
599-
};
600-
601-
template <size_t I>
602-
struct HolderTrait<I, double> {
603-
using Holder = BuilderHolder<I, double, CachedInsertion>;
604-
};
605-
606-
template <size_t I>
607-
struct HolderTrait<I, unsigned int> {
608-
using Holder = BuilderHolder<I, unsigned int, CachedInsertion>;
609-
};
610-
611-
template <size_t I>
612-
struct HolderTrait<I, uint64_t> {
613-
using Holder = BuilderHolder<I, uint64_t, CachedInsertion>;
614-
};
566+
template <typename T>
567+
concept BulkInsertable = (std::integral<std::decay<T>> && !std::same_as<bool, std::decay_t<T>>);
615568

616-
template <size_t I>
617-
struct HolderTrait<I, int64_t> {
618-
using Holder = BuilderHolder<I, int64_t, CachedInsertion>;
569+
template <typename T>
570+
struct InsertionTrait {
571+
static consteval DirectInsertion<T> policy()
572+
requires(!BulkInsertable<T>);
573+
static consteval CachedInsertion<T> policy()
574+
requires(BulkInsertable<T>);
575+
using Policy = decltype(policy());
619576
};
620577

621578
/// Helper function to convert a brace-initialisable struct to
@@ -645,15 +602,15 @@ template <typename... ARGS>
645602
constexpr auto makeHolderTypes()
646603
{
647604
return []<std::size_t... Is>(std::index_sequence<Is...>) {
648-
return std::tuple(typename HolderTrait<Is, ARGS>::Holder(arrow::default_memory_pool())...);
605+
return std::tuple(BuilderHolder<Is, ARGS, typename InsertionTrait<ARGS>::Policy>(arrow::default_memory_pool())...);
649606
}(std::make_index_sequence<sizeof...(ARGS)>{});
650607
}
651608

652609
template <typename... ARGS>
653610
auto makeHolders(arrow::MemoryPool* pool, size_t nRows)
654611
{
655612
return [pool, nRows]<std::size_t... Is>(std::index_sequence<Is...>) {
656-
return new std::tuple(typename HolderTrait<Is, ARGS>::Holder(pool, nRows)...);
613+
return new std::tuple(BuilderHolder<Is, ARGS, typename InsertionTrait<ARGS>::Policy>(pool, nRows)...);
657614
}(std::make_index_sequence<sizeof...(ARGS)>{});
658615
}
659616

@@ -668,7 +625,7 @@ class TableBuilder
668625
static void throwError(RuntimeErrorRef const& ref);
669626

670627
template <typename... ARGS>
671-
using HoldersTuple = typename std::tuple<typename HolderTrait<0, ARGS>::Holder...>;
628+
using HoldersTuple = typename std::tuple<BuilderHolder<0, ARGS, typename InsertionTrait<ARGS>::Policy>...>;
672629

673630
template <typename... ARGS>
674631
using HoldersTupleIndexed = decltype(makeHolderTypes<ARGS...>());

0 commit comments

Comments
 (0)