NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
string_builder.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_STRING_BUILDER_HPP__
2#define NEFORCE_CORE_STRING_STRING_BUILDER_HPP__
3
10
12NEFORCE_BEGIN_NAMESPACE__
13
18
28public:
32 string_builder() = default;
33
38 void reserve_pieces(const size_t n) { pieces_.reserve(n); }
39
44 void reserve(const size_t n) { reserved_size_ = n; }
45
52 pieces_.push_back(sv);
53 total_size_ += sv.size();
54 return *this;
55 }
56
62 string_builder& append(const string& str) { return append(str.view()); }
63
69 string_builder& append(const char* str) { return append(string_view(str)); }
70
76 string_builder& append(const char c) {
77 owned_pieces_.emplace_back(1, c);
78 pieces_.push_back(owned_pieces_.back().view());
79 total_size_ += 1;
80 return *this;
81 }
82
89 template <typename T, typename P = package_t<T>,
90 enable_if_t<is_packaged_v<T> && is_base_of_v<istringify<P>, P>, int> = 0>
91 string_builder& append(const T& value) {
92 owned_pieces_.push_back(P(value).to_string());
93 pieces_.push_back(owned_pieces_.back().view());
94 total_size_ += owned_pieces_.back().size();
95 return *this;
96 }
97
104 template <typename T, enable_if_t<is_base_of_v<istringify<T>, T>, int> = 0>
105 string_builder& append(const T& value) {
106 owned_pieces_.push_back(value.to_string());
107 pieces_.push_back(owned_pieces_.back().view());
108 total_size_ += owned_pieces_.back().size();
109 return *this;
110 }
111
116 NEFORCE_NODISCARD string build() const {
117 string result;
118 const size_t alloc_size = max(reserved_size_, total_size_);
119 result.reserve(alloc_size);
120 for (const auto& piece: pieces_) {
121 result.append(piece.data(), piece.size());
122 }
123 return result;
124 }
125
130 NEFORCE_NODISCARD operator string() const { return build(); }
131
136 NEFORCE_NODISCARD size_t size() const noexcept { return total_size_; }
137
142 NEFORCE_NODISCARD bool empty() const noexcept { return total_size_ == 0; }
143
147 void clear() noexcept {
148 pieces_.clear();
149 owned_pieces_.clear();
150 total_size_ = 0;
151 reserved_size_ = 0;
152 }
153
154private:
155 vector<string_view> pieces_;
156 vector<string> owned_pieces_;
157 size_t total_size_ = 0;
158 size_t reserved_size_ = 0;
159};
160
162NEFORCE_BEGIN_INNER__
163
164#ifdef NEFORCE_STANDARD_17
165template <typename... Args>
166void __concat_append(string_builder& sb, Args&&... args) {
167 (sb.append(_NEFORCE forward<Args>(args)), ...);
168}
169#else
170template <typename First, typename... Rest>
171void __concat_append(string_builder& sb, First&& first, Rest&&... rest) {
172 sb.append(_NEFORCE forward<First>(first));
173 __concat_append(sb, _NEFORCE forward<Rest>(rest)...);
174}
175template <typename Last>
176void __concat_append(string_builder& sb, Last&& last) {
177 sb.append(_NEFORCE forward<Last>(last));
178}
179#endif
180
181NEFORCE_END_INNER__
183
190template <typename... Args, enable_if_t<(sizeof...(Args) > 0), int> = 0>
191NEFORCE_NODISCARD string concatenate(Args&&... args) {
193 inner::__concat_append(sb, _NEFORCE forward<Args>(args)...);
194 return sb.build();
195}
196 // String
198
199NEFORCE_END_NAMESPACE__
200#endif // NEFORCE_CORE_STRING_STRING_BUILDER_HPP__
constexpr size_type size() const noexcept
获取字符串长度
constexpr view_type view() const noexcept
获取字符串视图
constexpr basic_string & append(size_type n, value_type value)
追加多个相同字符
constexpr void reserve(const size_type n)
预留容量
延迟拼接的字符串构建器
void clear() noexcept
清空所有已收集的片段
size_t size() const noexcept
当前总字符数
string_builder & append(const string_view sv)
追加字符串视图
void reserve(const size_t n)
预留输出总大小
string_builder & append(const T &value)
追加任意可转为字符串的值
void reserve_pieces(const size_t n)
预留片段容量
string_builder & append(const char *str)
追加 C 风格字符串
bool empty() const noexcept
是否为空
string_builder & append(const char c)
追加单个字符
string_builder & append(const string &str)
追加字符串
string_builder & append(const T &value)
追加任意可转为字符串的值
string_builder()=default
默认构造函数
string build() const
构建字符串
动态大小数组容器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
basic_string< char > string
字符字符串
string concatenate(Args &&... args)
拼接参数
basic_string_view< char > string_view
字符字符串视图
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
constexpr string to_string(const CharT &c)
将字符转换为普通字符串
可字符串化接口