13         template<
typename... Fields, std::size_t FirstCoord, std::size_t... Coords>
 
   16             using Rec = 
Record<Fields...>;
 
   17             if constexpr(
sizeof...(Coords) == 0)
 
   20                 using Part2 = mp_erase_c<Rec, FirstCoord, FirstCoord + 1>;
 
   21                 return mp_list<Part1, Part2>{};
 
   29                 using Part2 = mp_replace_at_c<Rec, FirstCoord, Field<FieldTag, mp_second<InnerPartition>>>;
 
   30                 return mp_list<Part1, Part2>{};
 
   34         template<
typename Acc, 
typename TagList>
 
   46         template<
typename Acc, 
typename TagList>
 
   49         template<
typename... Fields, 
typename... RCs>
 
   52             static_assert((isRecordCoord<RCs> && ...));
 
   53             using Initial = mp_list<Record<>, 
Record<Fields...>>; 
 
   57         template<
typename RC, 
typename RecordCoordForMapping1>
 
   58         inline constexpr 
bool isSelected = recordCoordCommonPrefixIsSame<RecordCoordForMapping1, RC>;
 
   60         template<
typename RC, 
typename... RecordCoordsForMapping1>
 
   61         inline constexpr 
bool isSelected<RC, mp_list<RecordCoordsForMapping1...>>
 
   62             = (isSelected<RC, RecordCoordsForMapping1> || ...);
 
   64         template<
typename RecordDim, 
typename Selector>
 
   67         template<
typename RecordDim, std::size_t... RCs>
 
   73         template<
typename RecordDim, 
typename... Args>
 
   78                 if constexpr(((mp_is_list<Args>::value || isRecordCoord<Args>) &&...))
 
   80                     return mp_list<GetCoordFromTags<RecordDim, Args>...>{};
 
   86             using type = decltype(f());
 
   99         typename TArrayExtents,
 
  101         typename TSelectorForMapping1,
 
  102         template<
typename...>
 
  103         typename MappingTemplate1,
 
  104         template<
typename...>
 
  105         typename MappingTemplate2,
 
  106         bool SeparateBlobs = 
false>
 
  109         static_assert(isRecord<TRecordDim>, 
"Cannot split a scalar record dim");
 
  123         using Mapping1 = MappingTemplate1<ArrayExtents, RecordDim1>;
 
  124         using Mapping2 = MappingTemplate2<ArrayExtents, RecordDim2>;
 
  126         static constexpr std::size_t 
blobCount = SeparateBlobs ? Mapping1::blobCount + Mapping2::blobCount : 1;
 
  127         static_assert(SeparateBlobs || Mapping1::blobCount == 1);
 
  128         static_assert(SeparateBlobs || Mapping2::blobCount == 1);
 
  132         static constexpr size_type m1bc = 
static_cast<size_type
>(Mapping1::blobCount);
 
  149         template<
typename... Args1, 
typename... Args2>
 
  163             if constexpr(SeparateBlobs)
 
  173         template<std::size_t... RecordCoords>
 
  184                 if constexpr(SeparateBlobs)
 
  185                     nrAndOffset.nr += m1bc;
 
  188                     for(size_type i = 0; i < m1bc; i++)
 
  189                         nrAndOffset.offset += 
mapping1.blobSize(i);
 
  195         template<std::size_t... RecordCoords>
 
  200                 return llama::isComputed<Mapping1, GetCoordFromTags<RecordDim1, Tags>>;
 
  202                 return llama::isComputed<Mapping2, GetCoordFromTags<RecordDim2, Tags>>;
 
  205         template<std::size_t... RecordCoords, 
typename Blobs>
 
  215                 auto* blobs2 = &blobs[0] + m1bc;
 
  228         typename SelectorForMapping1,
 
  229         template<
typename...>
 
  230         typename MappingTemplate1,
 
  231         template<
typename...>
 
  232         typename MappingTemplate2,
 
  233         bool SeparateBlobs = 
false>
 
  236         template<
typename ArrayExtents, 
typename RecordDim>
 
  242     template<
typename Mapping>
 
  249         typename SelectorForMapping1,
 
  250         template<
typename...>
 
  251         typename MappingTemplate1,
 
  252         template<
typename...>
 
  253         typename MappingTemplate2,
 
  255     inline constexpr 
bool 
  256         isSplit<Split<ArrayExtents, RecordDim, SelectorForMapping1, MappingTemplate1, MappingTemplate2, SeparateBlobs>>
 
#define LLAMA_FN_HOST_ACC_INLINE
 
typename PartitionFoldOpImpl< Acc, TagList >::type PartitionFoldOp
 
auto partitionRecordDim(Record< Fields... >, RecordCoord< FirstCoord, Coords... >)
 
constexpr bool isSelected
 
ArrayExtents(Args...) -> ArrayExtents< typename internal::IndexTypeFromArgs< std::size_t, Args... >::type,(Args{}, dyn)... >
 
typename internal::GetTagsImpl< RecordDim, RecordCoord >::type GetTags
 
typename internal::GetTagImpl< RecordDim, RecordCoord >::type GetTag
Get the tag of the Field at a RecordCoord inside the record dimension tree.
 
typename internal::GetCoordFromTagsImpl< RecordDim, RecordCoord<>, TagsOrTagList... >::type GetCoordFromTags
 
typename internal::GetTypeImpl< RecordDim, RecordCoordOrTags... >::type GetType
 
ArrayIndex< T, rank > Index
 
A type list of Fields which may be used to define a record dimension.
 
TArrayExtents ArrayExtents
 
static constexpr std::size_t blobCount
 
mp_first< RecordDimPartitions > RecordDim1
 
typename ArrayExtents::Index ArrayIndex
 
constexpr Split()=default
 
constexpr auto blobNrAndOffset(ArrayIndex ai, RecordCoord< RecordCoords... >={}) const -> NrAndOffset< size_type >
 
decltype(internal::partitionRecordDim(RecordDim{}, NormalizedSelectorForMapping1{})) RecordDimPartitions
 
MappingTemplate2< ArrayExtents, RecordDim2 > Mapping2
 
TSelectorForMapping1 SelectorForMapping1
 
typename internal::ReplaceTagListsByCoords< RecordDim, SelectorForMapping1 >::type NormalizedSelectorForMapping1
 
constexpr Split(ArrayExtents extents)
 
constexpr Split(Mapping1 mapping1, Mapping2 mapping2)
 
constexpr auto extents() const -> ArrayExtents
 
constexpr auto blobSize([[maybe_unused]] size_type i) const -> size_type
 
MappingTemplate1< ArrayExtents, RecordDim1 > Mapping1
 
mp_second< RecordDimPartitions > RecordDim2
 
constexpr Split(std::tuple< Args1... > mappingArgs1, std::tuple< Args2... > mappingArgs2)
 
static constexpr auto isComputed(RecordCoord< RecordCoords... >) -> bool
 
constexpr auto compute(ArrayIndex ai, RecordCoord< RecordCoords... >, Blobs &blobs) const
 
mp_second< Acc > Part2Before
 
mp_first< Acc > Part1Before
 
mp_second< R > Part2After
 
mp_list< MergedRecordDims< Part1Before, Part1After >, Part2After > type
 
decltype(partitionRecordDim(Part2Before{}, GetCoordFromTags< Part2Before, TagList >{})) R