25#include "kamping/named_parameter_filtering.hpp"
28#include "kamping/named_parameters_detail/status_parameters.hpp"
47template <
typename Buffer>
48inline constexpr bool is_extractable = Buffer::is_owning&& Buffer::is_out_buffer;
66template <
typename...
Args>
70 static constexpr bool is_empty = (
sizeof...(Args) == 0);
78 "We cannot have a recv and a send_recv buffer contained in the result object."
94 typename T = std::tuple<
Args...>,
95 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::status, T>(),
bool> =
true>
97 return internal::select_parameter_type_in_tuple<internal::ParameterType::status>(_data).underlying();
108 typename T = std::tuple<
Args...>,
109 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::status, T>(),
bool> =
true>
111 return internal::select_parameter_type_in_tuple<internal::ParameterType::status>(_data).underlying();
122 typename T = std::tuple<
Args...>,
123 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::status, T>(),
bool> =
true>
125 return internal::select_parameter_type_in_tuple<internal::ParameterType::status>(_data).extract();
136 typename T = std::tuple<
Args...>,
137 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_buf, T>(),
bool> =
true>
139 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_buf>(_data).underlying();
150 typename T = std::tuple<
Args...>,
151 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_buf, T>(),
bool> =
true>
153 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_buf>(_data).underlying();
164 typename T = std::tuple<
Args...>,
165 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_buf, T>(),
bool> =
true>
167 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_buf>(_data).underlying();
178 typename T = std::tuple<
Args...>,
179 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_buf, T>(),
bool> =
true>
181 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_buf>(_data).extract();
192 typename T = std::tuple<
Args...>,
193 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_buf, T>(),
bool> =
196 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_buf>(_data).underlying();
207 typename T = std::tuple<
Args...>,
208 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_buf, T>(),
bool> =
211 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_buf>(_data).underlying();
222 typename T = std::tuple<
Args...>,
223 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_buf, T>(),
bool> =
226 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_buf>(_data).extract();
236 typename T = std::tuple<
Args...>,
237 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_counts, T>(),
bool> =
true>
239 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_counts>(_data).underlying();
249 typename T = std::tuple<
Args...>,
250 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_counts, T>(),
bool> =
true>
252 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_counts>(_data).underlying();
262 typename T = std::tuple<
Args...>,
263 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_counts, T>(),
bool> =
true>
265 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_counts>(_data).extract();
275 typename T = std::tuple<
Args...>,
276 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_count, T>(),
bool> =
true>
278 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_count>(_data).underlying();
288 typename T = std::tuple<
Args...>,
289 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_count, T>(),
bool> =
true>
291 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_count>(_data).underlying();
301 typename T = std::tuple<
Args...>,
302 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_count, T>(),
bool> =
true>
304 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_count>(_data).extract();
314 typename T = std::tuple<
Args...>,
315 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_displs, T>(),
bool> =
true>
317 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_displs>(_data).underlying();
327 typename T = std::tuple<
Args...>,
328 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_displs, T>(),
bool> =
true>
330 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_displs>(_data).underlying();
340 typename T = std::tuple<
Args...>,
341 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_displs, T>(),
bool> =
true>
343 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_displs>(_data).extract();
353 typename T = std::tuple<
Args...>,
354 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_counts, T>(),
bool> =
true>
356 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_counts>(_data).underlying();
366 typename T = std::tuple<
Args...>,
367 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_counts, T>(),
bool> =
true>
369 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_counts>(_data).underlying();
379 typename T = std::tuple<
Args...>,
380 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_counts, T>(),
bool> =
true>
382 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_counts>(_data).extract();
392 typename T = std::tuple<
Args...>,
393 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_count, T>(),
bool> =
true>
395 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_count>(_data).underlying();
405 typename T = std::tuple<
Args...>,
406 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_count, T>(),
bool> =
true>
408 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_count>(_data).underlying();
418 typename T = std::tuple<
Args...>,
419 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_count, T>(),
bool> =
true>
421 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_count>(_data).extract();
431 typename T = std::tuple<
Args...>,
432 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_displs, T>(),
bool> =
true>
434 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_displs>(_data).underlying();
444 typename T = std::tuple<
Args...>,
445 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_displs, T>(),
bool> =
true>
447 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_displs>(_data).underlying();
457 typename T = std::tuple<
Args...>,
458 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_displs, T>(),
bool> =
true>
460 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_displs>(_data).extract();
470 typename T = std::tuple<
Args...>,
471 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_count, T>(),
bool> =
474 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_count>(_data).underlying();
484 typename T = std::tuple<
Args...>,
485 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_count, T>(),
bool> =
488 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_count>(_data).underlying();
498 typename T = std::tuple<
Args...>,
499 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_count, T>(),
bool> =
502 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_count>(_data).extract();
512 typename T = std::tuple<
Args...>,
513 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_type, T>(),
bool> =
true>
515 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_type>(_data).underlying();
525 typename T = std::tuple<
Args...>,
526 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_type, T>(),
bool> =
true>
528 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_type>(_data).underlying();
538 typename T = std::tuple<
Args...>,
539 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_type, T>(),
bool> =
true>
541 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_type>(_data).extract();
551 typename T = std::tuple<
Args...>,
552 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_type, T>(),
bool> =
true>
554 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_type>(_data).underlying();
564 typename T = std::tuple<
Args...>,
565 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_type, T>(),
bool> =
true>
567 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_type>(_data).underlying();
577 typename T = std::tuple<
Args...>,
578 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::recv_type, T>(),
bool> =
true>
580 return internal::select_parameter_type_in_tuple<internal::ParameterType::recv_type>(_data).extract();
590 typename T = std::tuple<
Args...>,
591 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_type, T>(),
bool> =
594 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_type>(_data).underlying();
604 typename T = std::tuple<
Args...>,
605 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_type, T>(),
bool> =
608 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_type>(_data).underlying();
618 typename T = std::tuple<
Args...>,
619 std::enable_if_t<internal::has_parameter_type_in_tuple<internal::ParameterType::send_recv_type, T>(),
bool> =
622 return internal::select_parameter_type_in_tuple<internal::ParameterType::send_recv_type>(_data).extract();
630 template <std::
size_t i>
632 return std::get<i>(_data).underlying();
640 template <std::
size_t i>
642 return std::get<i>(_data).underlying();
646 std::tuple<
Args...> _data;
654template <
typename...
Args>
663template <
typename...
Args>
678template <
typename... Args>
679struct tuple_size<kamping::MPIResult<Args...>> {
680 static constexpr size_t value =
sizeof...(Args);
688template <
size_t index,
typename... Args>
689struct tuple_element<index, kamping::MPIResult<Args...>> {
704template <
typename MPIResultType,
typename RequestDataBuffer>
715 static constexpr bool owns_request = internal::has_extract_v<RequestDataBuffer>;
734 return _request.extract();
739 return std::pair(_request.extract(), std::move(
result));
745 return extract_result();
770 typename std::enable_if<NonBlockingResulType_::owns_request, bool>::type =
true>
774 "Only status parameters are allowed."
776 kassert_not_extracted(
"The result of this request has already been extracted.");
777 constexpr bool return_status = internal::is_extractable<StatusParamObjectType>;
781 return std::make_pair(extract_result(), std::move(
status_return));
783 _request.underlying().wait(std::move(
status));
784 return extract_result();
787 return _request.underlying().wait(std::move(
status));
809 typename std::enable_if<NonBlockingResulType_::owns_request, bool>::type =
true>
813 "Only status parameters are allowed."
815 kassert_not_extracted(
"The result of this request has already been extracted.");
816 constexpr bool return_status = internal::is_extractable<StatusParamObjectType>;
821 return std::optional{std::pair{extract_result(), std::move(*
status_return)}};
826 if (_request.underlying().test(std::move(
status))) {
827 return std::optional{extract_result()};
829 return std::optional<MPIResultType>{};
833 return _request.underlying().test(std::move(
status));
839 kassert_not_extracted(
"The result of this request has already been extracted.");
845 return _request.underlying().request_ptr();
851 kassert_not_extracted(
"The result of this request has already been extracted.");
852 auto extracted = std::move(*_mpi_result);
857 void set_extracted() {
858#if KASSERT_ENABLED(KAMPING_ASSERTION_LEVEL_NORMAL)
866 void kassert_not_extracted(std::string
const message [[maybe_unused]])
const {
867#if KASSERT_ENABLED(KAMPING_ASSERTION_LEVEL_NORMAL)
871 std::unique_ptr<MPIResultType> _mpi_result;
872 RequestDataBuffer _request;
873#if KASSERT_ENABLED(KAMPING_ASSERTION_LEVEL_NORMAL)
874 bool is_extracted =
false;
886template <
typename CallerProv
idedOwningOutBuffers>
902template <
typename CallerProv
idedOwningOutBuffers>
906 return std::tuple_element_t<0, CallerProvidedOwningOutBuffers>::value == ParameterType::send_buf;
919 constexpr bool has_recv_buffer = internal::has_parameter_type<internal::ParameterType::recv_buf,
Buffers...>();
920 constexpr bool has_send_recv_buffer =
921 internal::has_parameter_type<internal::ParameterType::send_recv_buf,
Buffers...>();
922 static_assert(has_recv_buffer ^ has_send_recv_buffer,
"either a recv or a send_recv buffer must be present");
923 if constexpr (has_recv_buffer) {
924 return ParameterType::recv_buf;
926 return ParameterType::send_recv_buf;
951 template <
typename BufferType>
954 if constexpr (parameter_types_to_ignore_for_result_object::contains<ptype_entry>) {
957 return !BufferType::is_owning
958 || !BufferType::is_out_buffer;
964template <
typename,
typename =
void>
983 template <
typename BufferType>
985 if (PredicateForResultObject::discard<BufferType>()) {
991 if constexpr (ptype_entry::parameter_type == internal::ParameterType::recv_buf || ptype_entry::parameter_type == internal::ParameterType::send_recv_buf) {
1008 constexpr bool has_recv_buffer = internal::has_parameter_type<internal::ParameterType::recv_buf,
Buffers...>();
1009 constexpr bool has_send_recv_buffer =
1010 internal::has_parameter_type<internal::ParameterType::send_recv_buf,
Buffers...>();
1011 return has_recv_buffer || has_send_recv_buffer;
1017template <ParameterType ptype,
typename Tuple>
1060 std::tuple_size_v<CallerProvidedOwningOutParametersWithoutSerializationBuffers>;
1062 auto&
send_buffer = internal::select_parameter_type<ParameterType::send_buf>(
buffers...);
1122 auto&&
request = internal::select_parameter_type<internal::ParameterType::request>(
args...);
1129 return std::make_unique<decltype(result)>(std::move(
result));
STL-compatible allocator for requesting memory using the builtin MPI allocator.
Definition allocator.hpp:32
MPIResult contains the result of a MPI call wrapped by KaMPIng.
Definition result.hpp:67
auto const & get_recv_count() const
Gets the recv_count from the MPIResult object.
Definition result.hpp:290
auto extract_recv_buffer()
Extracts the recv_buffer from the MPIResult object.
Definition result.hpp:180
auto & get_send_type()
Gets the send_type from the MPIResult object.
Definition result.hpp:514
auto const & get_recv_type() const
Gets the recv_type from the MPIResult object.
Definition result.hpp:566
auto & get_send_recv_type()
Gets the send_recv_type from the MPIResult object.
Definition result.hpp:593
auto & get_status()
Get the kamping::Status from the MPIResult object.
Definition result.hpp:96
auto & get_recv_buffer()
Get the recv_buffer from the MPIResult object.
Definition result.hpp:138
auto const & get_recv_displs() const
Gets the recv_displs from the MPIResult object.
Definition result.hpp:329
auto extract_send_counts()
Extracts the send_counts from the MPIResult object.
Definition result.hpp:381
auto const & get_status() const
Get the kamping::Status from the MPIResult object.
Definition result.hpp:110
auto extract_recv_counts()
Extracts the recv_counts from the MPIResult object.
Definition result.hpp:264
auto extract_recv_count()
Extracts the recv_count from the MPIResult object.
Definition result.hpp:303
auto const & get_send_type() const
Gets the send_type from the MPIResult object.
Definition result.hpp:527
auto extract_send_count()
Extracts the send_count from the MPIResult object.
Definition result.hpp:420
auto & get_send_count()
Gets the send_count from the MPIResult object.
Definition result.hpp:394
auto & get_recv_counts()
Get the recv_counts from the MPIResult object.
Definition result.hpp:238
auto extract_recv_displs()
Extracts the recv_displs from the MPIResult object.
Definition result.hpp:342
auto const & get_send_counts() const
Gets the send_counts from the MPIResult object.
Definition result.hpp:368
auto & get_recv_displs()
Gets the recv_displs from the MPIResult object.
Definition result.hpp:316
auto & get_send_displs()
Gets the send_displs from the MPIResult object.
Definition result.hpp:433
auto const & get() const
Get the underlying data from the i-th buffer in the result object. This method is part of the structu...
Definition result.hpp:641
auto & get_recv_count()
Gets the recv_count from the MPIResult object.
Definition result.hpp:277
auto const & get_recv_buffer() const
Get the recv_buffer from the MPIResult object.
Definition result.hpp:152
static constexpr bool has_send_recv_buffer
true, if the result encapsulates a send_recv_buf.
Definition result.hpp:74
auto extract_send_recv_type()
Extracts the send_recv_type from the MPIResult object.
Definition result.hpp:621
auto extract_send_recv_count()
Extracts the send_recv_count from the MPIResult object.
Definition result.hpp:501
auto const & get_send_recv_count() const
Gets the send_recv_count from the MPIResult object.
Definition result.hpp:487
auto extract_recv_type()
Extracts the recv_type from the MPIResult object.
Definition result.hpp:579
auto & get_send_counts()
Gets the send_counts from the MPIResult object.
Definition result.hpp:355
auto const & get_send_buffer() const
Get the send_buffer from the MPIResult object.
Definition result.hpp:166
auto & get_recv_type()
Gets the recv_type from the MPIResult object.
Definition result.hpp:553
auto extract_send_type()
Extracts the send_type from the MPIResult object.
Definition result.hpp:540
auto extract_send_displs()
Extracts the send_displs from the MPIResult object.
Definition result.hpp:459
auto const & get_recv_counts() const
Get the recv_counts from the MPIResult object.
Definition result.hpp:251
auto extract_status()
Extracts the kamping::Status from the MPIResult object.
Definition result.hpp:124
auto & get_send_recv_count()
Gets the send_recv_count from the MPIResult object.
Definition result.hpp:473
auto const & get_send_displs() const
Gets the send_displs from the MPIResult object.
Definition result.hpp:446
static constexpr bool is_empty
true, if the result does not encapsulate any data.
Definition result.hpp:70
auto & get()
Get the underlying data from the i-th buffer in the result object. This method is part of the structu...
Definition result.hpp:631
auto const & get_send_recv_type() const
Gets the send_recv_type from the MPIResult object.
Definition result.hpp:607
auto const & get_send_count() const
Gets the send_count from the MPIResult object.
Definition result.hpp:407
MPIResult(std::tuple< Args... > &&data)
Constructor for MPIResult.
Definition result.hpp:84
static constexpr bool has_recv_buffer
true, if the result encapsulates a recv_buf.
Definition result.hpp:72
NonBlockingResult contains the result of a non-blocking MPI call wrapped by KaMPIng....
Definition result.hpp:705
NonBlockingResult(std::unique_ptr< MPIResultType > result, RequestDataBuffer request)
Constructor for NonBlockingResult.
Definition result.hpp:710
auto test(StatusParamObjectType status=kamping::status(ignore<>))
Tests the underlying Request for completion by calling Request::test() and returns a value convertibl...
Definition result.hpp:810
auto wait(StatusParamObjectType status=kamping::status(ignore<>))
Waits for the underlying Request to complete by calling Request::wait() and upon completion returns:
Definition result.hpp:771
static constexpr bool owns_request
true if the result object owns the underlying kamping::Request.
Definition result.hpp:715
MPIResultType & get_result()
Provides access to the underlying result object.
Definition result.hpp:838
MPI_Request * get_request_ptr()
Returns a pointer to the underlying request.
Definition result.hpp:844
auto extract()
Extracts the components of this results, leaving the user responsible.
Definition result.hpp:731
constexpr int normal
Default assertion level. This level is used if no assertion level is specified.
Definition assertion_levels.hpp:19
auto status(internal::ignore_t< void >)
pass MPI_STATUS_IGNORE to the underlying MPI call.
Definition status_parameters.hpp:52
auto request()
Internally allocate a request object and return it to the user.
Definition named_parameters.hpp:1122
auto request(Request &request)
Passes a request handle to the underlying MPI call.
Definition named_parameters.hpp:1095
ParameterType
Each input parameter to one of the MPI calls wrapped by KaMPIng needs to has one of the following tag...
Definition named_parameter_types.hpp:33
constexpr bool has_parameter_type()
Checks if parameter with requested parameter type exists.
Definition named_parameter_selection.hpp:186
@ status
Tag used to represent the status in a MPI call.
Macros for generating concept-like type traits to check for member functions of objects.
#define KAMPING_MAKE_HAS_MEMBER(Member)
Macro for generating has_member_xxx and has_member_xxx_v templates. They return true if the type give...
Definition has_member.hpp:91
Template magic to check named parameters passed to wrappers at compile time.
Template magic to implement named parameters in cpp.
File containing the parameter types used by the KaMPIng library.
Internal namespace marking the code that is not user-facing.
Definition collectives_helpers.hpp:20
constexpr bool is_extractable
Helper for implementing the extract_* functions in MPIResult. Is true if the passed buffer type owns ...
Definition result.hpp:48
constexpr bool return_recv_or_send_recv_buffer_only()
Determines whether only the recv (send_recv) buffer or multiple different buffers will be returned.
Definition result.hpp:887
constexpr bool has_extract_v
has_extract_v is true iff type T has a member function extract().
Definition result.hpp:40
constexpr bool has_data_buffer_type_member
Helper to check if a type T has a member type T::DataBufferType.
Definition result.hpp:965
constexpr bool return_send_buf_out_only()
Determines whether only the send buffer should be returned. This may happen if ownership of the send ...
Definition result.hpp:903
auto make_nonblocking_result(Args... args)
Factory for creating a kamping::NonBlockingResult.
Definition result.hpp:1121
auto make_mpi_result(Buffers &&... buffers)
Construct result object for a wrapped MPI call. Four different cases are handled: a) The recv_buffer ...
Definition result.hpp:1052
constexpr bool has_recv_or_send_recv_buf()
Returns True iff only a recv or send_recv buffer is present. Communicator::ibarrier()).
Definition result.hpp:1007
constexpr ParameterType determine_recv_buffer_type()
Checks whether a buffer with parameter type recv_buf or a buffer with type send_recv_buf is present a...
Definition result.hpp:918
constexpr bool is_mpi_result_v
Trait for checking whether a type is an MPIResult.
Definition result.hpp:651
constexpr bool is_result_empty_v
Primary template for result trait indicates whether the result object is empty.
Definition result.hpp:659
Predicate to check whether a buffer provided to make_mpi_result() shall be discard or returned in the...
Definition result.hpp:973
static constexpr bool discard()
Discard function to check whether a buffer provided to make_mpi_result() shall be discard or returned...
Definition result.hpp:984
Base template used to filter a list of types and only keep those whose types meet specified criteria....
Definition named_parameter_filtering.hpp:46
Predicate to check whether a buffer provided to make_mpi_result() shall be discard or returned in the...
Definition result.hpp:944
static constexpr bool discard()
Discard function to check whether a buffer provided to make_mpi_result() shall be discard or returned...
Definition result.hpp:952
Template class to prepend the ParameterTypeEntry<ParameterType::ptype> type to a given std::tuple.
Definition result.hpp:1018
typename PrependType< std::integral_constant< internal::ParameterType, ptype >, Tuple >:: type type
Concatenated tuple, i.e. type = std::tuple<TypeToPrepend, (Type contained in Tuple)....
Definition result.hpp:1019
Use this type if one of the template parameters of MPIResult is not used for a specific wrapped MPI c...
Definition result.hpp:43
Helper type for representing a type list.
Definition parameter_objects.hpp:326
std::remove_reference_t< decltype(declval< kamping::MPIResult< Args... > >().template get< index >())> type
Type of the underlying data of the i-th data buffer in the result object.
Definition result.hpp:690