Condy v1.5.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 <span>
14#include <string>
15#include <sys/mman.h>
16#include <sys/uio.h>
17#include <vector>
18
19namespace condy {
20
21// Just a tag
22class BufferBase {};
23
27class MutableBuffer : public BufferBase {
28public:
29 MutableBuffer() = default;
30 MutableBuffer(void *data, size_t size) : data_(data), size_(size) {}
31
35 void *data() const { return data_; }
36
40 size_t size() const { return size_; }
41
42private:
43 void *data_ = nullptr;
44 size_t size_ = 0;
45};
46
50class ConstBuffer : public BufferBase {
51public:
52 ConstBuffer() = default;
53 ConstBuffer(const void *data, size_t size) : data_(data), size_(size) {}
54
55 ConstBuffer(MutableBuffer buf) : data_(buf.data()), size_(buf.size()) {}
56 ConstBuffer &operator=(MutableBuffer buf) {
57 data_ = buf.data();
58 size_ = buf.size();
59 return *this;
60 }
61
65 const void *data() const { return data_; }
66
70 size_t size() const { return size_; }
71
72private:
73 const void *data_ = nullptr;
74 size_t size_ = 0;
75};
76
85inline MutableBuffer buffer(void *data, size_t size) {
86 return MutableBuffer(data, size);
87}
88
92inline ConstBuffer buffer(const void *data, size_t size) {
93 return ConstBuffer(data, size);
94}
95
99template <typename PodType, size_t N>
100inline MutableBuffer buffer(PodType (&arr)[N]) {
101 return MutableBuffer(static_cast<void *>(arr), sizeof(PodType) * N);
102}
103
107template <typename PodType, size_t N>
108inline ConstBuffer buffer(const PodType (&arr)[N]) {
109 return ConstBuffer(static_cast<const void *>(arr), sizeof(PodType) * N);
110}
111
115template <typename PodType, size_t N>
116inline MutableBuffer buffer(std::array<PodType, N> &arr) {
117 return MutableBuffer(static_cast<void *>(arr.data()), sizeof(PodType) * N);
118}
119
123template <typename PodType, size_t N>
124inline ConstBuffer buffer(const std::array<PodType, N> &arr) {
125 return ConstBuffer(static_cast<const void *>(arr.data()),
126 sizeof(PodType) * N);
127}
128
132template <typename PodType>
133inline MutableBuffer buffer(std::vector<PodType> &vec) {
134 return MutableBuffer(static_cast<void *>(vec.data()),
135 sizeof(PodType) * vec.size());
136}
137
141template <typename PodType>
142inline ConstBuffer buffer(const std::vector<PodType> &vec) {
143 return ConstBuffer(static_cast<const void *>(vec.data()),
144 sizeof(PodType) * vec.size());
145}
146
150inline MutableBuffer buffer(std::string &str) {
151 return MutableBuffer(static_cast<void *>(str.data()), str.size());
152}
153
157inline ConstBuffer buffer(const std::string &str) {
158 return ConstBuffer(static_cast<const void *>(str.data()), str.size());
159}
160
164inline ConstBuffer buffer(std::string_view strv) {
165 return ConstBuffer(static_cast<const void *>(strv.data()), strv.size());
166}
167
171inline MutableBuffer buffer(iovec &iov) {
172 return MutableBuffer(iov.iov_base, iov.iov_len);
173}
174
178template <typename PodType, size_t N>
179inline ConstBuffer buffer(std::span<const PodType, N> sp) {
180 return ConstBuffer(static_cast<const void *>(sp.data()),
181 sp.size() * sizeof(PodType));
182}
183
187template <typename PodType, size_t N>
188inline MutableBuffer buffer(std::span<PodType, N> sp) {
189 return MutableBuffer(static_cast<void *>(sp.data()),
190 sp.size() * sizeof(PodType));
191}
192
193} // namespace condy
Constant buffer.
Definition buffers.hpp:50
size_t size() const
Get the byte size of the buffer.
Definition buffers.hpp:70
const void * data() const
Get the data of the buffer.
Definition buffers.hpp:65
Mutable buffer.
Definition buffers.hpp:27
void * data() const
Get the data of the buffer.
Definition buffers.hpp:35
size_t size() const
Get the byte size of the buffer.
Definition buffers.hpp:40
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:85