Index: net/tools/balsa/string_piece_utils.h |
diff --git a/net/tools/balsa/string_piece_utils.h b/net/tools/balsa/string_piece_utils.h |
index 69877646ee55a7e0165d071248ec92cf96f471b1..ccc9d52729ff641ce5c5f66d64507c723ca19da6 100644 |
--- a/net/tools/balsa/string_piece_utils.h |
+++ b/net/tools/balsa/string_piece_utils.h |
@@ -12,6 +12,48 @@ |
namespace net { |
+#if defined(COMPILER_MSVC) |
+struct StringPieceCaseCompare { |
+ static const size_t bucket_size = 4; |
+ |
+ size_t operator()(const base::StringPiece& sp) const { |
+ // based on __stl_string_hash in http://www.sgi.com/tech/stl/string |
+ size_t hash_val = 0; |
+ for (base::StringPiece::const_iterator it = sp.begin(); |
+ it != sp.end(); ++it) { |
+ hash_val = 5 * hash_val + base::ToLowerASCII(*it); |
+ } |
+ return hash_val; |
+ } |
+ |
+ bool operator()(const base::StringPiece& sp1, |
+ const base::StringPiece& sp2) const { |
+ size_t len1 = sp1.length(); |
+ size_t len2 = sp2.length(); |
+ bool sp1_shorter = len1 < len2; |
+ size_t len = sp1_shorter ? len1 : len2; |
+ |
+ int rv = 0; |
+ for (size_t i = 0; i < len; i++) { |
+ char sp1_lower = base::ToLowerASCII(sp1[i]); |
+ char sp2_lower = base::ToLowerASCII(sp2[i]); |
+ if (sp1_lower < sp2_lower) { |
+ rv = -1; |
+ break; |
+ } |
+ if (sp1_lower > sp2_lower) { |
+ rv = 1; |
+ break; |
+ } |
+ } |
+ |
+ if (rv == 0) { |
+ return sp1_shorter; |
+ } |
+ return rv < 0; |
+ } |
+}; |
+#else // COMPILER_MSVC |
struct StringPieceCaseHash { |
size_t operator()(const base::StringPiece& sp) const { |
// based on __stl_string_hash in http://www.sgi.com/tech/stl/string |
@@ -23,6 +65,7 @@ |
return hash_val; |
} |
}; |
+#endif // COMPILER_MSVC |
struct StringPieceCaseEqual { |
bool operator()(const base::StringPiece& piece1, |