@@ -37,8 +37,7 @@ void ColumnFixedString::Append(std::string_view str) {
37
37
+ std::to_string (str.size ()) + " bytes." );
38
38
}
39
39
40
- if (data_.capacity () - data_.size () < str.size ())
41
- {
40
+ if (data_.capacity () - data_.size () < str.size ()) {
42
41
// round up to the next block size
43
42
const auto new_size = (((data_.size () + string_size_) / DEFAULT_BLOCK_SIZE) + 1 ) * DEFAULT_BLOCK_SIZE;
44
43
data_.reserve (new_size);
@@ -129,13 +128,11 @@ struct ColumnString::Block
129
128
data_(new CharT[capacity])
130
129
{}
131
130
132
- inline auto GetAvailable () const
133
- {
131
+ inline auto GetAvailable () const {
134
132
return capacity - size;
135
133
}
136
134
137
- std::string_view AppendUnsafe (std::string_view str)
138
- {
135
+ std::string_view AppendUnsafe (std::string_view str) {
139
136
const auto pos = &data_[size];
140
137
141
138
memcpy (pos, str.data (), str.size ());
@@ -144,13 +141,11 @@ struct ColumnString::Block
144
141
return std::string_view (pos, str.size ());
145
142
}
146
143
147
- auto GetCurrentWritePos ()
148
- {
144
+ auto GetCurrentWritePos () {
149
145
return &data_[size];
150
146
}
151
147
152
- std::string_view ConsumeTailAsStringViewUnsafe (size_t len)
153
- {
148
+ std::string_view ConsumeTailAsStringViewUnsafe (size_t len) {
154
149
const auto start = &data_[size];
155
150
size += len;
156
151
return std::string_view (start, len);
@@ -166,14 +161,21 @@ ColumnString::ColumnString()
166
161
{
167
162
}
168
163
164
+ ColumnString::ColumnString (size_t element_count)
165
+ : Column(Type::CreateString())
166
+ {
167
+ items_.reserve (element_count);
168
+ // 100 is arbitrary number, assumption that string values are about ~40 bytes long.
169
+ blocks_.reserve (std::max<size_t >(1 , element_count / 100 ));
170
+ }
171
+
169
172
ColumnString::ColumnString (const std::vector<std::string>& data)
170
173
: ColumnString()
171
174
{
172
175
items_.reserve (data.size ());
173
176
blocks_.emplace_back (ComputeTotalSize (data));
174
177
175
- for (const auto & s : data)
176
- {
178
+ for (const auto & s : data) {
177
179
AppendUnsafe (s);
178
180
}
179
181
};
@@ -194,21 +196,15 @@ ColumnString::~ColumnString()
194
196
{}
195
197
196
198
void ColumnString::Append (std::string_view str) {
197
- if (blocks_.size () == 0 || blocks_.back ().GetAvailable () < str.length ())
198
- {
199
+ if (blocks_.size () == 0 || blocks_.back ().GetAvailable () < str.length ()) {
199
200
blocks_.emplace_back (std::max (DEFAULT_BLOCK_SIZE, str.size ()));
200
201
}
201
202
202
203
items_.emplace_back (blocks_.back ().AppendUnsafe (str));
203
204
}
204
205
205
206
void ColumnString::Append (const char * str) {
206
- auto len = strlen (str);
207
- if (blocks_.size () == 0 || blocks_.back ().GetAvailable () < len) {
208
- blocks_.emplace_back (std::max (DEFAULT_BLOCK_SIZE, len));
209
- }
210
-
211
- items_.emplace_back (blocks_.back ().AppendUnsafe (str));
207
+ Append (std::string_view (str, strlen (str)));
212
208
}
213
209
214
210
void ColumnString::Append (std::string&& steal_value) {
@@ -295,10 +291,10 @@ ColumnRef ColumnString::Slice(size_t begin, size_t len) const {
295
291
296
292
if (begin < items_.size ()) {
297
293
len = std::min (len, items_.size () - begin);
294
+ result->items_ .reserve (len);
298
295
299
296
result->blocks_ .emplace_back (ComputeTotalSize (items_, begin, len));
300
- for (size_t i = begin; i < begin + len; ++i)
301
- {
297
+ for (size_t i = begin; i < begin + len; ++i) {
302
298
result->Append (items_[i]);
303
299
}
304
300
}
0 commit comments