20#ifndef RIPPLE_BASICS_SAFE_CAST_H_INCLUDED
21#define RIPPLE_BASICS_SAFE_CAST_H_INCLUDED
31template <
class Dest,
class Src>
33 (std::is_integral_v<Src> && std::is_integral_v<Dest>) &&
36 ?
sizeof(Dest) >
sizeof(Src)
37 : sizeof(Dest) >= sizeof(Src));
39template <
class Dest,
class Src>
41 enable_if_t<std::is_integral_v<Dest> && std::is_integral_v<Src>, Dest>
45 std::is_signed_v<Dest> || std::is_unsigned_v<Src>,
46 "Cannot cast signed to unsigned");
47 constexpr unsigned not_same =
48 std::is_signed_v<Dest> != std::is_signed_v<Src>;
50 sizeof(Dest) >=
sizeof(Src) + not_same,
51 "Destination is too small to hold all values of source");
52 return static_cast<Dest
>(s);
55template <
class Dest,
class Src>
57 enable_if_t<std::is_enum_v<Dest> && std::is_integral_v<Src>, Dest>
60 return static_cast<Dest
>(safe_cast<std::underlying_type_t<Dest>>(s));
63template <
class Dest,
class Src>
65 enable_if_t<std::is_integral_v<Dest> && std::is_enum_v<Src>, Dest>
75template <
class Dest,
class Src>
77 enable_if_t<std::is_integral_v<Dest> && std::is_integral_v<Src>, Dest>
81 !is_safetocasttovalue_v<Dest, Src>,
82 "Only unsafe if casting signed to unsigned or "
83 "destination is too small");
84 return static_cast<Dest
>(s);
87template <
class Dest,
class Src>
89 enable_if_t<std::is_enum_v<Dest> && std::is_integral_v<Src>, Dest>
92 return static_cast<Dest
>(unsafe_cast<std::underlying_type_t<Dest>>(s));
95template <
class Dest,
class Src>
97 enable_if_t<std::is_integral_v<Dest> && std::is_enum_v<Src>, Dest>
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::enable_if_t< std::is_integral_v< Dest > &&std::is_integral_v< Src >, Dest > safe_cast(Src s) noexcept
static constexpr bool is_safetocasttovalue_v
constexpr std::enable_if_t< std::is_integral_v< Dest > &&std::is_integral_v< Src >, Dest > unsafe_cast(Src s) noexcept