|  | // Copyright 2014 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. | 
|  |  | 
|  | #include "net/third_party/quiche/src/spdy/core/hpack/hpack_entry.h" | 
|  |  | 
|  | #include "net/third_party/quiche/src/spdy/platform/api/spdy_estimate_memory_usage.h" | 
|  | #include "net/third_party/quiche/src/spdy/platform/api/spdy_logging.h" | 
|  | #include "net/third_party/quiche/src/spdy/platform/api/spdy_string_utils.h" | 
|  |  | 
|  | namespace spdy { | 
|  |  | 
|  | const size_t HpackEntry::kSizeOverhead = 32; | 
|  |  | 
|  | HpackEntry::HpackEntry(SpdyStringPiece name, | 
|  | SpdyStringPiece value, | 
|  | bool is_static, | 
|  | size_t insertion_index) | 
|  | : name_(name.data(), name.size()), | 
|  | value_(value.data(), value.size()), | 
|  | name_ref_(name_), | 
|  | value_ref_(value_), | 
|  | insertion_index_(insertion_index), | 
|  | type_(is_static ? STATIC : DYNAMIC), | 
|  | time_added_(0) {} | 
|  |  | 
|  | HpackEntry::HpackEntry(SpdyStringPiece name, SpdyStringPiece value) | 
|  | : name_ref_(name), | 
|  | value_ref_(value), | 
|  | insertion_index_(0), | 
|  | type_(LOOKUP), | 
|  | time_added_(0) {} | 
|  |  | 
|  | HpackEntry::HpackEntry() : insertion_index_(0), type_(LOOKUP), time_added_(0) {} | 
|  |  | 
|  | HpackEntry::HpackEntry(const HpackEntry& other) | 
|  | : insertion_index_(other.insertion_index_), | 
|  | type_(other.type_), | 
|  | time_added_(0) { | 
|  | if (type_ == LOOKUP) { | 
|  | name_ref_ = other.name_ref_; | 
|  | value_ref_ = other.value_ref_; | 
|  | } else { | 
|  | name_ = other.name_; | 
|  | value_ = other.value_; | 
|  | name_ref_ = SpdyStringPiece(name_.data(), name_.size()); | 
|  | value_ref_ = SpdyStringPiece(value_.data(), value_.size()); | 
|  | } | 
|  | } | 
|  |  | 
|  | HpackEntry& HpackEntry::operator=(const HpackEntry& other) { | 
|  | insertion_index_ = other.insertion_index_; | 
|  | type_ = other.type_; | 
|  | if (type_ == LOOKUP) { | 
|  | name_.clear(); | 
|  | value_.clear(); | 
|  | name_ref_ = other.name_ref_; | 
|  | value_ref_ = other.value_ref_; | 
|  | return *this; | 
|  | } | 
|  | name_ = other.name_; | 
|  | value_ = other.value_; | 
|  | name_ref_ = SpdyStringPiece(name_.data(), name_.size()); | 
|  | value_ref_ = SpdyStringPiece(value_.data(), value_.size()); | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | HpackEntry::~HpackEntry() = default; | 
|  |  | 
|  | // static | 
|  | size_t HpackEntry::Size(SpdyStringPiece name, SpdyStringPiece value) { | 
|  | return name.size() + value.size() + kSizeOverhead; | 
|  | } | 
|  | size_t HpackEntry::Size() const { | 
|  | return Size(name(), value()); | 
|  | } | 
|  |  | 
|  | SpdyString HpackEntry::GetDebugString() const { | 
|  | return SpdyStrCat( | 
|  | "{ name: \"", name_ref_, "\", value: \"", value_ref_, | 
|  | "\", index: ", insertion_index_, " ", | 
|  | (IsStatic() ? " static" : (IsLookup() ? " lookup" : " dynamic")), " }"); | 
|  | } | 
|  |  | 
|  | size_t HpackEntry::EstimateMemoryUsage() const { | 
|  | return SpdyEstimateMemoryUsage(name_) + SpdyEstimateMemoryUsage(value_); | 
|  | } | 
|  |  | 
|  | }  // namespace spdy |