| Index: src/inspector/String16.h
|
| diff --git a/src/inspector/String16.h b/src/inspector/String16.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e342fe83398afb1e6d2d7d3683be6757b5d9e513
|
| --- /dev/null
|
| +++ b/src/inspector/String16.h
|
| @@ -0,0 +1,132 @@
|
| +// Copyright 2016 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef V8_INSPECTOR_STRING16_H_
|
| +#define V8_INSPECTOR_STRING16_H_
|
| +
|
| +#include <stdint.h>
|
| +#include <cctype>
|
| +#include <climits>
|
| +#include <cstring>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +namespace v8_inspector {
|
| +
|
| +using UChar = uint16_t;
|
| +
|
| +class String16 {
|
| + public:
|
| + static const size_t kNotFound = static_cast<size_t>(-1);
|
| +
|
| + String16() {}
|
| + String16(const String16& other) : m_impl(other.m_impl) {}
|
| + String16(const UChar* characters, size_t size) : m_impl(characters, size) {}
|
| + String16(const UChar* characters) : m_impl(characters) {}
|
| + String16(const char* characters)
|
| + : String16(characters, std::strlen(characters)) {}
|
| + String16(const char* characters, size_t size) {
|
| + m_impl.resize(size);
|
| + for (size_t i = 0; i < size; ++i) m_impl[i] = characters[i];
|
| + }
|
| +
|
| + static String16 fromInteger(int);
|
| + static String16 fromDouble(double);
|
| + static String16 fromDoublePrecision3(double);
|
| + static String16 fromDoublePrecision6(double);
|
| +
|
| + int toInteger(bool* ok = nullptr) const;
|
| + String16 stripWhiteSpace() const;
|
| + const UChar* characters16() const { return m_impl.c_str(); }
|
| + size_t length() const { return m_impl.length(); }
|
| + bool isEmpty() const { return !m_impl.length(); }
|
| + UChar operator[](unsigned index) const { return m_impl[index]; }
|
| + String16 substring(unsigned pos, unsigned len = UINT_MAX) const {
|
| + return String16(m_impl.substr(pos, len));
|
| + }
|
| + size_t find(const String16& str, unsigned start = 0) const {
|
| + return m_impl.find(str.m_impl, start);
|
| + }
|
| + size_t reverseFind(const String16& str, unsigned start = UINT_MAX) const {
|
| + return m_impl.rfind(str.m_impl, start);
|
| + }
|
| + void swap(String16& other) { m_impl.swap(other.m_impl); }
|
| +
|
| + // Convenience methods.
|
| + std::string utf8() const;
|
| + static String16 fromUTF8(const char* stringStart, size_t length);
|
| +
|
| + const std::basic_string<UChar>& impl() const { return m_impl; }
|
| + explicit String16(const std::basic_string<UChar>& impl) : m_impl(impl) {}
|
| +
|
| + std::size_t hash() const {
|
| + if (!has_hash) {
|
| + size_t hash = 0;
|
| + for (size_t i = 0; i < length(); ++i) hash = 31 * hash + m_impl[i];
|
| + hash_code = hash;
|
| + has_hash = true;
|
| + }
|
| + return hash_code;
|
| + }
|
| +
|
| + private:
|
| + std::basic_string<UChar> m_impl;
|
| + mutable bool has_hash = false;
|
| + mutable std::size_t hash_code = 0;
|
| +};
|
| +
|
| +inline bool operator==(const String16& a, const String16& b) {
|
| + return a.impl() == b.impl();
|
| +}
|
| +inline bool operator<(const String16& a, const String16& b) {
|
| + return a.impl() < b.impl();
|
| +}
|
| +inline bool operator!=(const String16& a, const String16& b) {
|
| + return a.impl() != b.impl();
|
| +}
|
| +inline bool operator==(const String16& a, const char* b) {
|
| + return a.impl() == String16(b).impl();
|
| +}
|
| +inline String16 operator+(const String16& a, const char* b) {
|
| + return String16(a.impl() + String16(b).impl());
|
| +}
|
| +inline String16 operator+(const char* a, const String16& b) {
|
| + return String16(String16(a).impl() + b.impl());
|
| +}
|
| +inline String16 operator+(const String16& a, const String16& b) {
|
| + return String16(a.impl() + b.impl());
|
| +}
|
| +
|
| +class String16Builder {
|
| + public:
|
| + String16Builder();
|
| + void append(const String16&);
|
| + void append(UChar);
|
| + void append(char);
|
| + void append(const UChar*, size_t);
|
| + void append(const char*, size_t);
|
| + String16 toString();
|
| + void reserveCapacity(size_t);
|
| +
|
| + private:
|
| + std::vector<UChar> m_buffer;
|
| +};
|
| +
|
| +} // namespace v8_inspector
|
| +
|
| +#if !defined(__APPLE__) || defined(_LIBCPP_VERSION)
|
| +
|
| +namespace std {
|
| +template <>
|
| +struct hash<v8_inspector::String16> {
|
| + std::size_t operator()(const v8_inspector::String16& string) const {
|
| + return string.hash();
|
| + }
|
| +};
|
| +
|
| +} // namespace std
|
| +
|
| +#endif // !defined(__APPLE__) || defined(_LIBCPP_VERSION)
|
| +
|
| +#endif // V8_INSPECTOR_STRING16_H_
|
|
|