Index: base/wide_string_piece.h |
diff --git a/base/wide_string_piece.h b/base/wide_string_piece.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ca646f3fbec377c14a2c371ab86dc3d5316f77a9 |
--- /dev/null |
+++ b/base/wide_string_piece.h |
@@ -0,0 +1,133 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// WideStringPiece is similar to StringPiece (in base/string_piece.h) but for |
+// base::string16 instead of std::string. We do not define as large of a subset |
+// of the STL functions from basic_string as in StringPiece, but this can be |
+// changed if these functions (find, find_first_of, etc.) are found to be |
+// useful in this context. |
+// |
+ |
+#ifndef BASE_WIDE_STRING_PIECE_H_ |
+#define BASE_WIDE_STRING_PIECE_H_ |
+#pragma once |
+ |
+#include "base/base_api.h" |
+#include "base/string16.h" |
+ |
+namespace base { |
+ |
+class BASE_API WideStringPiece { |
+ public: |
+ // standard STL container boilerplate |
+ typedef size_t size_type; |
+ typedef char16 value_type; |
+ typedef const char16* pointer; |
+ typedef const char16& reference; |
+ typedef const char16& const_reference; |
+ typedef ptrdiff_t difference_type; |
+ typedef const char16* const_iterator; |
+ typedef const char16* iterator; |
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
+ typedef std::reverse_iterator<iterator> reverse_iterator; |
+ |
+ public: |
+ // We provide non-explicit singleton constructors so users can pass |
+ // in a "const char16*" or a "string16" wherever a "WideStringPiece" is |
+ // expected. |
+ WideStringPiece() : ptr_(NULL), length_(0) { } |
+ WideStringPiece(const char16* str) |
+ : ptr_(str), length_((str == NULL) ? 0 : c16len(str)) { } |
+ WideStringPiece(const string16& str) |
+ : ptr_(str.data()), length_(str.size()) { } |
+ WideStringPiece(const char16* offset, size_type len) |
+ : ptr_(offset), length_(len) { } |
+ |
+ // data() may return a pointer to a buffer with embedded NULs, and the |
+ // returned buffer may or may not be null terminated. Therefore it is |
+ // typically a mistake to pass data() to a routine that expects a NUL |
+ // terminated string. |
+ const char16* data() const { return ptr_; } |
+ size_type size() const { return length_; } |
+ size_type length() const { return length_; } |
+ bool empty() const { return length_ == 0; } |
+ |
+ void clear() { |
+ ptr_ = NULL; |
+ length_ = 0; |
+ } |
+ void set(const char16* data, size_type len) { |
+ ptr_ = data; |
+ length_ = len; |
+ } |
+ void set(const char16* str) { |
+ ptr_ = str; |
+ length_ = str ? c16len(str) : 0; |
+ } |
+ void set(const void* data, size_type len) { |
+ ptr_ = reinterpret_cast<const char16*>(data); |
+ length_ = len; |
+ } |
+ |
+ char16 operator[](size_type i) const { return ptr_[i]; } |
+ |
+ string16 as_string16() const { |
+ // StringPiece claims that this is bad when data() is NULL, but unittesting |
+ // seems to say otherwise. |
+ return string16(data(), size()); |
+ } |
+ |
+ iterator begin() const { return ptr_; } |
+ iterator end() const { return ptr_ + length_; } |
+ const_reverse_iterator rbegin() const { |
+ return const_reverse_iterator(ptr_ + length_); |
+ } |
+ const_reverse_iterator rend() const { |
+ return const_reverse_iterator(ptr_); |
+ } |
+ |
+ size_type max_size() const { return length_; } |
+ size_type capacity() const { return length_; } |
+ |
+ static int wordmemcmp(const char16* p, const char16* p2, size_type N) { |
+ return c16memcmp(p, p2, N); |
+ } |
+ |
+ private: |
+ const char16* ptr_; |
+ size_type length_; |
+}; |
+ |
+inline bool operator==(const WideStringPiece& x, const WideStringPiece& y) { |
+ if (x.size() != y.size()) |
+ return false; |
+ |
+ return WideStringPiece::wordmemcmp(x.data(), y.data(), x.size()) == 0; |
+} |
+ |
+inline bool operator!=(const WideStringPiece& x, const WideStringPiece& y) { |
+ return !(x == y); |
+} |
+ |
+inline bool operator<(const WideStringPiece& x, const WideStringPiece& y) { |
+ const int r = WideStringPiece::wordmemcmp( |
+ x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size())); |
+ return ((r < 0) || ((r == 0) && (x.size() < y.size()))); |
+} |
+ |
+inline bool operator>(const WideStringPiece& x, const WideStringPiece& y) { |
+ return y < x; |
+} |
+ |
+inline bool operator<=(const WideStringPiece& x, const WideStringPiece& y) { |
+ return !(x > y); |
+} |
+ |
+inline bool operator>=(const WideStringPiece& x, const WideStringPiece& y) { |
+ return !(x < y); |
+} |
+ |
+} // namespace base |
+ |
+#endif // BASE_STRING_PIECE_H_ |