blob: 469c0d36c4ee3abba54332fb49c47033efd6f0d1 [file] [log] [blame]
QUICHE team82dee2f2019-01-18 12:35:12 -05001// 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
bnc7f82d042020-01-03 12:18:53 -080012#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE team82dee2f2019-01-18 12:35:12 -050013#include "net/third_party/quiche/src/spdy/platform/api/spdy_export.h"
QUICHE team82dee2f2019-01-18 12:35:12 -050014
15namespace spdy {
16
17class 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.
23struct SPDY_EXPORT_PRIVATE SpdyPinnableBufferPiece {
24 public:
25 SpdyPinnableBufferPiece();
26 ~SpdyPinnableBufferPiece();
27
28 const char* buffer() const { return buffer_; }
29
bnc7f82d042020-01-03 12:18:53 -080030 explicit operator quiche::QuicheStringPiece() const {
31 return quiche::QuicheStringPiece(buffer_, length_);
QUICHE team82dee2f2019-01-18 12:35:12 -050032 }
33
34 // Allocates and copies the buffer to internal storage.
35 void Pin();
36
37 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_