| // 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_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_ | 
 | #define QUICHE_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "quiche_platform_impl/quiche_mem_slice_impl.h" | 
 | #include "absl/strings/string_view.h" | 
 | #include "quiche/common/platform/api/quiche_export.h" | 
 | #include "quiche/common/quiche_buffer_allocator.h" | 
 |  | 
 | namespace quiche { | 
 |  | 
 | // QuicheMemSlice is a wrapper around a platform-specific I/O buffer type. It | 
 | // may be reference counted, though QUICHE itself does not rely on that. | 
 | class QUICHE_EXPORT_PRIVATE QuicheMemSlice { | 
 |  public: | 
 |   // Constructs a empty QuicheMemSlice with no underlying data. | 
 |   QuicheMemSlice() = default; | 
 |  | 
 |   // Constructs a QuicheMemSlice that takes ownership of |buffer|.  The length | 
 |   // of the |buffer| must not be zero.  To construct an empty QuicheMemSlice, | 
 |   // use the zero-argument constructor instead. | 
 |   explicit QuicheMemSlice(QuicheBuffer buffer) : impl_(std::move(buffer)) {} | 
 |  | 
 |   // Constructs a QuicheMemSlice that takes ownership of |buffer| allocated on | 
 |   // heap.  |length| must not be zero. | 
 |   QuicheMemSlice(std::unique_ptr<char[]> buffer, size_t length) | 
 |       : impl_(std::move(buffer), length) {} | 
 |  | 
 |   // Ensures the use of the in-place constructor (below) is intentional. | 
 |   struct InPlace {}; | 
 |  | 
 |   // Constructs a QuicheMemSlice by constructing |impl_| in-place. | 
 |   template <typename... Args> | 
 |   explicit QuicheMemSlice(InPlace, Args&&... args) | 
 |       : impl_{std::forward<Args>(args)...} {} | 
 |  | 
 |   QuicheMemSlice(const QuicheMemSlice& other) = delete; | 
 |   QuicheMemSlice& operator=(const QuicheMemSlice& other) = delete; | 
 |  | 
 |   // Move constructors. |other| will not hold a reference to the data buffer | 
 |   // after this call completes. | 
 |   QuicheMemSlice(QuicheMemSlice&& other) = default; | 
 |   QuicheMemSlice& operator=(QuicheMemSlice&& other) = default; | 
 |  | 
 |   ~QuicheMemSlice() = 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(); } | 
 |   // Returns the representation of the underlying data as a string view. | 
 |   absl::string_view AsStringView() const { | 
 |     return absl::string_view(data(), length()); | 
 |   } | 
 |  | 
 |   bool empty() const { return impl_.empty(); } | 
 |  | 
 |   QuicheMemSliceImpl* impl() { return &impl_; } | 
 |  | 
 |  private: | 
 |   QuicheMemSliceImpl impl_; | 
 | }; | 
 |  | 
 | }  // namespace quiche | 
 |  | 
 | #endif  // QUICHE_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_ |