1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copied from strings/stringpiece.h with modifications 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A string-like object that points to a sized piece of memory. 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// You can use StringPiece as a function or method parameter. A StringPiece 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// parameter can receive a double-quoted string literal argument, a "const 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// char*" argument, a string argument, or a StringPiece argument with no data 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// copying. Systematic use of StringPiece for arguments reduces data 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// copies and strlen() calls. 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Prefer passing StringPieces by value: 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// void MyFunction(StringPiece arg); 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// If circumstances require, you may also pass by const reference: 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// void MyFunction(const StringPiece& arg); // not preferred 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Both of these have the same lifetime semantics. Passing by value 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// generates slightly smaller code. For more discussion, Googlers can see 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// the thread go/stringpiecebyvalue on c-users. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// StringPiece16 is similar to StringPiece but for base::string16 instead of 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// std::string. We do not define as large of a subset of the STL functions 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// from basic_string as in StringPiece, but this can be changed if these 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// functions (find, find_first_of, etc.) are found to be useful in this context. 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef BASE_STRINGS_STRING_PIECE_H_ 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define BASE_STRINGS_STRING_PIECE_H_ 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <stddef.h> 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <iosfwd> 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/base_export.h" 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base { 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <typename STRING_TYPE> class BasicStringPiece; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef BasicStringPiece<std::string> StringPiece; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef BasicStringPiece<string16> StringPiece16; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// internal -------------------------------------------------------------------- 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Many of the StringPiece functions use different implementations for the 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 8-bit and 16-bit versions, and we don't want lots of template expansions in 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// this (very common) header that will slow down compilation. 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// So here we define overloaded functions called by the StringPiece template. 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// For those that share an implementation, the two versions will expand to a 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// template internal to the .cc file. 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace internal { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT void CopyToString(const StringPiece& self, std::string* target); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT void CopyToString(const StringPiece16& self, string16* target); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT void AppendToString(const StringPiece& self, std::string* target); 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT void AppendToString(const StringPiece16& self, string16* target); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t copy(const StringPiece& self, 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char* buf, 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t n, 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t copy(const StringPiece16& self, 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char16* buf, 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t n, 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find(const StringPiece& self, 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece& s, 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find(const StringPiece16& self, 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece16& s, 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find(const StringPiece& self, 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char c, 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find(const StringPiece16& self, 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char16 c, 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t rfind(const StringPiece& self, 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece& s, 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t rfind(const StringPiece16& self, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece16& s, 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t rfind(const StringPiece& self, 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char c, 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t rfind(const StringPiece16& self, 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char16 c, 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_first_of(const StringPiece& self, 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece& s, 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_first_of(const StringPiece16& self, 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece16& s, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_first_not_of(const StringPiece& self, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece& s, 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_first_not_of(const StringPiece16& self, 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece16& s, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_first_not_of(const StringPiece& self, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char c, 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_first_not_of(const StringPiece16& self, 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char16 c, 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_of(const StringPiece& self, 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece& s, 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_of(const StringPiece16& self, 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece16& s, 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_of(const StringPiece& self, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char c, 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_of(const StringPiece16& self, 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char16 c, 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_not_of(const StringPiece& self, 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece& s, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_not_of(const StringPiece16& self, 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StringPiece16& s, 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_not_of(const StringPiece16& self, 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char16 c, 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT size_t find_last_not_of(const StringPiece& self, 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) char c, 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT StringPiece substr(const StringPiece& self, 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos, 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t n); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BASE_EXPORT StringPiece16 substr(const StringPiece16& self, 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t pos, 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t n); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace internal 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// BasicStringPiece ------------------------------------------------------------ 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Defines the types, methods, operators, and data members common to both 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// StringPiece and StringPiece16. Do not refer to this class directly, but 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// rather to BasicStringPiece, StringPiece, or StringPiece16. 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This is templatized by string class type rather than character type, so 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// BasicStringPiece<std::string> or BasicStringPiece<base::string16>. 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename STRING_TYPE> class BasicStringPiece { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Standard STL container boilerplate. 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef size_t size_type; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef typename STRING_TYPE::value_type value_type; 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef const value_type* pointer; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef const value_type& reference; 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef const value_type& const_reference; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef ptrdiff_t difference_type; 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef const value_type* const_iterator; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const size_type npos; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We provide non-explicit singleton constructors so users can pass 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // in a "const char*" or a "string" wherever a "StringPiece" is 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // expected (likewise for char16, string16, StringPiece16). 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicStringPiece() : ptr_(NULL), length_(0) {} 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicStringPiece(const value_type* str) 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ptr_(str), 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_((str == NULL) ? 0 : STRING_TYPE::traits_type::length(str)) {} 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicStringPiece(const STRING_TYPE& str) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ptr_(str.data()), length_(str.size()) {} 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicStringPiece(const value_type* offset, size_type len) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ptr_(offset), length_(len) {} 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicStringPiece(const typename STRING_TYPE::const_iterator& begin, 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const typename STRING_TYPE::const_iterator& end) 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ptr_((end > begin) ? &(*begin) : NULL), 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_((end > begin) ? (size_type)(end - begin) : 0) {} 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // data() may return a pointer to a buffer with embedded NULs, and the 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // returned buffer may or may not be null terminated. Therefore it is 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // typically a mistake to pass data() to a routine that expects a NUL 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // terminated string. 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const value_type* data() const { return ptr_; } 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type size() const { return length_; } 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type length() const { return length_; } 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool empty() const { return length_ == 0; } 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void clear() { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ptr_ = NULL; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_ = 0; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set(const value_type* data, size_type len) { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ptr_ = data; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_ = len; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set(const value_type* str) { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ptr_ = str; 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_ = str ? STRING_TYPE::traits_type::length(str) : 0; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) value_type operator[](size_type i) const { return ptr_[i]; } 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void remove_prefix(size_type n) { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ptr_ += n; 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_ -= n; 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void remove_suffix(size_type n) { 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) length_ -= n; 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int compare(const BasicStringPiece<STRING_TYPE>& x) const { 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int r = wordmemcmp( 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ptr_, x.ptr_, (length_ < x.length_ ? length_ : x.length_)); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (r == 0) { 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (length_ < x.length_) r = -1; 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (length_ > x.length_) r = +1; 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return r; 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STRING_TYPE as_string() const { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // std::string doesn't like to take a NULL pointer even with a 0 size. 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return empty() ? STRING_TYPE() : STRING_TYPE(data(), size()); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_iterator begin() const { return ptr_; } 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_iterator end() const { return ptr_ + length_; } 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_reverse_iterator rbegin() const { 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return const_reverse_iterator(ptr_ + length_); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_reverse_iterator rend() const { 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return const_reverse_iterator(ptr_); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type max_size() const { return length_; } 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type capacity() const { return length_; } 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int wordmemcmp(const value_type* p, 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const value_type* p2, 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type N) { 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return STRING_TYPE::traits_type::compare(p, p2, N); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets the value of the given string target type to be the current string. 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This saves a temporary over doing |a = b.as_string()| 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void CopyToString(STRING_TYPE* target) const { 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::CopyToString(*this, target); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void AppendToString(STRING_TYPE* target) const { 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::AppendToString(*this, target); 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type copy(value_type* buf, size_type n, size_type pos = 0) const { 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return internal::copy(*this, buf, n, pos); 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Does "this" start with "x" 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool starts_with(const BasicStringPiece& x) const { 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return ((this->length_ >= x.length_) && 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (wordmemcmp(this->ptr_, x.ptr_, x.length_) == 0)); 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Does "this" end with "x" 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool ends_with(const BasicStringPiece& x) const { 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return ((this->length_ >= x.length_) && 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (wordmemcmp(this->ptr_ + (this->length_-x.length_), 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) x.ptr_, x.length_) == 0)); 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // find: Search for a character or substring at a given offset. 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find(const BasicStringPiece<STRING_TYPE>& s, 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = 0) const { 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find(*this, s, pos); 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find(value_type c, size_type pos = 0) const { 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find(*this, c, pos); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // rfind: Reverse find. 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type rfind(const BasicStringPiece& s, 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = BasicStringPiece::npos) const { 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::rfind(*this, s, pos); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type rfind(value_type c, size_type pos = BasicStringPiece::npos) const { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::rfind(*this, c, pos); 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // find_first_of: Find the first occurence of one of a set of characters. 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find_first_of(const BasicStringPiece& s, 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = 0) const { 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find_first_of(*this, s, pos); 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find_first_of(value_type c, size_type pos = 0) const { 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return find(c, pos); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // find_first_not_of: Find the first occurence not of a set of characters. 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type find_first_not_of(const BasicStringPiece& s, 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type pos = 0) const { 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find_first_not_of(*this, s, pos); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find_first_not_of(value_type c, size_type pos = 0) const { 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find_first_not_of(*this, c, pos); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // find_last_of: Find the last occurence of one of a set of characters. 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type find_last_of(const BasicStringPiece& s, 324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = BasicStringPiece::npos) const { 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find_last_of(*this, s, pos); 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find_last_of(value_type c, 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = BasicStringPiece::npos) const { 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return rfind(c, pos); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // find_last_not_of: Find the last occurence not of a set of characters. 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_type find_last_not_of(const BasicStringPiece& s, 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = BasicStringPiece::npos) const { 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find_last_not_of(*this, s, pos); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type find_last_not_of(value_type c, 338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type pos = BasicStringPiece::npos) const { 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::find_last_not_of(*this, c, pos); 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // substr. 343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BasicStringPiece substr(size_type pos, 344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type n = BasicStringPiece::npos) const { 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return internal::substr(*this, pos, n); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const value_type* ptr_; 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_type length_; 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename STRING_TYPE> 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const typename BasicStringPiece<STRING_TYPE>::size_type 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BasicStringPiece<STRING_TYPE>::npos = 356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typename BasicStringPiece<STRING_TYPE>::size_type(-1); 357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// MSVC doesn't like complex extern templates and DLLs. 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(COMPILER_MSVC) 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)extern template class BASE_EXPORT BasicStringPiece<std::string>; 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern template class BASE_EXPORT BasicStringPiece<string16>; 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// StingPiece operators -------------------------------------------------------- 365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BASE_EXPORT bool operator==(const StringPiece& x, const StringPiece& y); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator!=(const StringPiece& x, const StringPiece& y) { 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !(x == y); 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator<(const StringPiece& x, const StringPiece& y) { 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int r = StringPiece::wordmemcmp( 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size())); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ((r < 0) || ((r == 0) && (x.size() < y.size()))); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator>(const StringPiece& x, const StringPiece& y) { 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return y < x; 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator<=(const StringPiece& x, const StringPiece& y) { 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !(x > y); 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator>=(const StringPiece& x, const StringPiece& y) { 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !(x < y); 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// StringPiece16 operators ----------------------------------------------------- 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator==(const StringPiece16& x, const StringPiece16& y) { 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (x.size() != y.size()) 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return StringPiece16::wordmemcmp(x.data(), y.data(), x.size()) == 0; 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator!=(const StringPiece16& x, const StringPiece16& y) { 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !(x == y); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator<(const StringPiece16& x, const StringPiece16& y) { 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int r = StringPiece16::wordmemcmp( 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size())); 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ((r < 0) || ((r == 0) && (x.size() < y.size()))); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator>(const StringPiece16& x, const StringPiece16& y) { 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return y < x; 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator<=(const StringPiece16& x, const StringPiece16& y) { 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !(x > y); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool operator>=(const StringPiece16& x, const StringPiece16& y) { 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !(x < y); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BASE_EXPORT std::ostream& operator<<(std::ostream& o, 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const StringPiece& piece); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace base 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Hashing --------------------------------------------------------------------- 427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// We provide appropriate hash functions so StringPiece and StringPiece16 can 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// be used as keys in hash sets and maps. 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This hash function is copied from base/containers/hash_tables.h. We don't 4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// use the ones already defined for string and string16 directly because it 4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// would require the string constructors to be called, which we don't want. 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define HASH_STRING_PIECE(StringPieceType, string_piece) \ 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::size_t result = 0; \ 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (StringPieceType::const_iterator i = string_piece.begin(); \ 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) i != string_piece.end(); ++i) \ 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result = (result * 131) + *i; \ 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; \ 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace BASE_HASH_NAMESPACE { 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(COMPILER_GCC) 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct hash<base::StringPiece> { 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::size_t operator()(const base::StringPiece& sp) const { 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HASH_STRING_PIECE(base::StringPiece, sp); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct hash<base::StringPiece16> { 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::size_t operator()(const base::StringPiece16& sp16) const { 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HASH_STRING_PIECE(base::StringPiece16, sp16); 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#elif defined(COMPILER_MSVC) 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline size_t hash_value(const base::StringPiece& sp) { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HASH_STRING_PIECE(base::StringPiece, sp); 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline size_t hash_value(const base::StringPiece16& sp16) { 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HASH_STRING_PIECE(base::StringPiece16, sp16); 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // COMPILER 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace BASE_HASH_NAMESPACE 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // BASE_STRINGS_STRING_PIECE_H_ 471