如何封装两个容器之间的传输字节
How to encapsulate transferring bytes between two containers
我有两个独立的类,每个类都保持有限的缓冲区:
class A {
private:
std::deque<uint8_t> buffer;
size_t max_size;
};
class B {
private:
static const size_t MAX_SIZE = 1024;
uint8_t buffer[MAX_SIZE];
}
现在,我也有一个不是A或B的函数C。此功能需要从a的 bekent 中掌握(即删除(和写入书来写入并写入。它是B. OFC不允许的缓冲溢出。
问题:在确保A和B封装的同时,我该如何有效地进行此操作?IE。A,B和C不知道其他人是如何实施的。
出于明显的原因,我不想要的事情:
- A公开一种将非统一迭代符返回到Deque 的公共方法
- b暴露了一种公共方法,该方法将非符合指针返回到数组
class A
通过新的公共方法返回 const 迭代器。 class B
公开了一种复制这些字节的方法。
class A {
public:
const std::deque<uint8_t>& getBuffer() const
{
return buffer;
}
private:
std::deque<uint8_t> buffer;
size_t max_size;
size_t current_size;
};
class B {
public:
B() : max_size(MAX_SIZE), current_size(0)
{
}
void Transfer(const std::deque<uint8_t>& data)
{
size_t remaining = max_size - current_size;
size_t toCopy = data.size() > remaining ? remaining : data.size();
for (size_t i = 0; i < toCopy; i++)
{
buffer[i+current_size] = data[i];
}
current_size += toCopy;
}
private:
static const size_t MAX_SIZE = 1024;
uint8_t buffer[MAX_SIZE];
};
CopyAToB(const A& a, B& b)
{
b.Transfer(a.getBuffer());
}
模拟标准容器。使用begin
和end
。这是我在您的用例中看到的最小接口:
class A {
private:
std::deque<uint8_t> buffer_;
size_t max_size_;
public:
using const_iterator = decltype(buffer_)::const_iterator;
auto begin() const -> const_iterator { return buffer_.begin(); }
auto end() const -> const_iterator { return buffer_.end(); }
};
class B {
private:
static const size_t MAX_SIZE = 1024;
std::array<uint8_t, MAX_SIZE> buffer_;
public:
/// fills the buffer with elements in [first, last)
/// excessive elements are ignored
/// returns the number of successfully filled elements
template <class It>
auto fill_as_much_as_possible(It first, It last) -> std::size_t
{
auto in_size = std::distance(first, last);
if (in_size > static_cast<decltype(in_size)>(MAX_SIZE))
{
last = first;
std::advance(last, MAX_SIZE);
}
auto out_last = std::copy(first, last, buffer_.begin());
return std::distance(buffer_.begin(), out_last);
}
};
auto foo(const A& a, B& b)
{
b.fill_as_much_as_possible(a.begin(), a.end());
}
相关文章:
- 在 docker 容器之间传输时缺少 stdlib 符号
- 读取USB与操作系统、C++之间传输的数据
- 使用 python 胶囊在 cython 和 pybind11 之间传输 c++ 对象
- TCP在客户端服务器之间传输时,数据是否有任何限制
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 通过TCP在客户端/ C#服务器之间传输文件C++
- C++函数之间传输字符串
- 无法使用<double> QTcpSocket 和 QDataStream 在服务器和客户端之间传输 QVector
- 如何在"mwArray *"和"mxArray *"之间传输数据?
- 如何在C 中连接两个对象以在它们之间传输数据
- 是否可以在GDB会话之间传输对程序的控制
- 为什么我的数据无法在信号/插槽的表格之间传输
- C++在32位应用程序之间传输大量数据以进行视频播放的方法
- 在 2 个程序 (Windows) 之间传输信息
- 在两个套接字c++之间传输整数值
- 可以在 C# 和C++之间传输的数据类型
- 在单声道项目和 C++ 控制台应用之间传输数据
- 在列表小部件之间传输数据
- 在 C++11 中,std::atomic 是否可以用于在两个线程之间传输非原子数据
- 在小部件之间传输标准::unique_ptr