Low-Level Abstraction of Memory Access
ChangeType.hpp
Go to the documentation of this file.
1 // Copyright 2022 Bernhard Manfred Gruber
2 // SPDX-License-Identifier: MPL-2.0
3 
4 #pragma once
5 
6 #include "../ProxyRefOpMixin.hpp"
7 #include "Common.hpp"
8 #include "Projection.hpp"
9 
10 namespace llama::mapping
11 {
12  namespace internal
13  {
14  template<typename UserT, typename StoredT>
16  {
17  LLAMA_FN_HOST_ACC_INLINE static auto load(StoredT v) -> UserT
18  {
19  return static_cast<UserT>(v); // we could allow stronger casts here
20  }
21 
22  LLAMA_FN_HOST_ACC_INLINE static auto store(UserT v) -> StoredT
23  {
24  return static_cast<StoredT>(v); // we could allow stronger casts here
25  }
26  };
27 
28  template<typename RecordDim>
30  {
31  template<typename Key>
32  static auto recordDimType()
33  {
34  if constexpr(isRecordCoord<Key>)
35  return mp_identity<GetType<RecordDim, Key>>{};
36  else
37  return mp_identity<Key>{};
38  }
39 
40  template<typename Pair, typename Key = mp_first<Pair>, typename StoredT = mp_second<Pair>>
41  using fn = mp_list<Key, ChangeTypeProjection<typename decltype(recordDimType<Key>())::type, StoredT>>;
42  };
43 
44  template<typename RecordDim, typename ReplacementMap>
45  using MakeProjectionMap = mp_transform<MakeProjectionPair<RecordDim>::template fn, ReplacementMap>;
46  } // namespace internal
47 
53  template<
54  typename ArrayExtents,
55  typename RecordDim,
56  template<typename, typename>
57  typename InnerMapping,
58  typename ReplacementMap>
59  struct ChangeType
60  : Projection<ArrayExtents, RecordDim, InnerMapping, internal::MakeProjectionMap<RecordDim, ReplacementMap>>
61  {
62  private:
63  using Base = Projection<
65  RecordDim,
66  InnerMapping,
68 
69  public:
70  using Base::Base;
71  };
72 
76  template<template<typename, typename> typename InnerMapping, typename ReplacementMap>
78  {
79  template<typename ArrayExtents, typename RecordDim>
81  };
82 
84  template<typename Mapping>
85  inline constexpr bool isChangeType = false;
86 
88  template<
89  typename TArrayExtents,
90  typename TRecordDim,
91  template<typename, typename>
92  typename InnerMapping,
93  typename ReplacementMap>
94  inline constexpr bool isChangeType<ChangeType<TArrayExtents, TRecordDim, InnerMapping, ReplacementMap>> = true;
95 } // namespace llama::mapping
#define LLAMA_EXPORT
Definition: macros.hpp:192
#define LLAMA_FN_HOST_ACC_INLINE
Definition: macros.hpp:96
mp_transform< MakeProjectionPair< RecordDim >::template fn, ReplacementMap > MakeProjectionMap
Definition: ChangeType.hpp:45
constexpr bool isChangeType
Definition: ChangeType.hpp:85
ArrayExtents(Args...) -> ArrayExtents< typename internal::IndexTypeFromArgs< std::size_t, Args... >::type,(Args{}, dyn)... >
static auto store(UserT v) -> StoredT
Definition: ChangeType.hpp:22
static auto load(StoredT v) -> UserT
Definition: ChangeType.hpp:17
mp_list< Key, ChangeTypeProjection< typename decltype(recordDimType< Key >())::type, StoredT > > fn
Definition: ChangeType.hpp:41