@@ -173,38 +173,52 @@ namespace gridtools {
173173 auto const_host_view () const { return const_target_view (); }
174174 };
175175
176- template <class Traits , class T , class Info , class Kind , bool IsHostRefrenceable>
177- class data_store <Traits, T const , Info, Kind, true , IsHostRefrenceable>
178- : public base<Traits, T const , Info, Kind> {
179-
180- template <class >
181- struct is_host_refrenceable : std::bool_constant<IsHostRefrenceable> {};
182-
183- template <class Initializer , std::enable_if_t <!is_host_refrenceable<Initializer>::value, int > = 0 >
184- void init (Initializer const &initializer) {
185- auto host_ptr = std::make_unique<T[]>(this ->info ().length ());
186- initializer (host_ptr.get (), typename data_store::layout_t (), this ->info ());
187- traits::update_target<Traits>(this ->raw_target_ptr (), host_ptr.get (), this ->info ().length ());
188- }
176+ template <class Traits , class T , class Info , class Kind >
177+ class data_store <Traits, T const , Info, Kind, true , false > : public base<Traits, T const , Info, Kind> {
178+ std::unique_ptr<T[]> m_host_ptr;
189179
190- template <class Initializer , std::enable_if_t <is_host_refrenceable<Initializer>::value, int > = 0 >
191- void init (Initializer const &initializer) {
192- initializer (this ->raw_target_ptr (), typename data_store::layout_t (), this ->info ());
180+ public:
181+ template <class Halos >
182+ data_store (std::string, Info, Halos const &, uninitialized const &) = delete ;
183+
184+ template <class Initializer , class Halos >
185+ data_store (std::string name, Info info, Halos const &halos, Initializer const &initializer)
186+ : data_store::base(std::move(name), std::move(info), halos),
187+ m_host_ptr (std::make_unique<T[]>(this ->info ().length())) {
188+ initializer (m_host_ptr.get (), typename data_store::layout_t (), this ->info ());
189+ traits::update_target<Traits>(this ->raw_target_ptr (), m_host_ptr.get (), this ->info ().length ());
193190 }
194191
192+ T const *get_target_ptr () const { return this ->raw_target_ptr (); }
193+ T const *get_const_target_ptr () const { return this ->raw_target_ptr (); }
194+ auto target_view () const { return traits::make_target_view<Traits>(get_target_ptr (), this ->info ()); }
195+ auto const_target_view () const { return target_view (); }
196+
197+ T const *get_host_ptr () const { return m_host_ptr.get (); }
198+ T const *get_const_host_ptr () const { return get_host_ptr (); }
199+ auto host_view () const { return make_host_view (get_host_ptr (), this ->info ()); }
200+ auto const_host_view () const { return host_view (); }
201+ };
202+
203+ template <class Traits , class T , class Info , class Kind >
204+ class data_store <Traits, T const , Info, Kind, true , true > : public base<Traits, T const , Info, Kind> {
195205 public:
196206 template <class Halos >
197207 data_store (std::string, Info, Halos const &, uninitialized const &) = delete ;
198208
199209 template <class Initializer , class Halos >
200210 data_store (std::string name, Info info, Halos const &halos, Initializer const &initializer)
201211 : base<Traits, T const , Info, Kind>(std::move(name), std::move(info), halos) {
202- init ( initializer);
212+ initializer ( this -> raw_target_ptr (), typename data_store::layout_t (), this -> info () );
203213 }
204214 T const *get_target_ptr () const { return this ->raw_target_ptr (); }
215+ T const *get_const_target_ptr () const { return get_target_ptr (); }
205216 auto target_view () const { return traits::make_target_view<Traits>(get_target_ptr (), this ->info ()); }
206- auto get_const_target_ptr () const { return get_target_ptr (); }
207217 auto const_target_view () const { return target_view (); }
218+ T const *get_host_ptr () { return get_target_ptr (); }
219+ T const *get_const_host_ptr () { return get_target_ptr (); }
220+ auto host_view () const { return target_view (); }
221+ auto const_host_view () const { return target_view (); }
208222 };
209223
210224 template <class >
0 commit comments