4 #ifndef _OPENCARP_MPI_UTILS_H
5 #define _OPENCARP_MPI_UTILS_H
10 #include <type_traits>
21 template<
typename T>
inline
24 using value_t = std::remove_cv_t<T>;
26 if constexpr (std::is_same_v<value_t, char>) {
30 else if constexpr (std::is_same_v<value_t, std::int8_t>) {
35 else if constexpr (std::is_same_v<value_t, std::uint8_t>) {
40 else if constexpr (std::is_same_v<value_t, std::int16_t>) {
45 else if constexpr (std::is_same_v<value_t, std::uint16_t>) {
50 else if constexpr (std::is_same_v<value_t, std::int32_t>) {
55 else if constexpr (std::is_same_v<value_t, std::uint32_t>) {
60 else if constexpr (std::is_same_v<value_t, std::int64_t>) {
65 else if constexpr (std::is_same_v<value_t, std::uint64_t>) {
69 else if constexpr (std::is_same_v<value_t, signed char>) {
70 return MPI_SIGNED_CHAR;
72 else if constexpr (std::is_same_v<value_t, unsigned char>) {
73 return MPI_UNSIGNED_CHAR;
75 else if constexpr (std::is_same_v<value_t, short>) {
78 else if constexpr (std::is_same_v<value_t, unsigned short>) {
79 return MPI_UNSIGNED_SHORT;
81 else if constexpr (std::is_same_v<value_t, int>) {
84 else if constexpr (std::is_same_v<value_t, unsigned int>) {
87 else if constexpr (std::is_same_v<value_t, long>) {
90 else if constexpr (std::is_same_v<value_t, unsigned long>) {
91 return MPI_UNSIGNED_LONG;
93 else if constexpr (std::is_same_v<value_t, long long>) {
96 else if constexpr (std::is_same_v<value_t, unsigned long long>) {
97 return MPI_UNSIGNED_LONG_LONG;
99 else if constexpr (std::is_same_v<value_t, float>) {
102 else if constexpr (std::is_same_v<value_t, double>) {
105 else if constexpr (std::is_same_v<value_t, long double>) {
106 return MPI_LONG_DOUBLE;
110 "Unsupported MPI datatype");
114 template<
typename T>
inline
117 static_assert(std::is_integral_v<T>,
"printable_int requires an integral type");
119 if constexpr (std::is_signed_v<T>) {
120 return static_cast<std::intmax_t
>(value);
123 return static_cast<std::intmax_t
>(value);
127 template<
typename T>
inline
130 static_assert(std::is_integral_v<T>,
"printable_uint requires an integral type");
131 return static_cast<std::uintmax_t
>(value);
constexpr T max(T a, T b)
std::intmax_t printable_int(T value)
MPI_Datatype mpi_datatype()
std::uintmax_t printable_uint(T value)