Home | History | Annotate | Download | only in flip_server
      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.
      4 
      5 #ifndef NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
      6 #define NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
      7 
      8 #include <ctype.h>
      9 
     10 #include "base/port.h"
     11 #include "base/strings/string_piece.h"
     12 
     13 namespace net {
     14 
     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
     18     size_t hash_val = 0;
     19     for (base::StringPiece::const_iterator it = sp.begin();
     20          it != sp.end(); ++it) {
     21       hash_val = 5 * hash_val + tolower(*it);
     22     }
     23     return hash_val;
     24   }
     25 };
     26 
     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()) {
     33       return true;
     34     } else if (piece1.size() != piece2.size()) {
     35       return false;
     36     }
     37     while (p1i != piece1.end() && p2i != piece2.end()) {
     38       if (tolower(*p1i) != tolower(*p2i))
     39         return false;
     40       ++p1i;
     41       ++p2i;
     42     }
     43     return true;
     44   }
     45 
     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)) {
     50       ++c;
     51     }
     52     if (c == e) {
     53       *piece1 = base::StringPiece(c, e-c);
     54       return;
     55     }
     56     --e;
     57     while (c != e &&isspace(*e)) {
     58       --e;
     59     }
     60     ++e;
     61     *piece1 = base::StringPiece(c, e-c);
     62   }
     63 
     64   static bool StartsWithIgnoreCase(const base::StringPiece& text,
     65                                    const base::StringPiece& starts_with) {
     66     if (text.size() < starts_with.size())
     67       return false;
     68     return EqualIgnoreCase(text.substr(0, starts_with.size()), starts_with);
     69   }
     70 };
     71 struct StringPieceCaseEqual {
     72   bool operator()(const base::StringPiece& piece1,
     73                   const base::StringPiece& piece2) const {
     74     return StringPieceUtils::EqualIgnoreCase(piece1, piece2);
     75   }
     76 };
     77 
     78 
     79 
     80 }  // namespace net
     81 
     82 #endif  // NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
     83 
     84