GRPC C++  1.33.1
byte_buffer.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2017 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
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, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H
20 #define GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H
21 
23 
29 
30 #include <vector>
31 
32 namespace grpc {
33 
34 class ServerInterface;
35 class ByteBuffer;
36 class ServerInterface;
37 
38 namespace internal {
39 template <class RequestType, class ResponseType>
41 template <class RequestType, class ResponseType>
43 template <class ServiceType, class RequestType, class ResponseType>
45 template <class ServiceType, class RequestType, class ResponseType>
47 template <::grpc::StatusCode code>
49 class CallOpSendMessage;
50 template <class R>
53 class ExternalConnectionAcceptorImpl;
54 template <class R>
56 class GrpcByteBufferPeer;
57 
58 } // namespace internal
60 class ByteBuffer final {
61  public:
63  ByteBuffer() : buffer_(nullptr) {}
64 
66  ByteBuffer(const Slice* slices, size_t nslices) {
67  // The following assertions check that the representation of a grpc::Slice
68  // is identical to that of a grpc_slice: it has a grpc_slice field, and
69  // nothing else.
70  static_assert(std::is_same<decltype(slices[0].slice_), grpc_slice>::value,
71  "Slice must have same representation as grpc_slice");
72  static_assert(sizeof(Slice) == sizeof(grpc_slice),
73  "Slice must have same representation as grpc_slice");
74  // The following assertions check that the representation of a ByteBuffer is
75  // identical to grpc_byte_buffer*: it has a grpc_byte_buffer* field,
76  // and nothing else.
77  static_assert(std::is_same<decltype(buffer_), grpc_byte_buffer*>::value,
78  "ByteBuffer must have same representation as "
79  "grpc_byte_buffer*");
80  static_assert(sizeof(ByteBuffer) == sizeof(grpc_byte_buffer*),
81  "ByteBuffer must have same representation as "
82  "grpc_byte_buffer*");
83  // The const_cast is legal if grpc_raw_byte_buffer_create() does no more
84  // than its advertised side effect of increasing the reference count of the
85  // slices it processes, and such an increase does not affect the semantics
86  // seen by the caller of this constructor.
88  reinterpret_cast<grpc_slice*>(const_cast<Slice*>(slices)), nslices);
89  }
90 
95  ByteBuffer(const ByteBuffer& buf) : buffer_(nullptr) { operator=(buf); }
96 
98  if (buffer_) {
100  }
101  }
102 
107  if (this != &buf) {
108  Clear(); // first remove existing data
109  }
110  if (buf.buffer_) {
111  // then copy
112  buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buf.buffer_);
113  }
114  return *this;
115  }
116 
118  Status Dump(std::vector<Slice>* slices) const;
119 
121  void Clear() {
122  if (buffer_) {
124  buffer_ = nullptr;
125  }
126  }
127 
133  void Duplicate() {
135  }
136 
139  void Release() { buffer_ = nullptr; }
140 
142  size_t Length() const {
143  return buffer_ == nullptr
144  ? 0
146  }
147 
149  void Swap(ByteBuffer* other) {
150  grpc_byte_buffer* tmp = other->buffer_;
151  other->buffer_ = buffer_;
152  buffer_ = tmp;
153  }
154 
156  bool Valid() const { return (buffer_ != nullptr); }
157 
158  private:
159  friend class SerializationTraits<ByteBuffer, void>;
160  friend class ServerInterface;
162  template <class R>
165  template <class ServiceType, class RequestType, class ResponseType>
167  template <class ServiceType, class RequestType, class ResponseType>
169  template <class RequestType, class ResponseType>
171  template <class RequestType, class ResponseType>
173  template <StatusCode code>
175  template <class R>
177  friend class ProtoBufferReader;
178  friend class ProtoBufferWriter;
181 
182  grpc_byte_buffer* buffer_;
183 
184  // takes ownership
185  void set_buffer(grpc_byte_buffer* buf) {
186  if (buffer_) {
187  Clear();
188  }
189  buffer_ = buf;
190  }
191 
192  grpc_byte_buffer* c_buffer() { return buffer_; }
193  grpc_byte_buffer** c_buffer_ptr() { return &buffer_; }
194 
195  class ByteBufferPointer {
196  public:
197  ByteBufferPointer(const ByteBuffer* b)
198  : bbuf_(const_cast<ByteBuffer*>(b)) {}
199  operator ByteBuffer*() { return bbuf_; }
200  operator grpc_byte_buffer*() { return bbuf_->buffer_; }
201  operator grpc_byte_buffer**() { return &bbuf_->buffer_; }
202 
203  private:
204  ByteBuffer* bbuf_;
205  };
206  ByteBufferPointer bbuf_ptr() const { return ByteBufferPointer(this); }
207 };
208 
209 template <>
211  public:
212  static Status Deserialize(ByteBuffer* byte_buffer, ByteBuffer* dest) {
213  dest->set_buffer(byte_buffer->buffer_);
214  return Status::OK;
215  }
216  static Status Serialize(const ByteBuffer& source, ByteBuffer* buffer,
217  bool* own_buffer) {
218  *buffer = source;
219  *own_buffer = true;
220  return g_core_codegen_interface->ok();
221  }
222 };
223 
224 } // namespace grpc
225 
226 #endif // GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H
grpc::ProtoBufferWriter
This is a specialization of the protobuf class ZeroCopyOutputStream.
Definition: proto_buffer_writer.h:53
grpc::internal::CallOpGenericRecvMessage
Definition: call_op_set.h:525
grpc::ByteBuffer::Duplicate
void Duplicate()
Make a duplicate copy of the internals of this byte buffer so that we have our own owned version of i...
Definition: byte_buffer.h:133
grpc
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm.h:33
status.h
grpc::internal::CallOpSendMessage
Definition: call_op_set.h:287
grpc::ByteBuffer::Length
size_t Length() const
Buffer size in bytes.
Definition: byte_buffer.h:142
grpc::internal::ErrorMethodHandler
General method handler class for errors that prevent real method use e.g., handle unknown method by r...
Definition: byte_buffer.h:48
grpc::internal::RpcMethodHandler
A wrapper class of an application provided rpc method handler.
Definition: byte_buffer.h:44
serialization_traits.h
config.h
grpc::CoreCodegenInterface::ok
virtual const Status & ok()=0
grpc::ByteBuffer::ByteBuffer
ByteBuffer(const Slice *slices, size_t nslices)
Construct buffer from slices, of which there are nslices.
Definition: byte_buffer.h:66
grpc::ByteBuffer::operator=
ByteBuffer & operator=(const ByteBuffer &buf)
Wrapper of core function grpc_byte_buffer_copy .
Definition: byte_buffer.h:106
core_codegen_interface.h
grpc::ByteBuffer::~ByteBuffer
~ByteBuffer()
Definition: byte_buffer.h:97
grpc::CoreCodegenInterface::grpc_byte_buffer_copy
virtual grpc_byte_buffer * grpc_byte_buffer_copy(grpc_byte_buffer *bb)=0
grpc::CoreCodegenInterface::grpc_byte_buffer_destroy
virtual void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)=0
grpc::ByteBuffer::ByteBuffer
ByteBuffer()
Constuct an empty buffer.
Definition: byte_buffer.h:63
grpc::Status
Did it work? If it didn't, why?
Definition: status.h:31
grpc::ByteBuffer::Clear
void Clear()
Remove all data.
Definition: byte_buffer.h:121
grpc::SerializationTraits< ByteBuffer, void >::Deserialize
static Status Deserialize(ByteBuffer *byte_buffer, ByteBuffer *dest)
Definition: byte_buffer.h:212
grpc::internal::DeserializeFuncType
Definition: byte_buffer.h:55
grpc_byte_buffer
Definition: grpc_types.h:40
grpc::ByteBuffer
A sequence of bytes.
Definition: byte_buffer.h:60
grpc::internal::CallbackUnaryHandler
Definition: byte_buffer.h:40
grpc::SerializationTraits< ByteBuffer, void >::Serialize
static Status Serialize(const ByteBuffer &source, ByteBuffer *buffer, bool *own_buffer)
Definition: byte_buffer.h:216
grpc::ByteBuffer::Swap
void Swap(ByteBuffer *other)
Swap the state of *this and *other.
Definition: byte_buffer.h:149
grpc::ProtoBufferReader
This is a specialization of the protobuf class ZeroCopyInputStream The principle is to get one chunk ...
Definition: proto_buffer_reader.h:46
grpc::internal::CallbackServerStreamingHandler
Definition: byte_buffer.h:42
grpc_slice
A grpc_slice s, if initialized, represents the byte range s.bytes[0..s.length-1].
Definition: slice.h:60
grpc::CoreCodegenInterface::grpc_raw_byte_buffer_create
virtual grpc_byte_buffer * grpc_raw_byte_buffer_create(grpc_slice *slice, size_t nslices)=0
grpc::SerializationTraits
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:58
grpc::ByteBuffer::GrpcByteBufferPeer
friend class internal::GrpcByteBufferPeer
Definition: byte_buffer.h:179
byte_buffer.h
grpc::Slice
A wrapper around grpc_slice.
Definition: slice.h:35
grpc::internal::ServerStreamingHandler
A wrapper class of an application provided server streaming handler.
Definition: byte_buffer.h:46
grpc::Status::OK
static const Status & OK
An OK pre-defined instance.
Definition: status.h:105
grpc::ByteBuffer::Dump
Status Dump(std::vector< Slice > *slices) const
Dump (read) the buffer contents into slices.
grpc::ByteBuffer::ByteBuffer
ByteBuffer(const ByteBuffer &buf)
Constuct a byte buffer by referencing elements of existing buffer buf.
Definition: byte_buffer.h:95
grpc::ByteBuffer::ExternalConnectionAcceptorImpl
friend class internal::ExternalConnectionAcceptorImpl
Definition: byte_buffer.h:180
grpc::ByteBuffer::Valid
bool Valid() const
Is this ByteBuffer valid?
Definition: byte_buffer.h:156
grpc::CoreCodegenInterface::grpc_byte_buffer_length
virtual size_t grpc_byte_buffer_length(grpc_byte_buffer *bb) GRPC_MUST_USE_RESULT=0
grpc::g_core_codegen_interface
CoreCodegenInterface * g_core_codegen_interface
Definition: completion_queue.h:90
slice.h
grpc::internal::CallOpRecvMessage
Definition: byte_buffer.h:51
grpc::ByteBuffer::Release
void Release()
Forget underlying byte buffer without destroying Use this only for un-owned byte buffers.
Definition: byte_buffer.h:139
grpc::ServerInterface
Definition: server_interface.h:65