44#include " ../base/wire_format.h"
55
66namespace {
7- const size_t DEFAULT_BLOCK_SIZE = 4096 ;
7+
8+ constexpr size_t DEFAULT_BLOCK_SIZE = 4096 ;
89
910template <typename Container>
10- size_t ComputeTotalSize (const Container & strings, size_t begin = 0 , size_t len = -1 )
11- {
11+ size_t ComputeTotalSize (const Container & strings, size_t begin = 0 , size_t len = -1 ) {
1212 size_t result = 0 ;
1313 if (begin < strings.size ()) {
1414 len = std::min (len, strings.size () - begin);
@@ -64,8 +64,7 @@ std::string_view ColumnFixedString::operator [](size_t n) const {
6464 return std::string_view (&data_[pos], string_size_);
6565}
6666
67- size_t ColumnFixedString::FixedSize () const
68- {
67+ size_t ColumnFixedString::FixedSize () const {
6968 return string_size_;
7069}
7170
@@ -126,8 +125,8 @@ struct ColumnString::Block
126125
127126 explicit Block (size_t starting_capacity)
128127 : size(0 ),
129- capacity(starting_capacity),
130- data_(new CharT[capacity])
128+ capacity(starting_capacity),
129+ data_(new CharT[capacity])
131130 {}
132131
133132 inline auto GetAvailable () const
@@ -167,8 +166,8 @@ ColumnString::ColumnString()
167166{
168167}
169168
170- ColumnString::ColumnString (const std::vector<std::string> & data)
171- : Column(Type::CreateString() )
169+ ColumnString::ColumnString (const std::vector<std::string>& data)
170+ : ColumnString( )
172171{
173172 items_.reserve (data.size ());
174173 blocks_.emplace_back (ComputeTotalSize (data));
@@ -177,6 +176,18 @@ ColumnString::ColumnString(const std::vector<std::string> & data)
177176 {
178177 AppendUnsafe (s);
179178 }
179+ };
180+
181+ ColumnString::ColumnString (std::vector<std::string>&& data)
182+ : ColumnString()
183+ {
184+ items_.reserve (data.size ());
185+
186+ for (auto && d : data) {
187+ append_data_.emplace_back (std::move (d));
188+ auto & last_data = append_data_.back ();
189+ items_.emplace_back (std::string_view{ last_data.data (),last_data.length () });
190+ }
180191}
181192
182193ColumnString::~ColumnString ()
@@ -191,14 +202,34 @@ void ColumnString::Append(std::string_view str) {
191202 items_.emplace_back (blocks_.back ().AppendUnsafe (str));
192203}
193204
194- void ColumnString::AppendUnsafe (std::string_view str)
195- {
205+ 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));
212+ }
213+
214+ void ColumnString::Append (std::string&& steal_value) {
215+ append_data_.emplace_back (std::move (steal_value));
216+ auto & last_data = append_data_.back ();
217+ items_.emplace_back (std::string_view{ last_data.data (),last_data.length () });
218+ }
219+
220+ void ColumnString::AppendNoManagedLifetime (std::string_view str) {
221+ items_.emplace_back (str);
222+ }
223+
224+ void ColumnString::AppendUnsafe (std::string_view str) {
196225 items_.emplace_back (blocks_.back ().AppendUnsafe (str));
197226}
198227
199228void ColumnString::Clear () {
200229 items_.clear ();
201230 blocks_.clear ();
231+ append_data_.clear ();
232+ append_data_.shrink_to_fit ();
202233}
203234
204235std::string_view ColumnString::At (size_t n) const {
@@ -283,6 +314,7 @@ void ColumnString::Swap(Column& other) {
283314 auto & col = dynamic_cast <ColumnString &>(other);
284315 items_.swap (col.items_ );
285316 blocks_.swap (col.blocks_ );
317+ append_data_.swap (col.append_data_ );
286318}
287319
288320ItemView ColumnString::GetItem (size_t index) const {
0 commit comments