14#if !defined(PQXX_HEADER_PRE)
15# error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>."
27#if __has_include(<ranges>)
31#include "pqxx/except.hxx"
32#include "pqxx/util.hxx"
33#include "pqxx/zview.hxx"
79template<
typename TYPE>
90template<
typename TYPE,
typename ENABLE =
void>
struct nullness
107 [[nodiscard]]
static TYPE
null();
138 [[nodiscard]]
static constexpr bool is_null(TYPE
const &)
noexcept
187 [[nodiscard]]
static inline zview
188 to_buf(
char *begin,
char *end, TYPE
const &value);
198 static inline char *
into_buf(
char *begin,
char *end, TYPE
const &value);
206 [[nodiscard]]
static inline TYPE
from_string(std::string_view text);
214 [[nodiscard]]
static inline std::size_t
249 static constexpr bool converts_to_string{
false};
250 static constexpr bool converts_from_string{
false};
251 [[noreturn]]
static zview to_buf(
char *,
char *, TYPE
const &)
253 oops_forbidden_conversion<TYPE>();
255 [[noreturn]]
static char *into_buf(
char *,
char *, TYPE
const &)
257 oops_forbidden_conversion<TYPE>();
259 [[noreturn]]
static TYPE
from_string(std::string_view)
261 oops_forbidden_conversion<TYPE>();
263 [[noreturn]]
static std::size_t size_buffer(TYPE
const &)
noexcept
265 oops_forbidden_conversion<TYPE>();
339template<
typename ENUM>
362 using impl_type = std::underlying_type_t<ENUM>;
365 static constexpr bool converts_to_string{
true};
366 static constexpr bool converts_from_string{
true};
368 [[nodiscard]]
static constexpr zview
369 to_buf(
char *begin,
char *end, ENUM
const &value)
374 static constexpr char *into_buf(
char *begin,
char *end, ENUM
const &value)
379 [[nodiscard]]
static ENUM from_string(std::string_view text)
384 [[nodiscard]]
static std::size_t size_buffer(ENUM
const &value)
noexcept
391 static constexpr impl_type to_underlying(ENUM
const &value)
noexcept
393 return static_cast<impl_type
>(value);
415#define PQXX_DECLARE_ENUM_CONVERSION(ENUM) \
416 template<> struct string_traits<ENUM> : pqxx::internal::enum_traits<ENUM> \
418 template<> inline std::string_view const type_name<ENUM> \
439template<
typename TYPE>
440[[nodiscard]]
inline TYPE
from_string(std::string_view text)
454[[nodiscard]]
inline std::string_view
from_string(std::string_view text)
468template<
typename T>
inline void from_string(std::string_view text, T &value)
470 value = from_string<T>(text);
480template<
typename TYPE>
inline std::string
to_string(TYPE
const &value);
491template<
typename... TYPE>
492[[nodiscard]]
inline std::vector<std::string_view>
493to_buf(
char *here,
char const *end, TYPE... value)
495 PQXX_ASSUME(here <= end);
496 return {[&here, end](
auto v) {
498 here = string_traits<
decltype(v)>::into_buf(begin, end, v);
500 auto len{
static_cast<std::size_t
>(here - begin) - 1};
501 return std::string_view{begin, len};
509template<
typename TYPE>
510inline void into_string(TYPE
const &value, std::string &out);
514template<
typename TYPE>
515[[nodiscard]]
inline constexpr bool is_null(TYPE
const &value)
noexcept
517 return nullness<strip_t<TYPE>>::is_null(value);
525template<
typename... TYPE>
526[[nodiscard]]
inline std::size_t size_buffer(TYPE
const &...value)
noexcept
528 return (string_traits<strip_t<TYPE>>::size_buffer(value) + ...);
539template<
typename TYPE>
inline constexpr bool is_sql_array{
false};
555template<
typename TYPE>
inline constexpr bool is_unquoted_safe{
false};
559template<
typename T>
inline constexpr char array_separator{
','};
570template<
typename TYPE>
inline constexpr format param_format(TYPE
const &)
586template<
typename TYPE>
587inline zview generic_to_buf(
char *begin,
char *end, TYPE
const &value)
589 using traits = string_traits<TYPE>;
595 return {begin, traits::into_buf(begin, end, value) - begin - 1};
599#if defined(PQXX_HAVE_CONCEPTS)
608concept binary = std::ranges::contiguous_range<TYPE> and
609 std::is_same_v<strip_t<value_type<TYPE>>, std::byte>;
615#include "pqxx/internal/conversions.hxx"
Marker-type wrapper: zero-terminated std::string_view.
Definition zview.hxx:38
Internal items for libpqxx' own use. Do not use these yourself.
Definition encodings.cxx:33
std::string demangle_type_name(char const raw[])
Attempt to demangle std::type_info::name() to something human-readable.
Definition strconv.cxx:226
The home of all libpqxx classes, functions, templates, etc.
Definition array.cxx:27
std::string const type_name
A human-readable name for a type, used in error messages and such.
Definition strconv.hxx:80
void oops_forbidden_conversion() noexcept
Nonexistent function to indicate a disallowed type conversion.
PQXX_LIBEXPORT std::string to_string(field const &value)
Convert a field to a string.
Definition result.cxx:628
T from_string(field const &value)
Convert a field's value to type T.
Definition field.hxx:548
format
Format code: is data text or binary?
Definition types.hxx:70
String traits for a forbidden type conversion.
Definition strconv.hxx:248
Helper class for defining enum conversions.
Definition strconv.hxx:361
Nullness traits describing a type which does not have a null value.
Definition strconv.hxx:113
static constexpr bool always_null
Are all values of this type null?
Definition strconv.hxx:131
static constexpr bool has_null
Does TYPE have a "built-in null value"?
Definition strconv.hxx:125
static constexpr bool is_null(TYPE const &) noexcept
Does a given value correspond to an SQL null value?
Definition strconv.hxx:138
Traits describing a type's "null value," if any.
Definition strconv.hxx:91
static bool is_null(TYPE const &value)
Is value a null?
static TYPE null()
Return a null value.
static bool has_null
Does this type have a null value?
Definition strconv.hxx:93
static bool always_null
Is this type always null?
Definition strconv.hxx:96
Traits class for use in string conversions.
Definition strconv.hxx:154
static TYPE from_string(std::string_view text)
Parse a string representation of a TYPE value.
static std::size_t size_buffer(TYPE const &value) noexcept
Estimate how much buffer space is needed to represent value.
static zview to_buf(char *begin, char *end, TYPE const &value)
Return a string_view representing value, plus terminating zero.
static constexpr bool converts_to_string
Is conversion from TYPE to strings supported?
Definition strconv.hxx:159
static char * into_buf(char *begin, char *end, TYPE const &value)
Write value's string representation into buffer at begin.
static constexpr bool converts_from_string
Is conversion from string_view to TYPE supported?
Definition strconv.hxx:165