1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
6 #define NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
10 #include "base/port.h"
11 #include "base/strings/string_piece.h"
15 struct StringPieceCaseHash
{
16 size_t operator()(const base::StringPiece
& sp
) const {
17 // based on __stl_string_hash in http://www.sgi.com/tech/stl/string
19 for (base::StringPiece::const_iterator it
= sp
.begin();
20 it
!= sp
.end(); ++it
) {
21 hash_val
= 5 * hash_val
+ tolower(*it
);
27 struct StringPieceUtils
{
28 static bool EqualIgnoreCase(const base::StringPiece
& piece1
,
29 const base::StringPiece
& piece2
) {
30 base::StringPiece::const_iterator p1i
= piece1
.begin();
31 base::StringPiece::const_iterator p2i
= piece2
.begin();
32 if (piece1
.empty() && piece2
.empty()) {
34 } else if (piece1
.size() != piece2
.size()) {
37 while (p1i
!= piece1
.end() && p2i
!= piece2
.end()) {
38 if (tolower(*p1i
) != tolower(*p2i
))
46 static void RemoveWhitespaceContext(base::StringPiece
* piece1
) {
47 base::StringPiece::const_iterator c
= piece1
->begin();
48 base::StringPiece::const_iterator e
= piece1
->end();
49 while (c
!= e
&& isspace(*c
)) {
53 *piece1
= base::StringPiece(c
, e
-c
);
57 while (c
!= e
&&isspace(*e
)) {
61 *piece1
= base::StringPiece(c
, e
-c
);
64 static bool StartsWithIgnoreCase(const base::StringPiece
& text
,
65 const base::StringPiece
& starts_with
) {
66 if (text
.size() < starts_with
.size())
68 return EqualIgnoreCase(text
.substr(0, starts_with
.size()), starts_with
);
71 struct StringPieceCaseEqual
{
72 bool operator()(const base::StringPiece
& piece1
,
73 const base::StringPiece
& piece2
) const {
74 return StringPieceUtils::EqualIgnoreCase(piece1
, piece2
);
82 #endif // NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_