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,
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>
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)
Declaration of access intent for a global object.
bool valid_
Will I actually need to access this object?
LocalAccess< GlobalObjectType, NewMemorySpace, am > on(NewMemorySpace space) const
Declare intent to access this object's local data in a specific (Kokkos) memory space (instance).
global_object_type & G_
Reference to the global object whose data the user will access.
bool isValid() const
Is access supposed to be valid? (See valid() above.)
LocalAccess(global_object_type &G, memory_space space=memory_space(), const bool isValid=true)
Constructor.
memory_space space_
Memory space instance in which the user will access local data.
memory_space getSpace() const
Memory space instance in which the user will access local data.
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.
Implementation details of Tpetra.
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...
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.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
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,...
void withLocalAccess(typename Details::ArgsToFunction< LocalAccessTypes... >::type userFunction, LocalAccessTypes... localAccesses)
Get access to a Tpetra global object's local data.
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,...
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.
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,...
Given a global object, get its default memory space (both the type and the default instance thereof).
Mapping from LocalAccess to the "master" local object type.
Mapping from "master" local object type to the nonowning "local view" type that users see (as argumen...
Implementation of withLocalAccess.