Condy v1.1.0
C++ Asynchronous System Call Layer for Linux
Loading...
Searching...
No Matches
buffers.hpp
Go to the documentation of this file.
1
7
8#pragma once
9
10#include <cassert>
11#include <cstddef>
12#include <cstring>
13#include <string>
14#include <sys/mman.h>
15#include <sys/uio.h>
16#include <vector>
17
18namespace condy {
19
20// Just a tag
21class BufferBase {};
22
26class MutableBuffer : public BufferBase {
27public:
28 MutableBuffer() = default;
29 MutableBuffer(void *data, size_t size) : data_(data), size_(size) {}
30
34 void *data() const { return data_; }
35
39 size_t size() const { return size_; }
40
41private:
42 void *data_ = nullptr;
43 size_t size_ = 0;
44};
45
49class ConstBuffer : public BufferBase {
50public:
51 ConstBuffer() = default;
52 ConstBuffer(const void *data, size_t size) : data_(data), size_(size) {}
53
54 ConstBuffer(MutableBuffer buf) : data_(buf.data()), size_(buf.size()) {}
55 ConstBuffer &operator=(MutableBuffer buf) {
56 data_ = buf.data();
57 size_ = buf.size();
58 return *this;
59 }
60
64 const void *data() const { return data_; }
65
69 size_t size() const { return size_; }
70
71private:
72 const void *data_ = nullptr;
73 size_t size_ = 0;
74};
75
84inline MutableBuffer buffer(void *data, size_t size) {
85 return MutableBuffer(data, size);
86}
87
91inline ConstBuffer buffer(const void *data, size_t size) {
92 return ConstBuffer(data, size);
93}
94
98template <typename PodType, size_t N>
99inline MutableBuffer buffer(PodType (&arr)[N]) {
100 return MutableBuffer(static_cast<void *>(arr), sizeof(PodType) * N);
101}
102
106template <typename PodType, size_t N>
107inline ConstBuffer buffer(const PodType (&arr)[N]) {
108 return ConstBuffer(static_cast<const void *>(arr), sizeof(PodType) * N);
109}
110
114template <typename PodType, size_t N>
115inline MutableBuffer buffer(std::array<PodType, N> &arr) {
116 return MutableBuffer(static_cast<void *>(arr.data()), sizeof(PodType) * N);
117}
118
122template <typename PodType, size_t N>
123inline ConstBuffer buffer(const std::array<PodType, N> &arr) {
124 return ConstBuffer(static_cast<const void *>(arr.data()),
125 sizeof(PodType) * N);
126}
127
131template <typename PodType>
132inline MutableBuffer buffer(std::vector<PodType> &vec) {
133 return MutableBuffer(static_cast<void *>(vec.data()),
134 sizeof(PodType) * vec.size());
135}
136
140template <typename PodType>
141inline ConstBuffer buffer(const std::vector<PodType> &vec) {
142 return ConstBuffer(static_cast<const void *>(vec.data()),
143 sizeof(PodType) * vec.size());
144}
145
149inline MutableBuffer buffer(std::string &str) {
150 return MutableBuffer(static_cast<void *>(str.data()), str.size());
151}
152
156inline ConstBuffer buffer(const std::string &str) {
157 return ConstBuffer(static_cast<const void *>(str.data()), str.size());
158}
159
163inline ConstBuffer buffer(std::string_view strv) {
164 return ConstBuffer(static_cast<const void *>(strv.data()), strv.size());
165}
166
170inline MutableBuffer buffer(iovec &iov) {
171 return MutableBuffer(iov.iov_base, iov.iov_len);
172}
173
174} // namespace condy
Constant buffer.
Definition buffers.hpp:49
size_t size() const
Get the byte size of the buffer.
Definition buffers.hpp:69
const void * data() const
Get the data of the buffer.
Definition buffers.hpp:64
Mutable buffer.
Definition buffers.hpp:26
void * data() const
Get the data of the buffer.
Definition buffers.hpp:34
size_t size() const
Get the byte size of the buffer.
Definition buffers.hpp:39
The main namespace for the Condy library.
Definition condy.hpp:28
MutableBuffer buffer(void *data, size_t size)
Create a buffer object from various data sources.
Definition buffers.hpp:84