44 #ifndef TPETRA_WITHLOCALACCESS_HPP
45 #define TPETRA_WITHLOCALACCESS_HPP
47 #include "TpetraCore_config.h"
49 #include <type_traits>
75 template<
class GlobalObjectType>
77 using type =
typename GlobalObjectType::device_type::memory_space;
80 static type space (
const GlobalObjectType& ) {
88 #ifndef DOXYGEN_SHOULD_SKIP_THIS
89 template<
class GlobalObjectType,
93 #endif // DOXYGEN_SHOULD_SKIP_THIS
112 template<
class LocalAccessType>
133 template<
class LocalAccessType>
163 template<
class LocalAccessType>
176 template<
class LocalAccessType>
178 nonowning_local_object_type
181 master_local_object_type& master)
201 template<
class LocalAccessType>
203 typename Details::GetNonowningLocalObject<LocalAccessType>::
204 nonowning_local_object_type;
214 template<
class GlobalObjectType>
217 typename Details::DefaultMemorySpace<GlobalObjectType>::type,
218 Details::AccessMode::ReadOnly>
224 template<
class GlobalObjectType>
227 typename Details::DefaultMemorySpace<GlobalObjectType>::type,
228 Details::AccessMode::ReadOnly>
234 template<
class GlobalObjectType>
237 typename Details::DefaultMemorySpace<GlobalObjectType>::type,
238 Details::AccessMode::WriteOnly>
244 template<
class GlobalObjectType>
247 typename Details::DefaultMemorySpace<GlobalObjectType>::type,
248 Details::AccessMode::ReadWrite>
262 template<
class GlobalObjectType,
267 using global_object_type = GlobalObjectType;
268 using memory_space =
typename MemorySpace::memory_space;
294 memory_space space = memory_space (),
320 return {this->
G_, this->
space_, isValid};
325 template<
class NewMemorySpace>
327 on (NewMemorySpace space)
const {
328 return {this->
G_, space, this->
valid_};
344 global_object_type&
G_;
364 typename Details::DefaultMemorySpace<GOT>::type,
365 Details::AccessMode::ReadOnly>
372 Details::LocalAccess<
374 typename Details::DefaultMemorySpace<GOT>::type,
375 Details::AccessMode::ReadOnly>
378 GOT& G_nc =
const_cast<GOT&
> (G);
379 return {G_nc, Details::DefaultMemorySpace<GOT>::space (G_nc),
true};
383 Details::LocalAccess<
385 typename Details::DefaultMemorySpace<GOT>::type,
386 Details::AccessMode::WriteOnly>
389 return {G, Details::DefaultMemorySpace<GOT>::space (G),
true};
393 Details::LocalAccess<
395 typename Details::DefaultMemorySpace<GOT>::type,
396 Details::AccessMode::ReadWrite>
399 return {G, Details::DefaultMemorySpace<GOT>::space (G),
true};
418 template<
class ...>
struct cons;
421 template<
class T,
template <
class ...>
class List>
422 struct cons<T, List<>> {
423 using type = List<T>;
427 template <
class T,
template <
class ...>
class List,
class ...Types>
428 struct cons<T, List<Types...>>
430 typedef List<T, Types...> type;
443 struct tuple_to_function_type { };
445 template<
typename... Ts>
446 struct tuple_to_function_type<std::tuple<Ts...> >
448 using type = std::function<void (Ts...)>;
454 template<
class ... Args>
455 struct ArgsToFunction {};
458 struct ArgsToFunction<> {
459 using arg_list_type = std::tuple<>;
462 using type = std::function<void ()>;
465 template<
class FirstLocalAccessType,
class ... Rest>
466 struct ArgsToFunction<FirstLocalAccessType, Rest...> {
467 using head_arg_type =
468 with_local_access_function_argument_type<FirstLocalAccessType>;
469 using tail_arg_list_type =
470 typename ArgsToFunction<Rest...>::arg_list_type;
471 using arg_list_type =
472 typename cons<head_arg_type, tail_arg_list_type>::type;
475 using type =
typename tuple_to_function_type<arg_list_type>::type;
482 template<
class ... LocalAccessTypes>
484 using current_user_function_type =
485 typename Details::ArgsToFunction<LocalAccessTypes...>::type;
488 withLocalAccess (LocalAccessTypes...,
489 typename Details::ArgsToFunction<LocalAccessTypes...>::type);
497 using current_user_function_type =
498 typename Details::ArgsToFunction<>::type;
501 withLocalAccess (current_user_function_type userFunction)
513 template<
class FirstLocalAccessType,
class ... Rest>
515 using current_user_function_type =
516 typename Details::ArgsToFunction<FirstLocalAccessType, Rest...>::type;
519 withLocalAccess (current_user_function_type userFunction,
520 FirstLocalAccessType first,
566 ([=] (
typename Rest::function_argument_type... args) {
567 userFunction (first_lcl_view, args...);
610 template<
class ... LocalAccessTypes>
613 (
typename Details::ArgsToFunction<LocalAccessTypes...>::type userFunction,
614 LocalAccessTypes... localAccesses)
622 #endif // TPETRA_WITHLOCALACCESS_HPP
Mapping from "master" local object type to the nonowning "local view" type that users see (as argumen...
global_object_type & G_
Reference to the global object whose data the user will access.
LocalAccess< GlobalObjectType, NewMemorySpace, am > on(NewMemorySpace space) const
Declare intent to access this object's local data in a specific (Kokkos) memory space (instance)...
Details::LocalAccess< GlobalObjectType, typename Details::DefaultMemorySpace< GlobalObjectType >::type, Details::AccessMode::WriteOnly > writeOnly(GlobalObjectType &)
Declare that you want to access the given global object's local data in write-only mode...
Declaration of access intent for a global object.
GetMasterLocalObject< LocalAccessType >::master_local_object_type getMasterLocalObject(LocalAccessType LA)
Given a LocalAccess instance (which has a reference to a global object), get an instance of its maste...
Details::LocalAccess< GlobalObjectType, typename Details::DefaultMemorySpace< GlobalObjectType >::type, Details::AccessMode::ReadWrite > readWrite(GlobalObjectType &)
Declare that you want to access the given global object's local data in read-and-write mode...
bool isValid() const
Is access supposed to be valid? (See valid() above.)
GetNonowningLocalObject< LocalAccessType >::nonowning_local_object_type getNonowningLocalObject(LocalAccessType LA, const typename GetMasterLocalObject< LocalAccessType >::master_local_object_type &master)
Given a master local object, get an instance of a nonowning local object.
Implementation of withLocalAccess.
with_local_access_function_argument_type< canonical_this_type > function_argument_type
Type that users see, that's an argument to the function that they give to withLocalAccess.
LocalAccess< GlobalObjectType, MemorySpace, am > valid(const bool isValid) const
Declare at run time whether you actually want to access the object.
void withLocalAccess(typename Details::ArgsToFunction< LocalAccessTypes...>::type userFunction, LocalAccessTypes...localAccesses)
Get access to a Tpetra global object's local data.
memory_space getSpace() const
Memory space instance in which the user will access local data.
LocalAccess(global_object_type &G, memory_space space=memory_space(), const bool isValid=true)
Constructor.
typename Details::GetNonowningLocalObject< LocalAccessType >::nonowning_local_object_type with_local_access_function_argument_type
Type of the local object, that is an argument to the function the user gives to withLocalAccess.
bool valid_
Will I actually need to access this object?
Given a global object, get its default memory space (both the type and the default instance thereof)...
Details::LocalAccess< GlobalObjectType, typename Details::DefaultMemorySpace< GlobalObjectType >::type, Details::AccessMode::ReadOnly > readOnly(GlobalObjectType &)
Declare that you want to access the given global object's local data in read-only mode...
Mapping from LocalAccess to the "master" local object type.
memory_space space_
Memory space instance in which the user will access local data.