Seastar
High performance C++ framework for concurrent servers
temporary_buffer.hh
1 /*
2  * This file is open source software, licensed to you under the terms
3  * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4  * distributed with this work for additional information regarding copyright
5  * ownership. You may not use this file except in compliance with the License.
6  *
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing,
12  * software distributed under the License is distributed on an
13  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14  * KIND, either express or implied. See the License for the
15  * specific language governing permissions and limitations
16  * under the License.
17  */
18 /*
19  * Copyright (C) 2014 Cloudius Systems, Ltd.
20  */
21 
22 #pragma once
23 
24 #ifndef SEASTAR_MODULE
25 #include <algorithm>
26 #include <cstddef>
27 #include <string_view>
28 #include <malloc.h>
29 #endif
30 #include <seastar/core/deleter.hh>
31 #include <seastar/util/eclipse.hh>
32 #include <seastar/util/std-compat.hh>
33 #include <seastar/util/modules.hh>
34 
35 namespace seastar {
36 
39 
65 SEASTAR_MODULE_EXPORT
66 template <typename CharType>
68  static_assert(sizeof(CharType) == 1, "must buffer stream of bytes");
69  CharType* _buffer;
70  size_t _size;
71  deleter _deleter;
72 public:
77  explicit temporary_buffer(size_t size)
78  : _buffer(static_cast<CharType*>(malloc(size * sizeof(CharType)))), _size(size)
79  , _deleter(make_free_deleter(_buffer)) {
80  if (size && !_buffer) {
81  throw std::bad_alloc();
82  }
83  }
84  //explicit temporary_buffer(CharType* borrow, size_t size) : _buffer(borrow), _size(size) {}
86  temporary_buffer() noexcept
87  : _buffer(nullptr)
88  , _size(0) {}
89  temporary_buffer(const temporary_buffer&) = delete;
90 
92  temporary_buffer(temporary_buffer&& x) noexcept : _buffer(x._buffer), _size(x._size), _deleter(std::move(x._deleter)) {
93  x._buffer = nullptr;
94  x._size = 0;
95  }
96 
103  temporary_buffer(CharType* buf, size_t size, deleter d) noexcept
104  : _buffer(buf), _size(size), _deleter(std::move(d)) {}
109  temporary_buffer(const CharType* src, size_t size) : temporary_buffer(size) {
110  std::copy_n(src, size, _buffer);
111  }
112  void operator=(const temporary_buffer&) = delete;
115  if (this != &x) {
116  _buffer = x._buffer;
117  _size = x._size;
118  _deleter = std::move(x._deleter);
119  x._buffer = nullptr;
120  x._size = 0;
121  }
122  return *this;
123  }
125  const CharType* get() const noexcept { return _buffer; }
128  CharType* get_write() noexcept { return _buffer; }
130  size_t size() const noexcept { return _size; }
132  const CharType* begin() const noexcept { return _buffer; }
134  const CharType* end() const noexcept { return _buffer + _size; }
140  temporary_buffer prefix(size_t size) && noexcept {
141  auto ret = std::move(*this);
142  ret._size = size;
143  return ret;
144  }
148  CharType operator[](size_t pos) const noexcept {
149  return _buffer[pos];
150  }
152  bool empty() const noexcept { return !size(); }
154  explicit operator bool() const noexcept { return size(); }
161  return temporary_buffer(_buffer, _size, _deleter.share());
162  }
170  temporary_buffer share(size_t pos, size_t len) {
171  auto ret = share();
172  ret._buffer += pos;
173  ret._size = len;
174  return ret;
175  }
180  return {_buffer, _size};
181  }
186  void trim_front(size_t pos) noexcept {
187  _buffer += pos;
188  _size -= pos;
189  }
194  void trim(size_t pos) noexcept {
195  _size = pos;
196  }
203  deleter release() noexcept {
204  return std::move(_deleter);
205  }
212  static temporary_buffer aligned(size_t alignment, size_t size) {
213  void *ptr = nullptr;
214  auto ret = ::posix_memalign(&ptr, alignment, size * sizeof(CharType));
215  auto buf = static_cast<CharType*>(ptr);
216  if (ret) {
217  throw std::bad_alloc();
218  }
219  return temporary_buffer(buf, size, make_free_deleter(buf));
220  }
221 
222  static temporary_buffer copy_of(std::string_view view) {
223  void* ptr = ::malloc(view.size());
224  if (!ptr) {
225  throw std::bad_alloc();
226  }
227  auto buf = static_cast<CharType*>(ptr);
228  memcpy(buf, view.data(), view.size());
229  return temporary_buffer(buf, view.size(), make_free_deleter(buf));
230  }
231 
236  bool operator==(const temporary_buffer& o) const noexcept {
237  return size() == o.size() && std::equal(begin(), end(), o.begin());
238  }
239 
244  bool operator!=(const temporary_buffer& o) const noexcept {
245  return !(*this == o);
246  }
247 };
248 
250 
251 }
Definition: deleter.hh:51
Definition: temporary_buffer.hh:67
temporary_buffer(CharType *buf, size_t size, deleter d) noexcept
Definition: temporary_buffer.hh:103
const CharType * get() const noexcept
Gets a pointer to the beginning of the buffer.
Definition: temporary_buffer.hh:125
temporary_buffer clone() const
Definition: temporary_buffer.hh:179
temporary_buffer(temporary_buffer &&x) noexcept
Moves a temporary_buffer.
Definition: temporary_buffer.hh:92
void trim(size_t pos) noexcept
Definition: temporary_buffer.hh:194
deleter release() noexcept
Definition: temporary_buffer.hh:203
bool empty() const noexcept
Checks whether the buffer is empty.
Definition: temporary_buffer.hh:152
bool operator==(const temporary_buffer &o) const noexcept
Definition: temporary_buffer.hh:236
const CharType * end() const noexcept
Gets a pointer to the end of the buffer.
Definition: temporary_buffer.hh:134
temporary_buffer share(size_t pos, size_t len)
Definition: temporary_buffer.hh:170
temporary_buffer share()
Definition: temporary_buffer.hh:160
temporary_buffer() noexcept
Creates an empty temporary_buffer that does not point at anything.
Definition: temporary_buffer.hh:86
temporary_buffer(size_t size)
Definition: temporary_buffer.hh:77
CharType * get_write() noexcept
Definition: temporary_buffer.hh:128
temporary_buffer & operator=(temporary_buffer &&x) noexcept
Moves a temporary_buffer.
Definition: temporary_buffer.hh:114
void trim_front(size_t pos) noexcept
Definition: temporary_buffer.hh:186
size_t size() const noexcept
Gets the buffer size.
Definition: temporary_buffer.hh:130
CharType operator[](size_t pos) const noexcept
Definition: temporary_buffer.hh:148
static temporary_buffer aligned(size_t alignment, size_t size)
Definition: temporary_buffer.hh:212
temporary_buffer(const CharType *src, size_t size)
Definition: temporary_buffer.hh:109
bool operator!=(const temporary_buffer &o) const noexcept
Definition: temporary_buffer.hh:244
const CharType * begin() const noexcept
Gets a pointer to the beginning of the buffer.
Definition: temporary_buffer.hh:132
temporary_buffer prefix(size_t size) &&noexcept
Definition: temporary_buffer.hh:140
deleter share()
Definition: deleter.hh:204
Seastar API namespace.
Definition: abort_on_ebadf.hh:26