23 #include "openPMD/Datatype.hpp"
29 #include <type_traits>
33 inline Datatype dtype_from_numpy(pybind11::dtype
const dt)
37 if (dt.char_() == pybind11::dtype(
"b").char_())
38 if constexpr (std::is_signed_v<char>)
40 return Datatype::CHAR;
44 return Datatype::SCHAR;
46 else if (dt.char_() == pybind11::dtype(
"B").char_())
47 if constexpr (std::is_unsigned_v<char>)
49 return Datatype::CHAR;
53 return Datatype::UCHAR;
55 else if (dt.char_() == pybind11::dtype(
"short").char_())
56 return Datatype::SHORT;
57 else if (dt.char_() == pybind11::dtype(
"intc").char_())
59 else if (dt.char_() == pybind11::dtype(
"int_").char_())
60 return Datatype::LONG;
61 else if (dt.char_() == pybind11::dtype(
"longlong").char_())
62 return Datatype::LONGLONG;
63 else if (dt.char_() == pybind11::dtype(
"ushort").char_())
64 return Datatype::USHORT;
65 else if (dt.char_() == pybind11::dtype(
"uintc").char_())
66 return Datatype::UINT;
67 else if (dt.char_() == pybind11::dtype(
"uint").char_())
68 return Datatype::ULONG;
69 else if (dt.char_() == pybind11::dtype(
"ulonglong").char_())
70 return Datatype::ULONGLONG;
71 else if (dt.char_() == pybind11::dtype(
"clongdouble").char_())
72 return Datatype::CLONG_DOUBLE;
73 else if (dt.char_() == pybind11::dtype(
"cdouble").char_())
74 return Datatype::CDOUBLE;
75 else if (dt.char_() == pybind11::dtype(
"csingle").char_())
76 return Datatype::CFLOAT;
77 else if (dt.char_() == pybind11::dtype(
"longdouble").char_())
78 return Datatype::LONG_DOUBLE;
79 else if (dt.char_() == pybind11::dtype(
"double").char_())
80 return Datatype::DOUBLE;
81 else if (dt.char_() == pybind11::dtype(
"single").char_())
82 return Datatype::FLOAT;
83 else if (dt.char_() == pybind11::dtype(
"bool").char_())
84 return Datatype::BOOL;
88 throw std::runtime_error(
89 std::string(
"Datatype '") + dt.char_() +
90 std::string(
"' not known in 'dtype_from_numpy'!"));
105 if (fmt.find(
"?") != std::string::npos)
107 else if (fmt.find(
"b") != std::string::npos)
108 if constexpr (std::is_signed_v<char>)
110 return Datatype::CHAR;
114 return Datatype::SCHAR;
116 else if (fmt.find(
"h") != std::string::npos)
118 else if (fmt.find(
"i") != std::string::npos)
120 else if (fmt.find(
"l") != std::string::npos)
122 else if (fmt.find(
"q") != std::string::npos)
124 else if (fmt.find(
"B") != std::string::npos)
125 if constexpr (std::is_unsigned_v<char>)
127 return Datatype::CHAR;
131 return Datatype::UCHAR;
133 else if (fmt.find(
"H") != std::string::npos)
135 else if (fmt.find(
"I") != std::string::npos)
137 else if (fmt.find(
"L") != std::string::npos)
139 else if (fmt.find(
"Q") != std::string::npos)
140 return DT::ULONGLONG;
141 else if (fmt.find(
"Zf") != std::string::npos)
143 else if (fmt.find(
"Zd") != std::string::npos)
145 else if (fmt.find(
"Zg") != std::string::npos)
146 return DT::CLONG_DOUBLE;
147 else if (fmt.find(
"f") != std::string::npos)
149 else if (fmt.find(
"d") != std::string::npos)
151 else if (fmt.find(
"g") != std::string::npos)
152 return DT::LONG_DOUBLE;
154 throw std::runtime_error(
155 "dtype_from_bufferformat: Unknown "
160 inline pybind11::dtype dtype_to_numpy(
Datatype const dt)
169 if constexpr (std::is_signed_v<char>)
171 return pybind11::dtype(
"b");
175 return pybind11::dtype(
"B");
179 return pybind11::dtype(
"b");
183 return pybind11::dtype(
"B");
191 return pybind11::dtype(
"short");
195 return pybind11::dtype(
"intc");
199 return pybind11::dtype(
"int_");
202 case DT::VEC_LONGLONG:
203 return pybind11::dtype(
"longlong");
207 return pybind11::dtype(
"ushort");
211 return pybind11::dtype(
"uintc");
215 return pybind11::dtype(
"uint");
218 case DT::VEC_ULONGLONG:
219 return pybind11::dtype(
"ulonglong");
223 return pybind11::dtype(
"single");
228 return pybind11::dtype(
"double");
230 case DT::LONG_DOUBLE:
231 case DT::VEC_LONG_DOUBLE:
232 return pybind11::dtype(
"longdouble");
236 return pybind11::dtype(
"csingle");
239 case DT::VEC_CDOUBLE:
240 return pybind11::dtype(
"cdouble");
242 case DT::CLONG_DOUBLE:
243 case DT::VEC_CLONG_DOUBLE:
244 return pybind11::dtype(
"clongdouble");
247 return pybind11::dtype(
"bool");
251 throw std::runtime_error(
252 "dtype_to_numpy: Invalid Datatype '{...}'!");
Public definitions of openPMD-api.
Definition: Date.cpp:29
Datatype dtype_from_bufferformat(std::string const &fmt)
Return openPMD::Datatype from py::buffer_info::format.
Definition: Numpy.hpp:96
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:51