]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
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" | |
f67539c2 | 6 | #include "common/error_code.h" |
11fdf7f2 TL |
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 | }; |