| // 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. | 
 |  | 
 | #ifndef QUICHE_SPDY_CORE_HPACK_HPACK_ENTRY_H_ | 
 | #define QUICHE_SPDY_CORE_HPACK_HPACK_ENTRY_H_ | 
 |  | 
 | #include <cstddef> | 
 | #include <cstdint> | 
 | #include <string> | 
 | #include <utility> | 
 |  | 
 | #include "absl/strings/string_view.h" | 
 | #include "common/platform/api/quiche_export.h" | 
 |  | 
 | // All section references below are to | 
 | // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-08 | 
 |  | 
 | namespace spdy { | 
 |  | 
 | // The constant amount added to name().size() and value().size() to | 
 | // get the size of an HpackEntry as defined in 5.1. | 
 | constexpr size_t kHpackEntrySizeOverhead = 32; | 
 |  | 
 | // A structure for looking up entries in the static and dynamic tables. | 
 | struct QUICHE_EXPORT_PRIVATE HpackLookupEntry { | 
 |   absl::string_view name; | 
 |   absl::string_view value; | 
 |  | 
 |   bool operator==(const HpackLookupEntry& other) const { | 
 |     return name == other.name && value == other.value; | 
 |   } | 
 |  | 
 |   // Abseil hashing framework extension according to absl/hash/hash.h: | 
 |   template <typename H> | 
 |   friend H AbslHashValue(H h, const HpackLookupEntry& entry) { | 
 |     return H::combine(std::move(h), entry.name, entry.value); | 
 |   } | 
 | }; | 
 |  | 
 | // A structure for an entry in the static table (3.3.1) | 
 | // and the header table (3.3.2). | 
 | class QUICHE_EXPORT_PRIVATE HpackEntry { | 
 |  public: | 
 |   HpackEntry(std::string name, std::string value); | 
 |  | 
 |   // Make HpackEntry non-copyable to make sure it is always moved. | 
 |   HpackEntry(const HpackEntry&) = delete; | 
 |   HpackEntry& operator=(const HpackEntry&) = delete; | 
 |  | 
 |   HpackEntry(HpackEntry&&) = default; | 
 |   HpackEntry& operator=(HpackEntry&&) = default; | 
 |  | 
 |   // Getters for std::string members traditionally return const std::string&. | 
 |   // However, HpackHeaderTable uses string_view as keys in the maps | 
 |   // static_name_index_ and dynamic_name_index_.  If HpackEntry::name() returned | 
 |   // const std::string&, then | 
 |   //   dynamic_name_index_.insert(std::make_pair(entry.name(), index)); | 
 |   // would silently create a dangling reference: make_pair infers type from the | 
 |   // return type of entry.name() and silently creates a temporary string copy. | 
 |   // Insert creates a string_view that points to this copy, which then | 
 |   // immediately goes out of scope and gets destroyed.  While this is quite easy | 
 |   // to avoid, for example, by explicitly specifying type as a template | 
 |   // parameter to make_pair, returning string_view here is less error-prone. | 
 |   absl::string_view name() const { return name_; } | 
 |   absl::string_view value() const { return value_; } | 
 |  | 
 |   // Returns the size of an entry as defined in 5.1. | 
 |   static size_t Size(absl::string_view name, absl::string_view value); | 
 |   size_t Size() const; | 
 |  | 
 |   std::string GetDebugString() const; | 
 |  | 
 |  private: | 
 |   std::string name_; | 
 |   std::string value_; | 
 | }; | 
 |  | 
 | }  // namespace spdy | 
 |  | 
 | #endif  // QUICHE_SPDY_CORE_HPACK_HPACK_ENTRY_H_ |