NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
buffer_chain.hpp
1#ifndef NEFORCE_CORE_CONTAINER_BUFFER_CHAIN_HPP__
2#define NEFORCE_CORE_CONTAINER_BUFFER_CHAIN_HPP__
4#ifdef NEFORCE_PLATFORM_LINUX
5# include <sys/uio.h>
6#endif
7#ifdef NEFORCE_PLATFORM_WINDOWS
8struct iovec {
9 void* iov_base;
10 size_t iov_len;
11};
12#endif
13NEFORCE_BEGIN_NAMESPACE__
14
22class buffer_chain {
23public:
24 struct segment {
25 const char* data{nullptr};
26 size_t size{0};
27 };
28
29private:
30 vector<segment> segments_;
31 size_t total_size_{0};
32
33public:
34 buffer_chain() = default;
35
39 void append(const char* data, size_t size) {
40 segments_.push_back({data, size});
41 total_size_ += size;
42 }
43
47 void append(const string_view sv) { append(sv.data(), sv.size()); }
48
52 void append(const buffer_chain& other) {
53 segments_.insert(segments_.end(), other.segments_.begin(), other.segments_.end());
54 total_size_ += other.total_size_;
55 }
56
60 NEFORCE_NODISCARD string flatten() const {
61 string result;
62 result.reserve(total_size_);
63 for (const auto& seg: segments_) {
64 result.append(seg.data, seg.size);
65 }
66 return result;
67 }
68
72 NEFORCE_NODISCARD vector<::iovec> to_iovec() const {
74 iov.reserve(segments_.size());
75 for (const auto& seg: segments_) {
76 ::iovec v{};
77 v.iov_base = const_cast<char*>(seg.data);
78 v.iov_len = seg.size;
79 iov.push_back(v);
80 }
81 return iov;
82 }
83
84 NEFORCE_NODISCARD size_t total_size() const noexcept { return total_size_; }
85 NEFORCE_NODISCARD size_t segment_count() const noexcept { return segments_.size(); }
86 NEFORCE_NODISCARD bool empty() const noexcept { return total_size_ == 0; }
87
88 void clear() noexcept {
89 segments_.clear();
90 total_size_ = 0;
91 }
92
93 void reserve(size_t count) { segments_.reserve(count); }
94};
95
96NEFORCE_END_NAMESPACE__
97#endif // NEFORCE_CORE_CONTAINER_BUFFER_CHAIN_HPP__
constexpr size_type size() const noexcept
获取字符串长度
constexpr const_pointer data() const noexcept
获取底层数据指针
constexpr basic_string & append(size_type n, value_type value)
追加多个相同字符
constexpr void reserve(const size_type n)
预留容量
void append(const string_view sv)
追加 string_view
void append(const buffer_chain &other)
追加另一个 buffer_chain 的内容
string flatten() const
合并所有段为单一字符串
void append(const char *data, size_t size)
追加数据视图
vector<::iovec > to_iovec() const
构建 writev iovec 数组
动态大小数组容器
constexpr iterator begin() noexcept
获取起始迭代器
constexpr size_type size() const noexcept
获取当前元素数量
constexpr void reserve(const size_type n)
预留容量
constexpr void push_back(const T &value)
在末尾拷贝插入元素
constexpr void clear() noexcept(is_nothrow_destructible_v< value_type >)
清空向量
constexpr iterator end() noexcept
获取结束迭代器
basic_string_view< char > string_view
字符字符串视图
constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
字符串类型别名和实用函数