Merge pull request #15899 from karroffel/stringbuffer-template-arg
add template argument for size in StringBuffer
This commit is contained in:
commit
cbdd410a6f
|
@ -1,103 +0,0 @@
|
||||||
/*************************************************************************/
|
|
||||||
/* string_buffer.cpp */
|
|
||||||
/*************************************************************************/
|
|
||||||
/* This file is part of: */
|
|
||||||
/* GODOT ENGINE */
|
|
||||||
/* https://godotengine.org */
|
|
||||||
/*************************************************************************/
|
|
||||||
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
|
|
||||||
/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
|
|
||||||
/* */
|
|
||||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
|
||||||
/* a copy of this software and associated documentation files (the */
|
|
||||||
/* "Software"), to deal in the Software without restriction, including */
|
|
||||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
|
||||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
|
||||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
|
||||||
/* the following conditions: */
|
|
||||||
/* */
|
|
||||||
/* The above copyright notice and this permission notice shall be */
|
|
||||||
/* included in all copies or substantial portions of the Software. */
|
|
||||||
/* */
|
|
||||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
|
||||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
|
||||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
|
||||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
|
||||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
|
||||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
|
||||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
||||||
/*************************************************************************/
|
|
||||||
|
|
||||||
#include "string_buffer.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
StringBuffer &StringBuffer::append(CharType p_char) {
|
|
||||||
reserve(string_length + 2);
|
|
||||||
current_buffer_ptr()[string_length++] = p_char;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuffer &StringBuffer::append(const String &p_string) {
|
|
||||||
return append(p_string.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuffer &StringBuffer::append(const char *p_str) {
|
|
||||||
int len = strlen(p_str);
|
|
||||||
reserve(string_length + len + 1);
|
|
||||||
|
|
||||||
CharType *buf = current_buffer_ptr();
|
|
||||||
for (const char *c_ptr = p_str; *c_ptr; ++c_ptr) {
|
|
||||||
buf[string_length++] = *c_ptr;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuffer &StringBuffer::append(const CharType *p_str, int p_clip_to_len) {
|
|
||||||
int len = 0;
|
|
||||||
while ((p_clip_to_len < 0 || len < p_clip_to_len) && p_str[len]) {
|
|
||||||
++len;
|
|
||||||
}
|
|
||||||
reserve(string_length + len + 1);
|
|
||||||
memcpy(&(current_buffer_ptr()[string_length]), p_str, len * sizeof(CharType));
|
|
||||||
string_length += len;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuffer &StringBuffer::reserve(int p_size) {
|
|
||||||
if (p_size < SHORT_BUFFER_SIZE || p_size < buffer.size())
|
|
||||||
return *this;
|
|
||||||
|
|
||||||
bool need_copy = string_length > 0 && buffer.empty();
|
|
||||||
buffer.resize(next_power_of_2(p_size));
|
|
||||||
if (need_copy) {
|
|
||||||
memcpy(buffer.ptrw(), short_buffer, string_length * sizeof(CharType));
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
int StringBuffer::length() const {
|
|
||||||
return string_length;
|
|
||||||
}
|
|
||||||
|
|
||||||
String StringBuffer::as_string() {
|
|
||||||
current_buffer_ptr()[string_length] = '\0';
|
|
||||||
if (buffer.empty()) {
|
|
||||||
return String(short_buffer);
|
|
||||||
} else {
|
|
||||||
buffer.resize(string_length + 1);
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double StringBuffer::as_double() {
|
|
||||||
current_buffer_ptr()[string_length] = '\0';
|
|
||||||
return String::to_double(current_buffer_ptr());
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t StringBuffer::as_int() {
|
|
||||||
current_buffer_ptr()[string_length] = '\0';
|
|
||||||
return String::to_int(current_buffer_ptr());
|
|
||||||
}
|
|
|
@ -32,9 +32,10 @@
|
||||||
#define STRING_BUFFER_H
|
#define STRING_BUFFER_H
|
||||||
|
|
||||||
#include "ustring.h"
|
#include "ustring.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE = 64>
|
||||||
class StringBuffer {
|
class StringBuffer {
|
||||||
static const int SHORT_BUFFER_SIZE = 64;
|
|
||||||
|
|
||||||
CharType short_buffer[SHORT_BUFFER_SIZE];
|
CharType short_buffer[SHORT_BUFFER_SIZE];
|
||||||
String buffer;
|
String buffer;
|
||||||
|
@ -80,4 +81,83 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
StringBuffer<SHORT_BUFFER_SIZE> &StringBuffer<SHORT_BUFFER_SIZE>::append(CharType p_char) {
|
||||||
|
reserve(string_length + 2);
|
||||||
|
current_buffer_ptr()[string_length++] = p_char;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
StringBuffer<SHORT_BUFFER_SIZE> &StringBuffer<SHORT_BUFFER_SIZE>::append(const String &p_string) {
|
||||||
|
return append(p_string.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
StringBuffer<SHORT_BUFFER_SIZE> &StringBuffer<SHORT_BUFFER_SIZE>::append(const char *p_str) {
|
||||||
|
int len = strlen(p_str);
|
||||||
|
reserve(string_length + len + 1);
|
||||||
|
|
||||||
|
CharType *buf = current_buffer_ptr();
|
||||||
|
for (const char *c_ptr = p_str; *c_ptr; ++c_ptr) {
|
||||||
|
buf[string_length++] = *c_ptr;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
StringBuffer<SHORT_BUFFER_SIZE> &StringBuffer<SHORT_BUFFER_SIZE>::append(const CharType *p_str, int p_clip_to_len) {
|
||||||
|
int len = 0;
|
||||||
|
while ((p_clip_to_len < 0 || len < p_clip_to_len) && p_str[len]) {
|
||||||
|
++len;
|
||||||
|
}
|
||||||
|
reserve(string_length + len + 1);
|
||||||
|
memcpy(&(current_buffer_ptr()[string_length]), p_str, len * sizeof(CharType));
|
||||||
|
string_length += len;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
StringBuffer<SHORT_BUFFER_SIZE> &StringBuffer<SHORT_BUFFER_SIZE>::reserve(int p_size) {
|
||||||
|
if (p_size < SHORT_BUFFER_SIZE || p_size < buffer.size())
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
bool need_copy = string_length > 0 && buffer.empty();
|
||||||
|
buffer.resize(next_power_of_2(p_size));
|
||||||
|
if (need_copy) {
|
||||||
|
memcpy(buffer.ptrw(), short_buffer, string_length * sizeof(CharType));
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
int StringBuffer<SHORT_BUFFER_SIZE>::length() const {
|
||||||
|
return string_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
String StringBuffer<SHORT_BUFFER_SIZE>::as_string() {
|
||||||
|
current_buffer_ptr()[string_length] = '\0';
|
||||||
|
if (buffer.empty()) {
|
||||||
|
return String(short_buffer);
|
||||||
|
} else {
|
||||||
|
buffer.resize(string_length + 1);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
double StringBuffer<SHORT_BUFFER_SIZE>::as_double() {
|
||||||
|
current_buffer_ptr()[string_length] = '\0';
|
||||||
|
return String::to_double(current_buffer_ptr());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int SHORT_BUFFER_SIZE>
|
||||||
|
int64_t StringBuffer<SHORT_BUFFER_SIZE>::as_int() {
|
||||||
|
current_buffer_ptr()[string_length] = '\0';
|
||||||
|
return String::to_int(current_buffer_ptr());
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -178,7 +178,7 @@ Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, Stri
|
||||||
};
|
};
|
||||||
case '#': {
|
case '#': {
|
||||||
|
|
||||||
StringBuffer color_str;
|
StringBuffer<> color_str;
|
||||||
color_str += '#';
|
color_str += '#';
|
||||||
while (true) {
|
while (true) {
|
||||||
CharType ch = p_stream->get_char();
|
CharType ch = p_stream->get_char();
|
||||||
|
@ -299,7 +299,7 @@ Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, Stri
|
||||||
if (cchar == '-' || (cchar >= '0' && cchar <= '9')) {
|
if (cchar == '-' || (cchar >= '0' && cchar <= '9')) {
|
||||||
//a number
|
//a number
|
||||||
|
|
||||||
StringBuffer num;
|
StringBuffer<> num;
|
||||||
#define READING_SIGN 0
|
#define READING_SIGN 0
|
||||||
#define READING_INT 1
|
#define READING_INT 1
|
||||||
#define READING_DEC 2
|
#define READING_DEC 2
|
||||||
|
@ -378,7 +378,7 @@ Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, Stri
|
||||||
|
|
||||||
} else if ((cchar >= 'A' && cchar <= 'Z') || (cchar >= 'a' && cchar <= 'z') || cchar == '_') {
|
} else if ((cchar >= 'A' && cchar <= 'Z') || (cchar >= 'a' && cchar <= 'z') || cchar == '_') {
|
||||||
|
|
||||||
StringBuffer id;
|
StringBuffer<> id;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
|
||||||
while ((cchar >= 'A' && cchar <= 'Z') || (cchar >= 'a' && cchar <= 'z') || cchar == '_' || (!first && cchar >= '0' && cchar <= '9')) {
|
while ((cchar >= 'A' && cchar <= 'Z') || (cchar >= 'a' && cchar <= 'z') || cchar == '_' || (!first && cchar >= '0' && cchar <= '9')) {
|
||||||
|
|
Loading…
Reference in New Issue