Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: base/string_piece.h

Issue 7549003: Optimize phishing page term feature extraction. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Brian's comments Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/memory/mru_cache_unittest.cc ('k') | base/string_piece_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // Copied from strings/stringpiece.h with modifications 4 // Copied from strings/stringpiece.h with modifications
5 // 5 //
6 // A string-like object that points to a sized piece of memory. 6 // A string-like object that points to a sized piece of memory.
7 // 7 //
8 // Functions or methods may use const StringPiece& parameters to accept either 8 // Functions or methods may use const StringPiece& parameters to accept either
9 // a "const char*" or a "string" value that will be implicitly converted to 9 // a "const char*" or a "string" value that will be implicitly converted to
10 // a StringPiece. The implicit conversion means that it is often appropriate 10 // a StringPiece. The implicit conversion means that it is often appropriate
11 // to include this .h file in other files rather than forward-declaring 11 // to include this .h file in other files rather than forward-declaring
12 // StringPiece as would be appropriate for most other Google classes. 12 // StringPiece as would be appropriate for most other Google classes.
13 // 13 //
14 // Systematic usage of StringPiece is encouraged as it will reduce unnecessary 14 // Systematic usage of StringPiece is encouraged as it will reduce unnecessary
15 // conversions from "const char*" to "string" and back again. 15 // conversions from "const char*" to "string" and back again.
16 // 16 //
17 // StringPiece16 is similar to StringPiece but for base::string16 instead of
18 // std::string. We do not define as large of a subset of the STL functions
19 // from basic_string as in StringPiece, but this can be changed if these
20 // functions (find, find_first_of, etc.) are found to be useful in this context.
21 //
17 22
18 #ifndef BASE_STRING_PIECE_H_ 23 #ifndef BASE_STRING_PIECE_H_
19 #define BASE_STRING_PIECE_H_ 24 #define BASE_STRING_PIECE_H_
20 #pragma once 25 #pragma once
21 26
22 #include <string> 27 #include <string>
23 28
24 #include "base/base_export.h" 29 #include "base/base_export.h"
25 #include "base/basictypes.h" 30 #include "base/basictypes.h"
31 #include "base/hash_tables.h"
32 #include "base/string16.h"
26 33
27 namespace base { 34 namespace base {
28 35
29 class BASE_EXPORT StringPiece { 36 class BASE_EXPORT StringPiece {
30 public: 37 public:
31 // standard STL container boilerplate 38 // standard STL container boilerplate
32 typedef size_t size_type; 39 typedef size_t size_type;
33 typedef char value_type; 40 typedef char value_type;
34 typedef const char* pointer; 41 typedef const char* pointer;
35 typedef const char& reference; 42 typedef const char& reference;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 164
158 static int wordmemcmp(const char* p, const char* p2, size_type N) { 165 static int wordmemcmp(const char* p, const char* p2, size_type N) {
159 return memcmp(p, p2, N); 166 return memcmp(p, p2, N);
160 } 167 }
161 168
162 private: 169 private:
163 const char* ptr_; 170 const char* ptr_;
164 size_type length_; 171 size_type length_;
165 }; 172 };
166 173
174 class BASE_EXPORT StringPiece16 {
175 public:
176 // standard STL container boilerplate
177 typedef size_t size_type;
178 typedef char16 value_type;
179 typedef const char16* pointer;
180 typedef const char16& reference;
181 typedef const char16& const_reference;
182 typedef ptrdiff_t difference_type;
183 typedef const char16* const_iterator;
184 typedef const char16* iterator;
185 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
186 typedef std::reverse_iterator<iterator> reverse_iterator;
187
188 public:
189 // We provide non-explicit singleton constructors so users can pass
190 // in a "const char16*" or a "string16" wherever a "StringPiece16" is
191 // expected.
192 StringPiece16() : ptr_(NULL), length_(0) { }
193 StringPiece16(const char16* str)
194 : ptr_(str),
195 length_((str == NULL) ? 0 : string16::traits_type::length(str)) { }
196 StringPiece16(const string16& str)
197 : ptr_(str.data()), length_(str.size()) { }
198 StringPiece16(const char16* offset, size_type len)
199 : ptr_(offset), length_(len) { }
200
201 // data() may return a pointer to a buffer with embedded NULs, and the
202 // returned buffer may or may not be null terminated. Therefore it is
203 // typically a mistake to pass data() to a routine that expects a NUL
204 // terminated string.
205 const char16* data() const { return ptr_; }
206 size_type size() const { return length_; }
207 size_type length() const { return length_; }
208 bool empty() const { return length_ == 0; }
209
210 void clear() {
211 ptr_ = NULL;
212 length_ = 0;
213 }
214 void set(const char16* data, size_type len) {
215 ptr_ = data;
216 length_ = len;
217 }
218 void set(const char16* str) {
219 ptr_ = str;
220 length_ = str ? string16::traits_type::length(str) : 0;
221 }
222
223 char16 operator[](size_type i) const { return ptr_[i]; }
224
225 string16 as_string16() const {
226 // StringPiece claims that this is bad when data() is NULL, but unittesting
227 // seems to say otherwise.
228 return string16(data(), size());
229 }
230
231 iterator begin() const { return ptr_; }
232 iterator end() const { return ptr_ + length_; }
233 const_reverse_iterator rbegin() const {
234 return const_reverse_iterator(ptr_ + length_);
235 }
236 const_reverse_iterator rend() const {
237 return const_reverse_iterator(ptr_);
238 }
239
240 size_type max_size() const { return length_; }
241 size_type capacity() const { return length_; }
242
243 static int wordmemcmp(const char16* p, const char16* p2, size_type N) {
244 return string16::traits_type::compare(p, p2, N);
245 }
246
247 private:
248 const char16* ptr_;
249 size_type length_;
250 };
251
167 BASE_EXPORT bool operator==(const StringPiece& x, const StringPiece& y); 252 BASE_EXPORT bool operator==(const StringPiece& x, const StringPiece& y);
168 253
169 inline bool operator!=(const StringPiece& x, const StringPiece& y) { 254 inline bool operator!=(const StringPiece& x, const StringPiece& y) {
170 return !(x == y); 255 return !(x == y);
171 } 256 }
172 257
173 inline bool operator<(const StringPiece& x, const StringPiece& y) { 258 inline bool operator<(const StringPiece& x, const StringPiece& y) {
174 const int r = StringPiece::wordmemcmp( 259 const int r = StringPiece::wordmemcmp(
175 x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size())); 260 x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size()));
176 return ((r < 0) || ((r == 0) && (x.size() < y.size()))); 261 return ((r < 0) || ((r == 0) && (x.size() < y.size())));
177 } 262 }
178 263
179 inline bool operator>(const StringPiece& x, const StringPiece& y) { 264 inline bool operator>(const StringPiece& x, const StringPiece& y) {
180 return y < x; 265 return y < x;
181 } 266 }
182 267
183 inline bool operator<=(const StringPiece& x, const StringPiece& y) { 268 inline bool operator<=(const StringPiece& x, const StringPiece& y) {
184 return !(x > y); 269 return !(x > y);
185 } 270 }
186 271
187 inline bool operator>=(const StringPiece& x, const StringPiece& y) { 272 inline bool operator>=(const StringPiece& x, const StringPiece& y) {
188 return !(x < y); 273 return !(x < y);
189 } 274 }
190 275
276 inline bool operator==(const StringPiece16& x, const StringPiece16& y) {
277 if (x.size() != y.size())
278 return false;
279
280 return StringPiece16::wordmemcmp(x.data(), y.data(), x.size()) == 0;
281 }
282
283 inline bool operator!=(const StringPiece16& x, const StringPiece16& y) {
284 return !(x == y);
285 }
286
287 inline bool operator<(const StringPiece16& x, const StringPiece16& y) {
288 const int r = StringPiece16::wordmemcmp(
289 x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size()));
290 return ((r < 0) || ((r == 0) && (x.size() < y.size())));
291 }
292
293 inline bool operator>(const StringPiece16& x, const StringPiece16& y) {
294 return y < x;
295 }
296
297 inline bool operator<=(const StringPiece16& x, const StringPiece16& y) {
298 return !(x > y);
299 }
300
301 inline bool operator>=(const StringPiece16& x, const StringPiece16& y) {
302 return !(x < y);
303 }
304
191 } // namespace base 305 } // namespace base
192 306
307 // We provide appropriate hash functions so StringPiece and StringPiece16 can
308 // be used as keys in hash sets and maps.
309
310 // This hash function is copied from base/hash_tables.h. We don't use the
311 // ones already defined for string and string16 directly because it would
312 // require the string constructors to be called, which we don't want.
313 #define HASH_STRING_PIECE(StringPieceType, string_piece) \
314 std::size_t result = 0; \
315 for (StringPieceType::const_iterator i = string_piece.begin(); \
316 i != string_piece.end(); ++i) \
317 result = (result * 131) + *i; \
318 return result; \
319
320 namespace BASE_HASH_NAMESPACE {
321 #if defined(COMPILER_GCC)
322
323 template<>
324 struct hash<base::StringPiece> {
325 std::size_t operator()(const base::StringPiece& sp) const {
326 HASH_STRING_PIECE(base::StringPiece, sp);
327 }
328 };
329 template<>
330 struct hash<base::StringPiece16> {
331 std::size_t operator()(const base::StringPiece16& sp16) const {
332 HASH_STRING_PIECE(base::StringPiece16, sp16);
333 }
334 };
335
336 #elif defined(COMPILER_MSVC)
337
338 inline size_t hash_value(const base::StringPiece& sp) {
339 HASH_STRING_PIECE(base::StringPiece, sp);
340 }
341 inline size_t hash_value(const base::StringPiece16& sp16) {
342 HASH_STRING_PIECE(base::StringPiece16, sp16);
343 }
344
345 #endif // COMPILER
346
347 } // namespace BASE_HASH_NAMESPACE
348
193 #endif // BASE_STRING_PIECE_H_ 349 #endif // BASE_STRING_PIECE_H_
OLDNEW
« no previous file with comments | « base/memory/mru_cache_unittest.cc ('k') | base/string_piece_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698