]> git.proxmox.com Git - ceph.git/blob - ceph/src/common/buffer_seastar.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / common / buffer_seastar.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #include <seastar/core/temporary_buffer.hh>
5 #include "include/buffer.h"
6 #include "common/error_code.h"
7
8 namespace details {
9
10 template<bool is_const>
11 class buffer_iterator_impl {
12 public:
13 using pointer = std::conditional_t<is_const, const char*, char *>;
14 buffer_iterator_impl(pointer first, const char* last)
15 : pos(first), end_ptr(last)
16 {}
17 pointer get_pos_add(size_t n) {
18 auto r = pos;
19 pos += n;
20 if (pos > end_ptr) {
21 throw buffer::end_of_buffer{};
22 }
23 return r;
24 }
25 pointer get() const {
26 return pos;
27 }
28 protected:
29 pointer pos;
30 const char* end_ptr;
31 };
32 } // namespace details
33
34 class seastar_buffer_iterator : details::buffer_iterator_impl<false> {
35 using parent = details::buffer_iterator_impl<false>;
36 using temporary_buffer = seastar::temporary_buffer<char>;
37 public:
38 seastar_buffer_iterator(temporary_buffer& b)
39 : parent(b.get_write(), b.end()), buf(b)
40 {}
41 using parent::pointer;
42 using parent::get_pos_add;
43 using parent::get;
44 ceph::buffer::ptr get_ptr(size_t len);
45
46 private:
47 // keep the reference to buf around, so it can be "shared" by get_ptr()
48 temporary_buffer& buf;
49 };
50
51 class const_seastar_buffer_iterator : details::buffer_iterator_impl<true> {
52 using parent = details::buffer_iterator_impl<true>;
53 using temporary_buffer = seastar::temporary_buffer<char>;
54 public:
55 const_seastar_buffer_iterator(temporary_buffer& b)
56 : parent(b.get_write(), b.end())
57 {}
58 using parent::pointer;
59 using parent::get_pos_add;
60 using parent::get;
61 ceph::buffer::ptr get_ptr(size_t len);
62 };