| // Copyright 2016 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. | 
 |  | 
 | #ifndef COMPONENTS_UI_DEVTOOLS_STRING_UTIL_H_ | 
 | #define COMPONENTS_UI_DEVTOOLS_STRING_UTIL_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/json/json_reader.h" | 
 | #include "base/strings/string_number_conversions.h" | 
 |  | 
 | namespace ui { | 
 | namespace devtools { | 
 |  | 
 | using String = std::string; | 
 |  | 
 | namespace protocol { | 
 |  | 
 | class Value; | 
 |  | 
 | class CustomStringBuilder { | 
 |   String s_; | 
 |  | 
 |  public: | 
 |   CustomStringBuilder() {} | 
 |   CustomStringBuilder(String& s) : s_(s) {} | 
 |   void reserveCapacity(std::size_t size) { s_.reserve(size); } | 
 |   void append(const String& s) { s_ += s; } | 
 |   void append(char c) { s_ += c; } | 
 |   void append(const char* data, unsigned int length) { | 
 |     s_.append(data, length); | 
 |   } | 
 |   String toString() { return s_; } | 
 | }; | 
 |  | 
 | using StringBuilder = CustomStringBuilder; | 
 |  | 
 | class StringUtil { | 
 |  public: | 
 |   static String substring(const String& s, unsigned pos, unsigned len) { | 
 |     return s.substr(pos, len); | 
 |   } | 
 |   static String fromInteger(int number) { return base::IntToString(number); } | 
 |   static String fromDouble(double number) { | 
 |     return base::DoubleToString(number); | 
 |   } | 
 |   static double toDouble(const char* s, size_t len, bool* ok) { | 
 |     double v = 0.0; | 
 |     *ok = base::StringToDouble(std::string(s, len), &v); | 
 |     return *ok ? v : 0.0; | 
 |   } | 
 |   static void builderAppend(StringBuilder& builder, const String& s) { | 
 |     builder.append(s); | 
 |   } | 
 |   static void builderAppend(StringBuilder& builder, char c) { | 
 |     builder.append(c); | 
 |   } | 
 |   static void builderAppend(StringBuilder& builder, const char* s, size_t len) { | 
 |     builder.append(s, len); | 
 |   } | 
 |   static void builderReserve(StringBuilder& builder, unsigned capacity) { | 
 |     builder.reserveCapacity(capacity); | 
 |   } | 
 |   static String builderToString(StringBuilder& builder) { | 
 |     return builder.toString(); | 
 |   } | 
 |   static size_t find(const String& s, const char* needle) { | 
 |     return s.find(needle); | 
 |   } | 
 |   static size_t find(const String& s, const String& needle) { | 
 |     return s.find(needle); | 
 |   } | 
 |   static const size_t kNotFound = static_cast<size_t>(-1); | 
 |   static std::unique_ptr<Value> parseJSON(const String& string); | 
 | }; | 
 |  | 
 | }  // namespace protocol | 
 | }  // namespace devtools | 
 | }  // namespace ui | 
 |  | 
 | #endif  // COMPONENTS_UI_DEVTOOLS_STRING_UTIL_H_ |