xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
xrpld
overlay
detail
ZeroCopyStream.h
1
#pragma once
2
3
#include <xrpl/beast/utility/instrumentation.h>
4
5
#include <boost/asio/buffer.hpp>
6
7
#include <google/protobuf/io/zero_copy_stream.h>
8
9
#include <
cstddef
>
10
#include <
cstdint
>
11
12
namespace
xrpl
{
13
20
template
<
class
Buffers>
21
class
ZeroCopyInputStream
:
public
::google::protobuf::io::ZeroCopyInputStream
22
{
23
private
:
24
using
iterator
= Buffers::const_iterator;
25
using
ConstBuffer
= boost::asio::const_buffer;
26
27
std::int64_t
count_
= 0;
28
iterator
last_
;
29
iterator
first_
;
// Where pos_ comes from
30
ConstBuffer
pos_
;
// What Next() will return
31
32
public
:
33
explicit
ZeroCopyInputStream
(Buffers
const
& buffers);
34
35
bool
36
Next
(
void
const
** data,
int
* size)
override
;
37
38
void
39
BackUp
(
int
count)
override
;
40
41
bool
42
Skip
(
int
count)
override
;
43
44
[[nodiscard]]
std::int64_t
45
ByteCount
()
const override
46
{
47
return
count_
;
48
}
49
};
50
51
//------------------------------------------------------------------------------
52
53
template
<
class
Buffers>
54
ZeroCopyInputStream<Buffers>::ZeroCopyInputStream
(Buffers
const
& buffers)
55
:
last_
(buffers.end())
56
,
first_
(buffers.begin())
57
,
pos_
((
first_
!=
last_
) ? *
first_
:
ConstBuffer
(nullptr, 0))
58
{
59
}
60
61
template
<
class
Buffers>
62
bool
63
ZeroCopyInputStream<Buffers>::Next
(
void
const
** data,
int
* size)
64
{
65
*data =
pos_
.data();
66
*size = boost::asio::buffer_size(
pos_
);
67
if
(
first_
==
last_
)
68
return
false
;
69
count_
+= *size;
70
pos_
= (++
first_
!=
last_
) ? *
first_
:
ConstBuffer
(
nullptr
, 0);
71
return
true
;
72
}
73
74
template
<
class
Buffers>
75
void
76
ZeroCopyInputStream<Buffers>::BackUp
(
int
count)
77
{
78
--
first_
;
79
pos_
= *
first_
+ (boost::asio::buffer_size(*
first_
) - count);
80
count_
-= count;
81
}
82
83
template
<
class
Buffers>
84
bool
85
ZeroCopyInputStream<Buffers>::Skip
(
int
count)
86
{
87
if
(
first_
==
last_
)
88
return
false
;
89
while
(count > 0)
90
{
91
auto
const
size = boost::asio::buffer_size(
pos_
);
92
if
(count < size)
93
{
94
pos_
=
pos_
+ count;
95
count_
+= count;
96
return
true
;
97
}
98
count_
+= size;
99
if
(++
first_
==
last_
)
100
return
false
;
101
count -= size;
102
pos_
= *
first_
;
103
}
104
return
true
;
105
}
106
107
//------------------------------------------------------------------------------
108
114
template
<
class
Streambuf>
115
class
ZeroCopyOutputStream
:
public
::google::protobuf::io::ZeroCopyOutputStream
116
{
117
private
:
118
using
BuffersType
= Streambuf::mutable_buffers_type;
119
using
iterator
= BuffersType::const_iterator;
120
using
MutableBuffer
= boost::asio::mutable_buffer;
121
122
Streambuf&
streambuf_
;
123
std::size_t
blockSize_
;
124
std::int64_t
count_
= 0;
125
std::size_t
commit_
= 0;
126
BuffersType
buffers_
;
127
iterator
pos_
;
128
129
public
:
130
explicit
ZeroCopyOutputStream
(Streambuf& streambuf,
std::size_t
blockSize);
131
132
~ZeroCopyOutputStream
()
override
;
133
134
bool
135
Next
(
void
** data,
int
* size)
override
;
136
137
void
138
BackUp
(
int
count)
override
;
139
140
[[nodiscard]]
std::int64_t
141
ByteCount
()
const override
142
{
143
return
count_
;
144
}
145
};
146
147
//------------------------------------------------------------------------------
148
149
template
<
class
Streambuf>
150
ZeroCopyOutputStream<Streambuf>::ZeroCopyOutputStream
(Streambuf& streambuf,
std::size_t
blockSize)
151
:
streambuf_
(streambuf)
152
,
blockSize_
(blockSize)
153
,
buffers_
(
streambuf_
.prepare(
blockSize_
))
154
,
pos_
(
buffers_
.begin())
155
{
156
}
157
158
template
<
class
Streambuf>
159
ZeroCopyOutputStream<Streambuf>::~ZeroCopyOutputStream
()
160
{
161
if
(
commit_
!= 0)
162
streambuf_
.commit(
commit_
);
163
}
164
165
template
<
class
Streambuf>
166
bool
167
ZeroCopyOutputStream<Streambuf>::Next
(
void
** data,
int
* size)
168
{
169
if
(
commit_
!= 0)
170
{
171
streambuf_
.commit(
commit_
);
172
count_
+=
commit_
;
173
}
174
175
if
(
pos_
==
buffers_
.end())
176
{
177
buffers_
=
streambuf_
.prepare(
blockSize_
);
178
pos_
=
buffers_
.begin();
179
}
180
181
*data = *
pos_
.data();
182
*size = boost::asio::buffer_size(*
pos_
);
183
commit_
= *size;
184
++
pos_
;
185
return
true
;
186
}
187
188
template
<
class
Streambuf>
189
void
190
ZeroCopyOutputStream<Streambuf>::BackUp
(
int
count)
191
{
192
XRPL_ASSERT(count <=
commit_
,
"xrpl::ZeroCopyOutputStream::BackUp : valid input"
);
193
auto
const
n =
commit_
- count;
194
streambuf_
.commit(n);
195
count_
+= n;
196
commit_
= 0;
197
}
198
199
}
// namespace xrpl
xrpl::ZeroCopyInputStream::Skip
bool Skip(int count) override
Definition
ZeroCopyStream.h:85
xrpl::ZeroCopyInputStream::ByteCount
std::int64_t ByteCount() const override
Definition
ZeroCopyStream.h:45
xrpl::ZeroCopyInputStream::count_
std::int64_t count_
Definition
ZeroCopyStream.h:27
xrpl::ZeroCopyInputStream::ConstBuffer
boost::asio::const_buffer ConstBuffer
Definition
ZeroCopyStream.h:25
xrpl::ZeroCopyInputStream::Next
bool Next(void const **data, int *size) override
Definition
ZeroCopyStream.h:63
xrpl::ZeroCopyInputStream::last_
iterator last_
Definition
ZeroCopyStream.h:28
xrpl::ZeroCopyInputStream::pos_
ConstBuffer pos_
Definition
ZeroCopyStream.h:30
xrpl::ZeroCopyInputStream::ZeroCopyInputStream
ZeroCopyInputStream(Buffers const &buffers)
Definition
ZeroCopyStream.h:54
xrpl::ZeroCopyInputStream::iterator
Buffers::const_iterator iterator
Definition
ZeroCopyStream.h:24
xrpl::ZeroCopyInputStream::BackUp
void BackUp(int count) override
Definition
ZeroCopyStream.h:76
xrpl::ZeroCopyInputStream::first_
iterator first_
Definition
ZeroCopyStream.h:29
xrpl::ZeroCopyOutputStream::ByteCount
std::int64_t ByteCount() const override
Definition
ZeroCopyStream.h:141
xrpl::ZeroCopyOutputStream::count_
std::int64_t count_
Definition
ZeroCopyStream.h:124
xrpl::ZeroCopyOutputStream::BackUp
void BackUp(int count) override
Definition
ZeroCopyStream.h:190
xrpl::ZeroCopyOutputStream::streambuf_
Streambuf & streambuf_
Definition
ZeroCopyStream.h:122
xrpl::ZeroCopyOutputStream::ZeroCopyOutputStream
ZeroCopyOutputStream(Streambuf &streambuf, std::size_t blockSize)
Definition
ZeroCopyStream.h:150
xrpl::ZeroCopyOutputStream::iterator
BuffersType::const_iterator iterator
Definition
ZeroCopyStream.h:119
xrpl::ZeroCopyOutputStream::buffers_
BuffersType buffers_
Definition
ZeroCopyStream.h:126
xrpl::ZeroCopyOutputStream::~ZeroCopyOutputStream
~ZeroCopyOutputStream() override
Definition
ZeroCopyStream.h:159
xrpl::ZeroCopyOutputStream::blockSize_
std::size_t blockSize_
Definition
ZeroCopyStream.h:123
xrpl::ZeroCopyOutputStream::commit_
std::size_t commit_
Definition
ZeroCopyStream.h:125
xrpl::ZeroCopyOutputStream::MutableBuffer
boost::asio::mutable_buffer MutableBuffer
Definition
ZeroCopyStream.h:120
xrpl::ZeroCopyOutputStream::pos_
iterator pos_
Definition
ZeroCopyStream.h:127
xrpl::ZeroCopyOutputStream::BuffersType
Streambuf::mutable_buffers_type BuffersType
Definition
ZeroCopyStream.h:118
xrpl::ZeroCopyOutputStream::Next
bool Next(void **data, int *size) override
Definition
ZeroCopyStream.h:167
cstddef
cstdint
std::int64_t
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
std::size_t
Generated by
1.17.0