| // Copyright 2017 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_H_ | 
 | #define QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_H_ | 
 |  | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" | 
 | #include "net/quic/platform/impl/quic_mem_slice_impl.h" | 
 |  | 
 | /* API_DESCRIPTION | 
 |  QuicMemSlice is used to wrap application data and pass to QUIC stream's write | 
 |  interface. It refers to a memory block of data which should be around till | 
 |  QuicMemSlice::Reset() is called. It's upto each platform, to implement it as | 
 |  reference counted or not. | 
 |  API-DESCRIPTION */ | 
 |  | 
 | namespace quic { | 
 |  | 
 | // QuicMemSlice is an internally reference counted data buffer used as the | 
 | // source buffers for write operations. QuicMemSlice implicitly maintains a | 
 | // reference count and will free the underlying data buffer when the reference | 
 | // count reaches zero. | 
 | class QUIC_EXPORT_PRIVATE QuicMemSlice { | 
 |  public: | 
 |   // Constructs a empty QuicMemSlice with no underlying data and 0 reference | 
 |   // count. | 
 |   QuicMemSlice() = default; | 
 |   // Let |allocator| allocate a data buffer of |length|, then construct | 
 |   // QuicMemSlice with reference count 1 from the allocated data buffer. | 
 |   // Once all of the references to the allocated data buffer are released, | 
 |   // |allocator| is responsible to free the memory. |allocator| must | 
 |   // not be null, and |length| must not be 0. To construct an empty | 
 |   // QuicMemSlice, use the zero-argument constructor instead. | 
 |   QuicMemSlice(QuicBufferAllocator* allocator, size_t length) | 
 |       : impl_(allocator, length) {} | 
 |  | 
 |   // Constructs QuicMemSlice from |impl|. It takes the reference away from | 
 |   // |impl|. | 
 |   explicit QuicMemSlice(QuicMemSliceImpl impl) : impl_(std::move(impl)) {} | 
 |  | 
 |   QuicMemSlice(const QuicMemSlice& other) = delete; | 
 |   QuicMemSlice& operator=(const QuicMemSlice& other) = delete; | 
 |  | 
 |   // Move constructors. |other| will not hold a reference to the data buffer | 
 |   // after this call completes. | 
 |   QuicMemSlice(QuicMemSlice&& other) = default; | 
 |   QuicMemSlice& operator=(QuicMemSlice&& other) = default; | 
 |  | 
 |   ~QuicMemSlice() = default; | 
 |  | 
 |   // Release the underlying reference. Further access the memory will result in | 
 |   // undefined behavior. | 
 |   void Reset() { impl_.Reset(); } | 
 |  | 
 |   // Returns a const char pointer to underlying data buffer. | 
 |   const char* data() const { return impl_.data(); } | 
 |   // Returns the length of underlying data buffer. | 
 |   size_t length() const { return impl_.length(); } | 
 |  | 
 |   bool empty() const { return impl_.empty(); } | 
 |  | 
 |   QuicMemSliceImpl* impl() { return &impl_; } | 
 |  | 
 |  private: | 
 |   QuicMemSliceImpl impl_; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_H_ |