1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef QUICHE_SPDY_CORE_SPDY_PINNABLE_BUFFER_PIECE_H_ 6 #define QUICHE_SPDY_CORE_SPDY_PINNABLE_BUFFER_PIECE_H_ 7 8 #include <stddef.h> 9 10 #include <memory> 11 12 #include "absl/strings/string_view.h" 13 #include "quiche/common/platform/api/quiche_export.h" 14 15 namespace spdy { 16 17 class SpdyPrefixedBufferReader; 18 19 // Helper class of SpdyPrefixedBufferReader. 20 // Represents a piece of consumed buffer which may (or may not) own its 21 // underlying storage. Users may "pin" the buffer at a later time to ensure 22 // a SpdyPinnableBufferPiece owns and retains storage of the buffer. 23 struct QUICHE_EXPORT SpdyPinnableBufferPiece { 24 public: 25 SpdyPinnableBufferPiece(); 26 ~SpdyPinnableBufferPiece(); 27 bufferSpdyPinnableBufferPiece28 const char* buffer() const { return buffer_; } 29 string_viewSpdyPinnableBufferPiece30 explicit operator absl::string_view() const { 31 return absl::string_view(buffer_, length_); 32 } 33 34 // Allocates and copies the buffer to internal storage. 35 void Pin(); 36 IsPinnedSpdyPinnableBufferPiece37 bool IsPinned() const { return storage_ != nullptr; } 38 39 // Swaps buffers, including internal storage, with |other|. 40 void Swap(SpdyPinnableBufferPiece* other); 41 42 private: 43 friend class SpdyPrefixedBufferReader; 44 45 const char* buffer_; 46 size_t length_; 47 // Null iff |buffer_| isn't pinned. 48 std::unique_ptr<char[]> storage_; 49 }; 50 51 } // namespace spdy 52 53 #endif // QUICHE_SPDY_CORE_SPDY_PINNABLE_BUFFER_PIECE_H_ 54