blob: 33866457ee8eb268520ad69f579d63f284786ee6 [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
vasilvvc8ccdb22020-10-12 16:42:34 -070012#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -050013#include "common/platform/api/quiche_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.
bnc45ccf4b2020-01-21 19:05:27 -080023struct QUICHE_EXPORT_PRIVATE SpdyPinnableBufferPiece {
QUICHE team82dee2f2019-01-18 12:35:12 -050024 public:
25 SpdyPinnableBufferPiece();
26 ~SpdyPinnableBufferPiece();
27
28 const char* buffer() const { return buffer_; }
29
vasilvvc8ccdb22020-10-12 16:42:34 -070030 explicit operator absl::string_view() const {
31 return absl::string_view(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_