5
* Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved.
6
* See COPYRIGHT.txt for details.
9
#ifndef DENA_STRING_BUFFER_HPP
10
#define DENA_STRING_BUFFER_HPP
17
#include "allocator.hpp"
22
struct string_buffer : private noncopyable {
23
string_buffer() : buffer(0), begin_offset(0), end_offset(0), alloc_size(0) { }
27
const char *begin() const {
28
return buffer + begin_offset;
30
const char *end() const {
31
return buffer + end_offset;
34
return buffer + begin_offset;
37
return buffer + end_offset;
40
return end_offset - begin_offset;
43
begin_offset = end_offset = 0;
45
void resize(size_t len) {
48
memset(buffer + end_offset, 0, len - size());
50
end_offset = begin_offset + len;
52
void reserve(size_t len) {
53
if (alloc_size >= begin_offset + len) {
56
size_t asz = alloc_size;
57
while (asz < begin_offset + len) {
61
const size_t asz_n = asz << 1;
63
fatal_abort("string_buffer::resize() overflow");
67
void *const p = DENA_REALLOC(buffer, asz);
69
fatal_abort("string_buffer::resize() realloc");
71
buffer = static_cast<char *>(p);
74
void erase_front(size_t len) {
81
char *make_space(size_t len) {
82
reserve(size() + len);
83
return buffer + end_offset;
85
void space_wrote(size_t len) {
86
len = std::min(len, alloc_size - end_offset);
87
end_offset = std::min(end_offset + len, alloc_size);
90
void append_literal(const char (& str)[N]) {
91
append(str, str + N - 1);
93
void append(const char *start, const char *finish) {
94
const size_t len = finish - start;
95
reserve(size() + len);
96
memcpy(buffer + end_offset, start, len);
99
void append_2(const char *s1, const char *f1, const char *s2,
101
const size_t l1 = f1 - s1;
102
const size_t l2 = f2 - s2;
103
reserve(end_offset + l1 + l2);
104
memcpy(buffer + end_offset, s1, l1);
105
memcpy(buffer + end_offset + l1, s2, l2);
106
end_offset += l1 + l2;