libpqxx 7.7.0
zview.hxx
1/* Zero-terminated string view.
2 *
3 * DO NOT INCLUDE THIS FILE DIRECTLY; include pqxx/zview instead.
4 *
5 * Copyright (c) 2000-2022, Jeroen T. Vermeulen.
6 *
7 * See COPYING for copyright license. If you did not receive a file called
8 * COPYING with this source code, please notify the distributor of this
9 * mistake, or contact the author.
10 */
11#ifndef PQXX_H_ZVIEW
12#define PQXX_H_ZVIEW
13
14#include <string>
15#include <string_view>
16#include <type_traits>
17
18#include "pqxx/types.hxx"
19
20
21namespace pqxx
22{
24
37class zview : public std::string_view
38{
39public:
40 constexpr zview() noexcept = default;
41
43 constexpr zview(char const text[], std::ptrdiff_t len) :
44 std::string_view{text, static_cast<std::size_t>(len)}
45 {}
46
48 constexpr zview(char text[], std::ptrdiff_t len) :
49 std::string_view{text, static_cast<std::size_t>(len)}
50 {}
51
53
55 template<typename... Args>
56 explicit constexpr zview(Args &&...args) :
57 std::string_view(std::forward<Args>(args)...)
58 {}
59
61 zview(std::string const &str) : std::string_view{str.c_str(), std::size(str)}
62 {}
63
65
69 constexpr zview(char const str[]) : std::string_view{str} {}
70
72
80 template<size_t size>
81 constexpr zview(char const (&literal)[size]) : zview(literal, size - 1)
82 {}
83
85 [[nodiscard]] constexpr char const *c_str() const &noexcept
86 {
87 return data();
88 }
89};
90
91
93
100constexpr zview operator"" _zv(char const str[], std::size_t len) noexcept
101{
102 return zview{str, len};
103}
104} // namespace pqxx
105
106
107#if defined(PQXX_HAVE_CONCEPTS)
108// C++20: constinit.
110template<> inline constexpr bool std::ranges::enable_view<pqxx::zview>{true};
111
112
113// C++20: constinit.
115template<>
116inline constexpr bool std::ranges::enable_borrowed_range<pqxx::zview>{true};
117
118namespace pqxx::internal
119{
121
125template<typename T>
126concept ZString = std::is_convertible_v < strip_t<T>,
127char const * > or std::is_convertible_v<strip_t<T>, zview> or
128 std::is_convertible_v<T, std::string const &>;
129} // namespace pqxx::internal
130#endif // PQXX_HAVE_CONCEPTS
131
132
133namespace pqxx::internal
134{
136inline constexpr char const *as_c_string(char const str[]) noexcept
137{
138 return str;
139}
141template<std::size_t N>
142inline constexpr char const *as_c_string(char (&str)[N]) noexcept
143{
144 return str;
145}
147inline constexpr char const *as_c_string(pqxx::zview str) noexcept
148{
149 return str.c_str();
150}
151// C++20: Make this constexpr.
153inline char const *as_c_string(std::string const &str) noexcept
154{
155 return str.c_str();
156}
157} // namespace pqxx::internal
158#endif
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:23
Internal items for libpqxx' own use. Do not use these yourself.
Definition: composite.hxx:80
constexpr char const * as_c_string(char const str[]) noexcept
Get a raw C string pointer.
Definition: zview.hxx:136
Marker-type wrapper: zero-terminated std::string_view.
Definition: zview.hxx:38
constexpr zview(char const (&literal)[size])
Construct a zview from a string literal.
Definition: zview.hxx:81
constexpr char const * c_str() const &noexcept
Either a null pointer, or a zero-terminated text buffer.
Definition: zview.hxx:85
constexpr zview(Args &&...args)
Construct from any initialiser you might use for std::string_view.
Definition: zview.hxx:56
constexpr zview() noexcept=default
constexpr zview(char text[], std::ptrdiff_t len)
Convenience overload: construct using pointer and signed length.
Definition: zview.hxx:48
zview(std::string const &str)
Definition: zview.hxx:61
constexpr zview(char const str[])
Construct a zview from a C-style string.
Definition: zview.hxx:69