Lightweight 0.20251202.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 =
9requires(S s,
10 S const cs,
11 std::size_t n,
12 S::value_type ch,
13 std::basic_string_view<typename S::value_type> sv)
14{
15 /* =========================
16 Associated types
17 ========================= */
18 typename S::value_type;
19 typename S::iterator;
20 typename S::const_iterator;
21 typename S::pointer_type;
22 typename S::const_pointer_type;
23
24 /* =========================
25 Construction
26 ========================= */
27 std::is_default_constructible_v<S>;
28 std::is_copy_constructible_v<S>;
29 std::is_move_constructible_v<S>;
30
31 /* =========================
32 Capacity & size
33 ========================= */
34 { cs.size() } -> std::same_as<std::size_t>;
35 { cs.capacity() } -> std::same_as<std::size_t>;
36 { cs.empty() } -> std::same_as<bool>;
37
38 /* =========================
39 Modifiers
40 ========================= */
41 { s.clear() } -> std::same_as<void>;
42 { s.resize(n) } -> std::same_as<void>;
43 { s.setsize(n) } -> std::same_as<void>;
44 { s.reserve(n) } -> std::same_as<void>;
45
46 { s.push_back(ch) } -> std::same_as<void>;
47 { s.pop_back() } -> std::same_as<void>;
48
49 /* =========================
50 Element access
51 ========================= */
52 { s[n] } -> std::same_as<typename S::value_type&>;
53 { cs[n] } -> std::same_as<typename S::value_type const&>;
54
55 /* =========================
56 Iterators & data
57 ========================= */
58 { s.begin() } -> std::same_as<typename S::iterator>;
59 { s.end() } -> std::same_as<typename S::iterator>;
60 { cs.begin() } -> std::same_as<typename S::const_iterator>;
61 { cs.end() } -> std::same_as<typename S::const_iterator>;
62
63 { s.data() } -> std::same_as<typename S::pointer_type>;
64 { cs.data() } -> std::same_as<typename S::const_pointer_type>;
65 { s.c_str() } -> std::same_as<typename S::const_pointer_type>;
66 { cs.c_str() } -> std::same_as<typename S::const_pointer_type>;
67
68 /* =========================
69 String views & conversions
70 ========================= */
71 { cs.substr() } ->
72 std::same_as<std::basic_string_view<typename S::value_type>>;
73
74 { cs.str() } ->
75 std::same_as<std::basic_string_view<typename S::value_type>>;
76
77 { cs.ToString() } ->
78 std::same_as<std::basic_string<typename S::value_type>>;
79
80 { cs.ToStringView() } ->
81 std::same_as<std::basic_string_view<typename S::value_type>>;
82
83 static_cast<std::basic_string<typename S::value_type>>(cs);
84 static_cast<std::basic_string_view<typename S::value_type>>(cs);
85
86 /* =========================
87 Comparisons
88 ========================= */
89 { cs == sv } -> std::same_as<bool>;
90 { cs != sv } -> std::same_as<bool>;
91};