Lightweight 0.20260303.0
Loading...
Searching...
No Matches
StringInterface.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4#include <concepts>
5#include <string>
6
7template <typename S>
8concept SqlStringInterface =
9 requires(S s, S const cs, std::size_t n, S::value_type ch, std::basic_string_view<typename S::value_type> sv) {
10 /* =========================
11 Associated types
12 ========================= */
13 typename S::value_type;
14 typename S::iterator;
15 typename S::const_iterator;
16 typename S::pointer_type;
17 typename S::const_pointer_type;
18
19 /* =========================
20 Construction
21 ========================= */
22 std::is_default_constructible_v<S>;
23 std::is_copy_constructible_v<S>;
24 std::is_move_constructible_v<S>;
25
26 /* =========================
27 Capacity & size
28 ========================= */
29 { cs.size() } -> std::same_as<std::size_t>;
30 { cs.capacity() } -> std::same_as<std::size_t>;
31 { cs.empty() } -> std::same_as<bool>;
32
33 /* =========================
34 Modifiers
35 ========================= */
36 { s.clear() } -> std::same_as<void>;
37 { s.resize(n) } -> std::same_as<void>;
38 { s.setsize(n) } -> std::same_as<void>;
39 { s.reserve(n) } -> std::same_as<void>;
40
41 { s.push_back(ch) } -> std::same_as<void>;
42 { s.pop_back() } -> std::same_as<void>;
43
44 /* =========================
45 Element access
46 ========================= */
47 { s[n] } -> std::same_as<typename S::value_type&>;
48 { cs[n] } -> std::same_as<typename S::value_type const&>;
49
50 /* =========================
51 Iterators & data
52 ========================= */
53 { s.begin() } -> std::same_as<typename S::iterator>;
54 { s.end() } -> std::same_as<typename S::iterator>;
55 { cs.begin() } -> std::same_as<typename S::const_iterator>;
56 { cs.end() } -> std::same_as<typename S::const_iterator>;
57
58 { s.data() } -> std::same_as<typename S::pointer_type>;
59 { cs.data() } -> std::same_as<typename S::const_pointer_type>;
60 { s.c_str() } -> std::same_as<typename S::const_pointer_type>;
61 { cs.c_str() } -> std::same_as<typename S::const_pointer_type>;
62
63 /* =========================
64 String views & conversions
65 ========================= */
66 { cs.substr() } -> std::same_as<std::basic_string_view<typename S::value_type>>;
67
68 { cs.str() } -> std::same_as<std::basic_string_view<typename S::value_type>>;
69
70 { cs.ToString() } -> std::same_as<std::basic_string<typename S::value_type>>;
71
72 { cs.ToStringView() } -> std::same_as<std::basic_string_view<typename S::value_type>>;
73
74 static_cast<std::basic_string<typename S::value_type>>(cs);
75 static_cast<std::basic_string_view<typename S::value_type>>(cs);
76
77 /* =========================
78 Comparisons
79 ========================= */
80 { cs == sv } -> std::same_as<bool>;
81 { cs != sv } -> std::same_as<bool>;
82 };