3333#include < memory>
3434#include < tuple>
3535#include < type_traits>
36+ #include < concepts>
3637
3738namespace 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>
562563struct 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>
645602constexpr 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
652609template <typename ... ARGS>
653610auto 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