cxxmcp 1.1.6
C++ MCP SDK
Loading...
Searching...
No Matches
string_constant.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 [caomengxuan666]
2
3#pragma once
4
5#include <ostream>
6#include <string>
7#include <string_view>
8#include <type_traits>
9#include <utility>
10
13
14namespace mcp::core {
15
24 public:
25 constexpr explicit StringConstant(const char* value) noexcept
26 : value_(value) {}
27
28 constexpr const char* c_str() const noexcept { return value_; }
29 constexpr std::string_view view() const noexcept {
30 return std::string_view(value_);
31 }
32
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_); }
36
37 private:
38 const char* value_;
39};
40
41inline bool operator==(StringConstant lhs, StringConstant rhs) noexcept {
42 return lhs.view() == rhs.view();
43}
44
45inline bool operator==(StringConstant lhs, std::string_view rhs) noexcept {
46 return lhs.view() == rhs;
47}
48
49inline bool operator==(std::string_view lhs, StringConstant rhs) noexcept {
50 return lhs == rhs.view();
51}
52
53inline bool operator==(StringConstant lhs, const std::string& rhs) noexcept {
54 return rhs == lhs.c_str();
55}
56
57inline bool operator==(const std::string& lhs, StringConstant rhs) noexcept {
58 return lhs == rhs.c_str();
59}
60
61inline bool operator==(StringConstant lhs, const char* rhs) noexcept {
62 return lhs.view() == std::string_view(rhs == nullptr ? "" : rhs);
63}
64
65inline bool operator==(const char* lhs, StringConstant rhs) noexcept {
66 return std::string_view(lhs == nullptr ? "" : lhs) == rhs.view();
67}
68
69inline bool operator!=(StringConstant lhs, StringConstant rhs) noexcept {
70 return !(lhs == rhs);
71}
72
73inline bool operator!=(StringConstant lhs, std::string_view rhs) noexcept {
74 return !(lhs == rhs);
75}
76
77inline bool operator!=(std::string_view lhs, StringConstant rhs) noexcept {
78 return !(lhs == rhs);
79}
80
81inline bool operator!=(StringConstant lhs, const std::string& rhs) noexcept {
82 return !(lhs == rhs);
83}
84
85inline bool operator!=(const std::string& lhs, StringConstant rhs) noexcept {
86 return !(lhs == rhs);
87}
88
89inline bool operator!=(StringConstant lhs, const char* rhs) noexcept {
90 return !(lhs == rhs);
91}
92
93inline bool operator!=(const char* lhs, StringConstant rhs) noexcept {
94 return !(lhs == rhs);
95}
96
97namespace detail {
98
99template <typename T, typename = void>
100struct IsJsonStringLike : std::false_type {};
101
102template <typename T>
103struct IsJsonStringLike<
104 T,
105 std::void_t<decltype(std::declval<const T&>().is_string()),
106 decltype(std::declval<const T&>().template get<std::string>())>>
107 : std::true_type {};
108
109} // namespace detail
110
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();
115}
116
117template <typename JsonLike,
118 std::enable_if_t<detail::IsJsonStringLike<JsonLike>::value, int> = 0>
119inline bool operator==(StringConstant lhs, const JsonLike& rhs) {
120 return rhs == lhs;
121}
122
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);
127}
128
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);
133}
134
135inline std::ostream& operator<<(std::ostream& stream, StringConstant value) {
136 return stream << value.c_str();
137}
138
139} // namespace mcp::core
String-like literal wrapper safe for inline public constants.
Definition string_constant.hpp:23