1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
7 #ifdef __INTEL_COMPILER
8 #pragma warning disable: 54
11 #include <type_traits>
14 #include <details/ie_exception.hpp>
20 template <bool Cond, class Func>
21 inline typename std::enable_if<Cond, void>::type runIf(Func&& func) {
24 template <bool Cond, class Func>
25 inline typename std::enable_if<!Cond, void>::type runIf(Func&&) {
28 // To overcame syntax parse error, when `>` comparison operator is threated as template closing bracket
29 template <typename T1, typename T2>
30 constexpr inline bool Greater(T1&& v1, T2&& v2) {
34 } // namespace details
36 template <typename OutT, typename InT>
37 inline typename std::enable_if<
38 std::is_same<OutT, InT>::value,
39 OutT>::type checked_cast(InT value) {
43 template <typename OutT, typename InT>
44 inline typename std::enable_if<
45 std::is_integral<OutT>::value && std::is_integral<InT>::value &&
46 std::is_signed<OutT>::value && std::is_signed<InT>::value &&
47 !std::is_same<OutT, InT>::value,
48 OutT>::type checked_cast(InT value) {
50 std::numeric_limits<InT>::lowest() < std::numeric_limits<OutT>::lowest()
52 IE_ASSERT(value >= std::numeric_limits<OutT>::lowest()) << value;
55 details::Greater(std::numeric_limits<InT>::max(), std::numeric_limits<OutT>::max())
57 IE_ASSERT(value <= std::numeric_limits<OutT>::max()) << value;
60 return static_cast<OutT>(value);
63 template <typename OutT, typename InT>
64 typename std::enable_if<
65 std::is_integral<OutT>::value && std::is_integral<InT>::value &&
66 std::is_unsigned<OutT>::value && std::is_unsigned<InT>::value &&
67 !std::is_same<OutT, InT>::value,
68 OutT>::type checked_cast(InT value) {
70 details::Greater(std::numeric_limits<InT>::max(), std::numeric_limits<OutT>::max())
72 IE_ASSERT(value <= std::numeric_limits<OutT>::max()) << value;
75 return static_cast<OutT>(value);
78 template <typename OutT, typename InT>
79 typename std::enable_if<
80 std::is_integral<OutT>::value && std::is_integral<InT>::value &&
81 std::is_signed<OutT>::value && std::is_unsigned<InT>::value,
82 OutT>::type checked_cast(InT value) {
84 details::Greater(std::numeric_limits<InT>::max(), static_cast<typename std::make_unsigned<OutT>::type>(std::numeric_limits<OutT>::max()))
86 IE_ASSERT(value <= static_cast<typename std::make_unsigned<OutT>::type>(std::numeric_limits<OutT>::max())) << value;
89 return static_cast<OutT>(value);
92 template <typename OutT, typename InT>
93 typename std::enable_if<
94 std::is_integral<OutT>::value && std::is_integral<InT>::value &&
95 std::is_unsigned<OutT>::value && std::is_signed<InT>::value,
96 OutT>::type checked_cast(InT value) {
97 IE_ASSERT(value >= 0) << value;
99 details::Greater(static_cast<typename std::make_unsigned<InT>::type>(std::numeric_limits<InT>::max()), std::numeric_limits<OutT>::max())
101 IE_ASSERT(static_cast<typename std::make_unsigned<InT>::type>(value) <= std::numeric_limits<OutT>::max()) << value;
104 return static_cast<OutT>(value);
107 template <typename OutT, typename InT>
108 typename std::enable_if<
109 std::is_integral<OutT>::value && std::is_floating_point<InT>::value,
110 OutT>::type checked_cast(InT value) {
111 IE_ASSERT(value <= static_cast<InT>(std::numeric_limits<OutT>::max())) << value;
112 IE_ASSERT(value >= static_cast<InT>(std::numeric_limits<OutT>::lowest())) << value;
114 return static_cast<OutT>(value);
117 template <typename OutT, typename InT>
118 typename std::enable_if<
119 std::is_same<float, OutT>::value && std::is_same<double, InT>::value,
120 OutT>::type checked_cast(InT value) {
121 IE_ASSERT(static_cast<double>(static_cast<float>(value)) == value) << value;
123 return static_cast<OutT>(value);