13#ifndef ML_RANGE_CASTS_H
14#define ML_RANGE_CASTS_H
22#include <ThirdPartyWarningsDisable.h>
24#include <ThirdPartyWarningsRestore.h>
30 #define _ML_COMPILE_RANGE_CASTS_WITH_CHECKS
33 #define _ML_RANGE_ERROR_TYPE ML_PRINT_FATAL_ERROR
36 #define _ML_OUTPUT_RANGE_ERROR \
37 _ML_RANGE_ERROR_TYPE("_MLRangeCheck::checked_cast", ML_OUT_OF_RANGE, "Invalid numeric cast (range check failed).");
53 static const unsigned char MaxValue = UCHAR_MAX;
61 static const unsigned char MaxValue = SCHAR_MAX;
69 static const unsigned char MaxValue = CHAR_MAX;
77 static const unsigned short MaxValue = USHRT_MAX;
85 static const unsigned short MaxValue = SHRT_MAX;
125 static const unsigned long long MaxValue = ULLONG_MAX;
133 static const unsigned long long MaxValue = LLONG_MAX;
157 #if defined(_ML_COMPILE_RANGE_CASTS_WITH_CHECKS)
163 template <
bool CheckLowerBounds,
bool CheckUpperBounds,
typename Target,
typename Source>
166 template <
typename Target,
typename Source>
176 return static_cast<Target
>(srcVal);
180 template <
typename Target,
typename Source>
189 return static_cast<Target
>(srcVal);
193 template <
typename Target,
typename Source>
202 return static_cast<Target
>(srcVal);
206 template <
typename Target,
typename Source>
211 return static_cast<Target
>(srcVal);
218 template <
typename Target,
typename Source>
223 return static_cast<Target
>(arg);
233 if ((arg <
static_cast<double>(-FLT_MAX)) ||
234 (arg >
static_cast<double>(FLT_MAX)))
238 return static_cast<float>(arg);
246 template <
bool isTargetFloat,
bool isSourceFloat,
typename Target,
typename Source>
250 template <
typename Target,
typename Source>
263 template <
typename Target,
typename Source>
268 return static_cast<Target
>(arg);
273 template <
typename Target,
typename Source>
278 arg =
floor(arg + 0.5f);
284 return static_cast<Target
>(arg);
288 template <
typename Target,
typename Source>
304 #if defined(_ML_COMPILE_RANGE_CASTS_ONLY_AS_CASTS) && defined(_ML_COMPILE_RANGE_CASTS_WITH_CHECKS)
305 #error "_ML_COMPILE_RANGE_CASTS_ONLY_AS_CASTS and _ML_COMPILE_RANGE_CAST_FUNCTIONS_WITH_CHECKS must not be set both."
307 #if !defined(_ML_COMPILE_RANGE_CASTS_ONLY_AS_CASTS) && !defined(_ML_COMPILE_RANGE_CASTS_WITH_CHECKS)
310 template<Target, Source>
315 #if defined(_ML_COMPILE_RANGE_CASTS_ONLY_AS_CASTS)
318 template<Target, Source>
319 inline Target
mlrange_cast(Source arg) {
return static_cast<Target
>(arg); }
331 template<
typename Target,
typename Source>
#define _ML_OUTPUT_RANGE_ERROR
To avoid duplication...
Target mlrange_cast(Source arg)
Generic version of checked ML casts.
static float checked_cast(double arg)
static Target checked_cast(Source arg)
static Target checked_cast(Source srcVal)
static Target checked_cast(Source srcVal)
static Target checked_cast(Source srcVal)
static Target checked_cast(Source srcVal)
Compile-check functions only if needed.
static Target checked_cast(Source arg)
static Target checked_cast(Source arg)
static Target checked_cast(Source arg)
static Target checked_cast(Source arg)
static const unsigned char MaxValue
static const signed char MinValue
static const bool isFloat
static const bool isFloat
static const bool isFloat
static const int MinValue
static const bool isFloat
static const unsigned int MaxValue
static const long MinValue
static const bool isFloat
static const unsigned long MaxValue
static const long long MinValue
static const unsigned long long MaxValue
static const bool isFloat
static const short MinValue
static const bool isFloat
static const unsigned short MaxValue
static const signed char MinValue
static const bool isFloat
static const unsigned char MaxValue
static const unsigned char MaxValue
static const bool isFloat
static const signed char MinValue
static const unsigned int MaxValue
static const int MinValue
static const bool isFloat
static const long MinValue
static const unsigned long MaxValue
static const bool isFloat
static const bool isFloat
static const long long MinValue
static const unsigned long long MaxValue
static const bool isFloat
static const unsigned short MaxValue
static const signed short MinValue
Defines a template to get the minimum and maximum values for each basic integer type.