19 #ifndef _OPENCARP_MPI_UTILS_H
20 #define _OPENCARP_MPI_UTILS_H
25 #include <type_traits>
36 template<
typename T>
inline
39 using value_t = std::remove_cv_t<T>;
41 if constexpr (std::is_same_v<value_t, char>) {
45 else if constexpr (std::is_same_v<value_t, std::int8_t>) {
50 else if constexpr (std::is_same_v<value_t, std::uint8_t>) {
55 else if constexpr (std::is_same_v<value_t, std::int16_t>) {
60 else if constexpr (std::is_same_v<value_t, std::uint16_t>) {
65 else if constexpr (std::is_same_v<value_t, std::int32_t>) {
70 else if constexpr (std::is_same_v<value_t, std::uint32_t>) {
75 else if constexpr (std::is_same_v<value_t, std::int64_t>) {
80 else if constexpr (std::is_same_v<value_t, std::uint64_t>) {
84 else if constexpr (std::is_same_v<value_t, signed char>) {
85 return MPI_SIGNED_CHAR;
87 else if constexpr (std::is_same_v<value_t, unsigned char>) {
88 return MPI_UNSIGNED_CHAR;
90 else if constexpr (std::is_same_v<value_t, short>) {
93 else if constexpr (std::is_same_v<value_t, unsigned short>) {
94 return MPI_UNSIGNED_SHORT;
96 else if constexpr (std::is_same_v<value_t, int>) {
99 else if constexpr (std::is_same_v<value_t, unsigned int>) {
102 else if constexpr (std::is_same_v<value_t, long>) {
105 else if constexpr (std::is_same_v<value_t, unsigned long>) {
106 return MPI_UNSIGNED_LONG;
108 else if constexpr (std::is_same_v<value_t, long long>) {
109 return MPI_LONG_LONG;
111 else if constexpr (std::is_same_v<value_t, unsigned long long>) {
112 return MPI_UNSIGNED_LONG_LONG;
114 else if constexpr (std::is_same_v<value_t, float>) {
117 else if constexpr (std::is_same_v<value_t, double>) {
120 else if constexpr (std::is_same_v<value_t, long double>) {
121 return MPI_LONG_DOUBLE;
125 "Unsupported MPI datatype");
129 template<
typename T>
inline
132 static_assert(std::is_integral_v<T>,
"printable_int requires an integral type");
134 if constexpr (std::is_signed_v<T>) {
135 return static_cast<std::intmax_t
>(value);
138 return static_cast<std::intmax_t
>(value);
142 template<
typename T>
inline
145 static_assert(std::is_integral_v<T>,
"printable_uint requires an integral type");
146 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)