blob: 005f3494315d7cb2bea362f82522acbd3f31f96b [file] [log] [blame]
// 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 String16_h
#define String16_h
//#include "Collections.h"
//#include "Platform.h"
#include "{{export_macro_include}}"
#include <vector>
namespace blink {
namespace protocol {
namespace internal {
{{export_macro}} void intToStr(int, char*, size_t);
{{export_macro}} void doubleToStr(double, char*, size_t);
{{export_macro}} void doubleToStr3(double, char*, size_t);
{{export_macro}} void doubleToStr6(double, char*, size_t);
{{export_macro}} double strToDouble(const char*, bool*);
{{export_macro}} int strToInt(const char*, bool*);
} // namespace internal
template <typename T, typename C>
class {{export_macro}} String16Base {
public:
static bool isASCII(C c)
{
return !(c & ~0x7F);
}
static bool isSpaceOrNewLine(C c)
{
return isASCII(c) && c <= ' ' && (c == ' ' || (c <= 0xD && c >= 0x9));
}
static T fromInteger(int number)
{
char buffer[50];
internal::intToStr(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer));
return T(buffer);
}
static T fromDouble(double number)
{
char buffer[100];
internal::doubleToStr(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer));
return T(buffer);
}
static T fromDoublePrecision3(double number)
{
char buffer[100];
internal::doubleToStr3(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer));
return T(buffer);
}
static T fromDoublePrecision6(double number)
{
char buffer[100];
internal::doubleToStr6(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer));
return T(buffer);
}
static double charactersToDouble(const C* characters, size_t length, bool* ok = nullptr)
{
std::vector<char> buffer;
buffer.reserve(length + 1);
for (size_t i = 0; i < length; ++i) {
if (!isASCII(characters[i])) {
if (ok)
*ok = false;
return 0;
}
buffer.push_back(static_cast<char>(characters[i]));
}
buffer.push_back('\0');
return internal::strToDouble(buffer.data(), ok);
}
static int charactersToInteger(const C* characters, size_t length, bool* ok = nullptr)
{
std::vector<char> buffer;
buffer.reserve(length + 1);
for (size_t i = 0; i < length; ++i) {
if (!isASCII(characters[i])) {
if (ok)
*ok = false;
return 0;
}
buffer.push_back(static_cast<char>(characters[i]));
}
buffer.push_back('\0');
return internal::strToInt(buffer.data(), ok);
}
double toDouble(bool* ok = nullptr) const
{
const C* characters = static_cast<const T&>(*this).characters16();
size_t length = static_cast<const T&>(*this).length();
return charactersToDouble(characters, length, ok);
}
int toInteger(bool* ok = nullptr) const
{
const C* characters = static_cast<const T&>(*this).characters16();
size_t length = static_cast<const T&>(*this).length();
return charactersToInteger(characters, length, ok);
}
T stripWhiteSpace() const
{
size_t length = static_cast<const T&>(*this).length();
if (!length)
return T();
unsigned start = 0;
unsigned end = length - 1;
const C* characters = static_cast<const T&>(*this).characters16();
// skip white space from start
while (start <= end && isSpaceOrNewLine(characters[start]))
++start;
// only white space
if (start > end)
return T();
// skip white space from end
while (end && isSpaceOrNewLine(characters[end]))
--end;
if (!start && end == length - 1)
return T(static_cast<const T&>(*this));
return T(characters + start, end + 1 - start);
}
bool startsWith(const char* prefix) const
{
const C* characters = static_cast<const T&>(*this).characters16();
size_t length = static_cast<const T&>(*this).length();
for (size_t i = 0, j = 0; prefix[j] && i < length; ++i, ++j) {
if (characters[i] != prefix[j])
return false;
}
return true;
}
};
} // namespace protocol
} // namespace blink
#include "{{string16_impl_h_include}}"
namespace blink {
namespace protocol {
class {{export_macro}} 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 protocol
} // namespace blink
using String16 = blink::protocol::String16;
using String16Builder = blink::protocol::String16Builder;
#endif // !defined(String16_h)