23 #include "openPMD/auxiliary/Variant.hpp"
24 #include "openPMD/Datatype.hpp"
33 #include <type_traits>
53 short, int, long, long long,
54 unsigned short, unsigned int, unsigned long, unsigned long long,
55 float, double, long double,
56 std::complex< float >, std::complex< double >, std::complex< long double >,
62 std::vector< long long >,
63 std::vector< unsigned char >,
64 std::vector< unsigned short >,
65 std::vector< unsigned int >,
66 std::vector< unsigned long >,
67 std::vector< unsigned long long >,
69 std::vector< double >,
70 std::vector< long double >,
71 std::vector< std::complex< float > >,
72 std::vector< std::complex< double > >,
73 std::vector< std::complex< long double > >,
74 std::vector< std::string >,
75 std::array< double, 7 >,
91 template<
typename U >
95 template< typename T, typename U, bool isConvertible = std::is_convertible<T, U>::value >
98 template<
typename T,
typename U >
103 throw std::runtime_error(
"getCast: no cast possible.");
107 template<
typename T,
typename U >
110 U operator()(
T * pv )
112 return static_cast< U
>( *pv );
116 template<
typename T,
typename U >
117 struct DoConvert<std::vector< T >, std::vector< U >, false>
119 static constexpr
bool convertible = std::is_convertible<T, U>::value;
121 template<
typename UU = U >
122 auto operator()( std::vector< T >
const * pv )
123 ->
typename std::enable_if< convertible, std::vector< UU > >::type
126 u.reserve( pv->size() );
127 std::copy( pv->begin(), pv->end(), std::back_inserter(u) );
131 template<
typename UU = U >
132 auto operator()( std::vector< T >
const * )
133 ->
typename std::enable_if< !convertible, std::vector< UU > >::type
135 throw std::runtime_error(
"getCast: no vector cast possible.");
140 template<
typename T,
typename U >
143 static constexpr
bool convertible = std::is_convertible<T, U>::value;
145 template<
typename UU = U >
146 auto operator()(
T const * pv )
147 ->
typename std::enable_if< convertible, std::vector< UU > >::type
151 u.push_back(
static_cast< U
>( *pv ) );
155 template<
typename UU = U >
156 auto operator()(
T const * )
157 ->
typename std::enable_if< !convertible, std::vector< UU > >::type
159 throw std::runtime_error(
160 "getCast: no scalar to vector conversion possible.");
167 template<
typename T,
typename U,
size_t n >
168 struct DoConvert<std::array< T, n >, std::vector< U >, false>
170 static constexpr
bool convertible = std::is_convertible<T, U>::value;
172 template<
typename UU = U >
173 auto operator()( std::array< T, n >
const * pv )
174 ->
typename std::enable_if< convertible, std::vector< UU > >::type
178 std::copy( pv->begin(), pv->end(), std::back_inserter(u) );
182 template<
typename UU = U >
183 auto operator()( std::array< T, n >
const * )
184 ->
typename std::enable_if< !convertible, std::vector< UU > >::type
186 throw std::runtime_error(
187 "getCast: no array to vector conversion possible.");
194 template<
typename T,
typename U,
size_t n >
195 struct DoConvert<std::vector< T >, std::array< U, n >, false>
197 static constexpr
bool convertible = std::is_convertible<T, U>::value;
199 template<
typename UU = U >
200 auto operator()( std::vector< T >
const * pv )
201 ->
typename std::enable_if< convertible, std::array< UU, n > >::type
203 std::array< U, n > u;
204 if( n != pv->size() )
206 throw std::runtime_error(
207 "getCast: no vector to array conversion possible "
208 "(wrong requested array size).");
210 for(
size_t i = 0; i < n; ++i )
212 u[ i ] =
static_cast< U
>( ( *pv )[ i ] );
217 template<
typename UU = U >
218 auto operator()( std::vector< T >
const * )
219 ->
typename std::enable_if< !convertible, std::array< UU, n > >::type
221 throw std::runtime_error(
222 "getCast: no vector to array conversion possible.");
232 template<
typename U >
243 #if defined(__ICC) || defined(__INTEL_COMPILER)
244 if(
auto pvalue_c = variantSrc::get_if< char >( &v ) )
246 else if(
auto pvalue_uc = variantSrc::get_if< unsigned char >( &v ) )
248 else if(
auto pvalue_s = variantSrc::get_if< short >( &v ) )
250 else if(
auto pvalue_i = variantSrc::get_if< int >( &v ) )
252 else if(
auto pvalue_l = variantSrc::get_if< long >( &v ) )
254 else if(
auto pvalue_ll = variantSrc::get_if< long long >( &v ) )
256 else if(
auto pvalue_us = variantSrc::get_if< unsigned short >( &v ) )
258 else if(
auto pvalue_ui = variantSrc::get_if< unsigned int >( &v ) )
260 else if(
auto pvalue_ul = variantSrc::get_if< unsigned long >( &v ) )
262 else if(
auto pvalue_ull = variantSrc::get_if< unsigned long long >( &v ) )
264 else if(
auto pvalue_f = variantSrc::get_if< float >( &v ) )
266 else if(
auto pvalue_d = variantSrc::get_if< double >( &v ) )
268 else if(
auto pvalue_ld = variantSrc::get_if< long double >( &v ) )
270 else if(
auto pvalue_cf = variantSrc::get_if< std::complex< float > >( &v ) )
271 return DoConvert<std::complex< float >, U>{}(pvalue_cf);
272 else if(
auto pvalue_cd = variantSrc::get_if< std::complex< double > >( &v ) )
273 return DoConvert<std::complex< double >, U>{}(pvalue_cd);
274 else if(
auto pvalue_cld = variantSrc::get_if< std::complex< long double > >( &v ) )
275 return DoConvert<std::complex< long double >, U>{}(pvalue_cld);
276 else if(
auto pvalue_str = variantSrc::get_if< std::string >( &v ) )
279 else if(
auto pvalue_vc = variantSrc::get_if< std::vector< char > >( &v ) )
280 return DoConvert<std::vector< char >, U>{}(pvalue_vc);
281 else if(
auto pvalue_vuc = variantSrc::get_if< std::vector< unsigned char > >( &v ) )
282 return DoConvert<std::vector< unsigned char >, U>{}(pvalue_vuc);
283 else if(
auto pvalue_vs = variantSrc::get_if< std::vector< short > >( &v ) )
284 return DoConvert<std::vector< short >, U>{}(pvalue_vs);
285 else if(
auto pvalue_vi = variantSrc::get_if< std::vector< int > >( &v ) )
286 return DoConvert<std::vector< int >, U>{}(pvalue_vi);
287 else if(
auto pvalue_vl = variantSrc::get_if< std::vector< long > >( &v ) )
288 return DoConvert<std::vector< long >, U>{}(pvalue_vl);
289 else if(
auto pvalue_vll = variantSrc::get_if< std::vector< long long > >( &v ) )
290 return DoConvert<std::vector< long long >, U>{}(pvalue_vll);
291 else if(
auto pvalue_vus = variantSrc::get_if< std::vector< unsigned short > >( &v ) )
292 return DoConvert<std::vector< unsigned short >, U>{}(pvalue_vus);
293 else if(
auto pvalue_vui = variantSrc::get_if< std::vector< unsigned int > >( &v ) )
294 return DoConvert<std::vector< unsigned int >, U>{}(pvalue_vui);
295 else if(
auto pvalue_vul = variantSrc::get_if< std::vector< unsigned long > >( &v ) )
296 return DoConvert<std::vector< unsigned long >, U>{}(pvalue_vul);
297 else if(
auto pvalue_vull = variantSrc::get_if< std::vector< unsigned long long > >( &v ) )
298 return DoConvert<std::vector< unsigned long long >, U>{}(pvalue_vull);
299 else if(
auto pvalue_vf = variantSrc::get_if< std::vector< float > >( &v ) )
300 return DoConvert<std::vector< float >, U>{}(pvalue_vf);
301 else if(
auto pvalue_vd = variantSrc::get_if< std::vector< double > >( &v ) )
302 return DoConvert<std::vector< double >, U>{}(pvalue_vd);
303 else if(
auto pvalue_vld = variantSrc::get_if< std::vector< long double > >( &v ) )
304 return DoConvert<std::vector< long double >, U>{}(pvalue_vld);
305 else if(
auto pvalue_vcf = variantSrc::get_if< std::vector< std::complex< float > > >( &v ) )
306 return DoConvert<std::vector< std::complex< float > >, U>{}(pvalue_vcf);
307 else if(
auto pvalue_vcd = variantSrc::get_if< std::vector< std::complex< double > > >( &v ) )
308 return DoConvert<std::vector< std::complex< double > >, U>{}(pvalue_vcd);
309 else if(
auto pvalue_vcld = variantSrc::get_if< std::vector< std::complex< long double > > >( &v ) )
310 return DoConvert<std::vector< std::complex< long double > >, U>{}(pvalue_vcld);
311 else if(
auto pvalue_vstr = variantSrc::get_if< std::vector< std::string > >( &v ) )
312 return DoConvert<std::vector< std::string >, U>{}(pvalue_vstr);
314 else if(
auto pvalue_vad = variantSrc::get_if< std::array< double, 7 > >( &v ) )
315 return DoConvert<std::array< double, 7 >, U>{}(pvalue_vad);
316 else if(
auto pvalue_b = variantSrc::get_if< bool >( &v ) )
319 throw std::runtime_error(
"getCast: unknown Datatype.");
322 return variantSrc::visit(
323 [](
auto && containedValue ) -> U {
324 using containedType = std::decay_t< decltype( containedValue ) >;
331 template<
typename U >
334 return getCast< U >( Variant::getResource() );