25 { std::array<boost::asio::const_buffer, 3u> s; buffer.
copy_from(s); }
26 { std::array<boost::asio::mutable_buffer, 3u> s; buffer.
copy_from(s); }
27 { std::vector<boost::asio::const_buffer> s; buffer.
copy_from(s); }
28 { std::vector<boost::asio::mutable_buffer> s; buffer.
copy_from(s); }
29 { std::list<boost::asio::const_buffer> s; buffer.
copy_from(s); }
30 { std::list<boost::asio::mutable_buffer> s; buffer.
copy_from(s); }
31 { std::set<boost::asio::const_buffer> s; buffer.
copy_from(s); }
32 { std::set<boost::asio::mutable_buffer> s; buffer.
copy_from(s); }
34 { boost::asio::const_buffer v; buffer.
copy_from(v); }
35 { boost::asio::mutable_buffer v; buffer.
copy_from(v); }
37 { std::vector<int> v; buffer.
copy_from(v); }
40 {
struct C {
int x = 0; } v[3u]; buffer.
copy_from(v); }
41 {
struct C {
int x = 0; }; std::array<C, 3u> v; buffer.
copy_from(v); }
42 {
struct C {
int x = 0; }; std::vector<C> v; buffer.
copy_from(v); }
47TEST(buffer, copy_buffer_sequence) {
48 constexpr auto number_of_buffers = 15u;
49 const std::string str =
"WXdI<x->+<If$ua>$pu1AUBmS]?_PT{3z$B7L(E|?$]";
51 std::array<Buffer, number_of_buffers> buffers;
52 std::array<boost::asio::const_buffer, number_of_buffers> sequence;
53 for (
auto i = 0u; i < number_of_buffers; ++i) {
55 buffers[i].copy_from(str);
56 sequence[i] = buffers[i].buffer();
61 auto result =
Buffer(sequence);
62 ASSERT_EQ(result.size(), message.size());
65 ASSERT_EQ(result_str, message);
70TEST(buffer, to_from_string) {
71 const std::string str =
"The quick brown fox jumps over the lazy dog";
76 ASSERT_EQ(buffer.
size(), str.size());
80 const std::string result =
as_string(buffer);
81 ASSERT_EQ(result, str);
86TEST(buffer, to_from_vector) {
87 constexpr auto size = 1000u;
92 for (
auto i = 0u; i < size; ++i) {
99 ASSERT_EQ(buffer.
size(),
sizeof(T) * size);
100 auto begin =
reinterpret_cast<const T *
>(buffer.
data());
104 ASSERT_EQ(result, v);
113 cpy->copy_from(*msg);
114 ASSERT_EQ(msg->size(), cpy->size());
115 ASSERT_EQ(*cpy, *msg);
120TEST(buffer, copy_with_offset) {
121 const char str0[] =
"Hello";
122 const char str1[] =
"buffer!";
129 reinterpret_cast<const unsigned char *
>(&str1),
131 std::memcpy(buffer.
data(), str0, std::strlen(str0));
132 buffer[std::strlen(str0)] =
' ';
133 auto str = std::string(str0) +
" " + str1;
134 ASSERT_EQ(buffer.
size(), str.size());
135 ASSERT_EQ(
as_string(buffer), str.c_str());
144 ASSERT_EQ(msg->size(), cpy->size());
145 auto buffer = cpy->buffer();
146 std::memcpy(buffer.data(), msg->data(), buffer.size());
147 ASSERT_EQ(*cpy, *msg);
150#ifndef LIBCARLA_NO_EXCEPTIONS
155 ASSERT_THROW(
Buffer(4294967296ul), std::invalid_argument);
157 ASSERT_THROW(buf.
reset(4294967296ul), std::invalid_argument);
165 const std::string str =
"Hello buffer!";
167 auto pool = std::make_shared<carla::BufferPool>();
169 auto buff = pool->Pop();
172 auto buff1 = pool->Pop();
174 auto buff2 = pool->Pop();
auto begin() const noexcept
名称范围迭代支持
一块原始数据。 请注意,如果需要更多容量,则会分配一个新的内存块,并 删除旧的内存块。这意味着默认情况下,缓冲区只能增长。要释放内存,使用 clear 或 pop。
const value_type * data() const noexcept
直接访问分配的内存,如果没有分配内存则返回 nullptr。
void reset(size_type size)
重置缓冲区的大小。如果容量不足,当前内存将被丢弃,并分配一个新的大小为 size的内存块。 allocated.
size_type size() const noexcept
void copy_from(const T &source)
将 source复制到此缓冲区。如果需要,则分配内存。
static std::string as_string(const Buffer &buf)
static shared_buffer make_empty(size_t size=0u)
shared_buffer make_random(size_t size)