14 #include "pqxx/compiler-public.hxx"
15 #include "pqxx/internal/compiler-internal-pre.hxx"
23 #include <string_view>
24 #include <type_traits>
28 #include "pqxx/except.hxx"
29 #include "pqxx/types.hxx"
30 #include "pqxx/version.hxx"
37 #include <pqxx/internal/libpq-forward.hxx>
50 template<
typename TO,
typename FROM>
51 inline TO
check_cast(FROM value,
char const description[])
53 static_assert(std::is_arithmetic_v<FROM>);
54 static_assert(std::is_arithmetic_v<TO>);
55 static_assert(std::is_integral_v<FROM> == std::is_integral_v<TO>);
59 if constexpr (std::is_same_v<FROM, bool>)
60 return static_cast<TO
>(value);
66 using from_limits = std::numeric_limits<decltype(value)>;
67 using to_limits = std::numeric_limits<TO>;
68 if constexpr (std::is_signed_v<FROM>)
70 if constexpr (std::is_signed_v<TO>)
72 if (value < (to_limits::min)())
73 throw range_error(std::string{
"Cast underflow: "} + description);
82 std::string{
"Casting negative value to unsigned type: "} +
92 if constexpr (std::is_integral_v<FROM>)
94 using unsigned_from = std::make_unsigned_t<FROM>;
95 using unsigned_to = std::make_unsigned_t<TO>;
96 constexpr
auto from_max{
static_cast<unsigned_from
>((from_limits::max)())};
97 constexpr
auto to_max{
static_cast<unsigned_to
>((to_limits::max)())};
98 if constexpr (from_max > to_max)
100 if (
static_cast<unsigned_from
>(value) > to_max)
101 throw range_error(std::string{
"Cast overflow: "} + description);
104 else if constexpr ((from_limits::max)() > (to_limits::max)())
106 if (value > (to_limits::max)())
107 throw range_error(std::string{
"Cast overflow: "} + description);
110 return static_cast<TO
>(value);
158 bool safe_libpq =
false;
167 bool safe_kerberos =
false;
211 explicit namedclass(std::string_view classname) : m_classname{classname} {}
213 namedclass(std::string_view classname, std::string_view name) :
214 m_classname{classname},
219 m_classname{classname},
224 m_classname{classname},
225 m_name{std::move(name)}
229 std::string
const &
name() const noexcept {
return m_name; }
232 std::string
const &
classname() const noexcept {
return m_classname; }
235 std::string description()
const;
238 std::string m_classname, m_name;
243 namedclass
const *new_ptr, namedclass
const *old_ptr);
245 namedclass
const *new_ptr, namedclass
const *old_ptr);
255 constexpr
unique() =
default;
259 rhs.m_guest =
nullptr;
264 m_guest = rhs.m_guest;
265 rhs.m_guest =
nullptr;
269 constexpr GUEST *
get() const noexcept {
return m_guest; }
284 GUEST *m_guest =
nullptr;
288 #include "pqxx/internal/compiler-internal-post.hxx"
void ignore_unused(T &&)
Suppress compiler warning about an unused item.
Definition: util.hxx:43
std::string description() const
Combination of class name and object name; or just class name.
Definition: util.cxx:50
void check_unique_registration(namedclass const *new_ptr, namedclass const *old_ptr)
Definition: util.cxx:60
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:25
namedclass(std::string_view classname, std::string &&name)
Definition: util.hxx:223
const std::string & classname() const noexcept
Class name.
Definition: util.hxx:232
constexpr unique(unique &&rhs)
Definition: util.hxx:257
void check_unique_unregistration(namedclass const *new_ptr, namedclass const *old_ptr)
Definition: util.cxx:75
int PQXX_VERSION_CHECK() noexcept
Library version check stub.
Definition: version.cxx:18
std::string description
A human-readable description of any thread-safety issues.
Definition: util.hxx:170
constexpr GUEST * get() const noexcept
Definition: util.hxx:269
Ensure proper opening/closing of GUEST objects related to a "host" object.
Definition: util.hxx:252
bool safe_libpq
Is the underlying libpq build thread-safe?
Definition: util.hxx:158
Private namespace for libpqxx's internal use; do not access.
Definition: connection.hxx:59
void check_version()
Definition: util.hxx:135
constexpr unique()=default
namedclass(std::string_view classname)
Definition: util.hxx:211
namedclass(std::string_view classname, char const name[])
Definition: util.hxx:218
Helper base class: object descriptions for error messages and such.
Definition: util.hxx:208
Something is out of range, similar to std::out_of_range.
Definition: except.hxx:192
constexpr unique & operator=(unique const &)=delete
thread_safety_model describe_thread_safety()
Describe thread safety available in this build.
Definition: util.cxx:26
Internal error in libpqxx library.
Definition: except.hxx:157
constexpr void unregister_guest(GUEST *G)
Definition: util.hxx:277
TO check_cast(FROM value, char const description[])
Cast a numeric value to another type, or throw if it underflows/overflows.
Definition: util.hxx:51
constexpr unique & operator=(unique &&rhs)
Definition: util.hxx:262
constexpr oid oid_none
The "null" oid.
Definition: util.hxx:179
Error in usage of libpqxx library, similar to std::logic_error.
Definition: except.hxx:164
namedclass(std::string_view classname, std::string_view name)
Definition: util.hxx:213
const std::string & name() const noexcept
Object name, or the empty string if no name was given.
Definition: util.hxx:229
bool safe_kerberos
Is Kerberos thread-safe?
Definition: util.hxx:167
constexpr void register_guest(GUEST *G)
Definition: util.hxx:271
Descriptor of library's thread-safety model.
Definition: util.hxx:155