28 constexpr const char* c_str()
const noexcept {
return value_; }
29 constexpr std::string_view view()
const noexcept {
30 return std::string_view(value_);
33 explicit constexpr operator const char*()
const noexcept {
return value_; }
34 constexpr operator std::string_view()
const noexcept {
return view(); }
35 operator std::string()
const {
return std::string(value_); }
42 return lhs.view() == rhs.view();
45inline bool operator==(StringConstant lhs, std::string_view rhs)
noexcept {
46 return lhs.view() == rhs;
49inline bool operator==(std::string_view lhs, StringConstant rhs)
noexcept {
50 return lhs == rhs.view();
53inline bool operator==(StringConstant lhs,
const std::string& rhs)
noexcept {
54 return rhs == lhs.c_str();
57inline bool operator==(
const std::string& lhs, StringConstant rhs)
noexcept {
58 return lhs == rhs.c_str();
61inline bool operator==(StringConstant lhs,
const char* rhs)
noexcept {
62 return lhs.view() == std::string_view(rhs ==
nullptr ?
"" : rhs);
65inline bool operator==(
const char* lhs, StringConstant rhs)
noexcept {
66 return std::string_view(lhs ==
nullptr ?
"" : lhs) == rhs.view();
69inline bool operator!=(StringConstant lhs, StringConstant rhs)
noexcept {
73inline bool operator!=(StringConstant lhs, std::string_view rhs)
noexcept {
77inline bool operator!=(std::string_view lhs, StringConstant rhs)
noexcept {
81inline bool operator!=(StringConstant lhs,
const std::string& rhs)
noexcept {
85inline bool operator!=(
const std::string& lhs, StringConstant rhs)
noexcept {
89inline bool operator!=(StringConstant lhs,
const char* rhs)
noexcept {
93inline bool operator!=(
const char* lhs, StringConstant rhs)
noexcept {
99template <
typename T,
typename =
void>
100struct IsJsonStringLike : std::false_type {};
103struct IsJsonStringLike<
105 std::void_t<decltype(std::declval<const T&>().is_string()),
106 decltype(std::declval<const T&>().template get<std::string>())>>
111template <
typename JsonLike,
112 std::enable_if_t<detail::IsJsonStringLike<JsonLike>::value,
int> = 0>
113inline bool operator==(
const JsonLike& lhs, StringConstant rhs) {
114 return lhs.is_string() && lhs.template get<std::string>() == rhs.c_str();
117template <
typename JsonLike,
118 std::enable_if_t<detail::IsJsonStringLike<JsonLike>::value,
int> = 0>
119inline bool operator==(StringConstant lhs,
const JsonLike& rhs) {
123template <
typename JsonLike,
124 std::enable_if_t<detail::IsJsonStringLike<JsonLike>::value,
int> = 0>
125inline bool operator!=(
const JsonLike& lhs, StringConstant rhs) {
126 return !(lhs == rhs);
129template <
typename JsonLike,
130 std::enable_if_t<detail::IsJsonStringLike<JsonLike>::value,
int> = 0>
131inline bool operator!=(StringConstant lhs,
const JsonLike& rhs) {
132 return !(lhs == rhs);
135inline std::ostream& operator<<(std::ostream& stream, StringConstant value) {
136 return stream << value.c_str();
String-like literal wrapper safe for inline public constants.
Definition string_constant.hpp:23