|  | // 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. | 
|  | // | 
|  | // Some helpers for quic that are for chromium codebase. | 
|  |  | 
|  | #ifndef NET_QUIC_QUIC_UTILS_CHROMIUM_H_ | 
|  | #define NET_QUIC_QUIC_UTILS_CHROMIUM_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "net/base/net_export.h" | 
|  | #include "net/third_party/quic/core/quic_tag.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | // | 
|  | // Find*() | 
|  | // | 
|  |  | 
|  | // Returns a const reference to the value associated with the given key if it | 
|  | // exists. Crashes otherwise. | 
|  | // | 
|  | // This is intended as a replacement for operator[] as an rvalue (for reading) | 
|  | // when the key is guaranteed to exist. | 
|  | // | 
|  | // operator[] for lookup is discouraged for several reasons: | 
|  | //  * It has a side-effect of inserting missing keys | 
|  | //  * It is not thread-safe (even when it is not inserting, it can still | 
|  | //      choose to resize the underlying storage) | 
|  | //  * It invalidates iterators (when it chooses to resize) | 
|  | //  * It default constructs a value object even if it doesn't need to | 
|  | // | 
|  | // This version assumes the key is printable, and includes it in the fatal log | 
|  | // message. | 
|  | template <class Collection> | 
|  | const typename Collection::value_type::second_type& FindOrDie( | 
|  | const Collection& collection, | 
|  | const typename Collection::value_type::first_type& key) { | 
|  | typename Collection::const_iterator it = collection.find(key); | 
|  | CHECK(it != collection.end()) << "Map key not found: " << key; | 
|  | return it->second; | 
|  | } | 
|  |  | 
|  | // Same as above, but returns a non-const reference. | 
|  | template <class Collection> | 
|  | typename Collection::value_type::second_type& FindOrDie( | 
|  | Collection& collection,  // NOLINT | 
|  | const typename Collection::value_type::first_type& key) { | 
|  | typename Collection::iterator it = collection.find(key); | 
|  | CHECK(it != collection.end()) << "Map key not found: " << key; | 
|  | return it->second; | 
|  | } | 
|  |  | 
|  | // Returns a pointer to the const value associated with the given key if it | 
|  | // exists, or NULL otherwise. | 
|  | template <class Collection> | 
|  | const typename Collection::value_type::second_type* FindOrNull( | 
|  | const Collection& collection, | 
|  | const typename Collection::value_type::first_type& key) { | 
|  | typename Collection::const_iterator it = collection.find(key); | 
|  | if (it == collection.end()) { | 
|  | return 0; | 
|  | } | 
|  | return &it->second; | 
|  | } | 
|  |  | 
|  | // Same as above but returns a pointer to the non-const value. | 
|  | template <class Collection> | 
|  | typename Collection::value_type::second_type* FindOrNull( | 
|  | Collection& collection,  // NOLINT | 
|  | const typename Collection::value_type::first_type& key) { | 
|  | typename Collection::iterator it = collection.find(key); | 
|  | if (it == collection.end()) { | 
|  | return 0; | 
|  | } | 
|  | return &it->second; | 
|  | } | 
|  |  | 
|  | // Returns the list of QUIC tags represented by the comma separated | 
|  | // string in |connection_options|. | 
|  | NET_EXPORT quic::QuicTagVector ParseQuicConnectionOptions( | 
|  | const std::string& connection_options); | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_QUIC_QUIC_UTILS_CHROMIUM_H_ |