Fenix @develop
 
Loading...
Searching...
No Matches
status.hpp
1#ifndef FENIX_MPIXX_STATUS_HPP
2#define FENIX_MPIXX_STATUS_HPP
3
4#include <mpi.h>
5#include <tuple>
6
7namespace fenix::mpixx {
8class Status {
9 public:
10 int return_value = MPI_SUCCESS;
11 MPI_Status status;
12
13 Status() = default;
14 Status(int r) : return_value(r) {}
15 auto operator=(int r) {
16 return_value = r;
17 return *this;
18 }
19
20 operator bool() const { return return_value == MPI_SUCCESS; }
21
22 operator int() const { return return_value; }
23 bool operator==(int r) const { return return_value == r; }
24
25 operator MPI_Status() const { return status; }
26 operator MPI_Status*() { return &status; }
27
28 // to support structured unbinding
29 template <size_t I>
30 auto&& get() && {
31 if constexpr (I == 0) return std::move(return_value);
32 if constexpr (I == 1) return std::move(status);
33 }
34};
35} // namespace fenix::mpixx
36
37// Supporting structured unbinding for Status
38namespace std {
39template <>
40struct tuple_size<fenix::mpixx::Status> : std::integral_constant<size_t, 2> {};
41
42template <>
43struct tuple_element<0, fenix::mpixx::Status> {
44 using type = int;
45};
46template <>
47struct tuple_element<1, fenix::mpixx::Status> {
48 using type = MPI_Status;
49};
50} // namespace std
51
52#endif // FENIX_MPIXX_STATUS_HPP
Definition status.hpp:8