1#ifndef NEFORCE_CORE_STRING_STRING_BUILDER_HPP__
2#define NEFORCE_CORE_STRING_STRING_BUILDER_HPP__
12NEFORCE_BEGIN_NAMESPACE__
44 void reserve(
const size_t n) { reserved_size_ = n; }
52 pieces_.push_back(sv);
53 total_size_ += sv.
size();
77 owned_pieces_.emplace_back(1, c);
78 pieces_.push_back(owned_pieces_.back().view());
89 template <
typename T,
typename P = package_t<T>,
90 enable_if_t<is_packaged_v<T> && is_base_of_v<i
stringify<P>, P>,
int> = 0>
92 owned_pieces_.push_back(P(value).
to_string());
93 pieces_.push_back(owned_pieces_.back().view());
94 total_size_ += owned_pieces_.back().
size();
104 template <
typename T, enable_if_t<is_base_of_v<i
stringify<T>, T>,
int> = 0>
106 owned_pieces_.push_back(value.to_string());
107 pieces_.push_back(owned_pieces_.back().view());
108 total_size_ += owned_pieces_.back().
size();
116 NEFORCE_NODISCARD
string build()
const {
118 const size_t alloc_size =
max(reserved_size_, total_size_);
120 for (
const auto& piece: pieces_) {
121 result.
append(piece.data(), piece.size());
136 NEFORCE_NODISCARD
size_t size() const noexcept {
return total_size_; }
142 NEFORCE_NODISCARD
bool empty() const noexcept {
return total_size_ == 0; }
149 owned_pieces_.clear();
157 size_t total_size_ = 0;
158 size_t reserved_size_ = 0;
164#ifdef NEFORCE_STANDARD_17
165template <
typename... Args>
166void __concat_append(string_builder& sb, Args&&... args) {
167 (sb.append(_NEFORCE forward<Args>(args)), ...);
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)...);
175template <
typename Last>
176void __concat_append(string_builder& sb, Last&& last) {
177 sb.append(_NEFORCE forward<Last>(last));
190template <
typename... Args,
enable_if_t<(
sizeof...(Args) > 0),
int> = 0>
199NEFORCE_END_NAMESPACE__
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)
将字符转换为普通字符串