diff options
| author | levlam <levlam@telegram.org> | 2018-12-11 23:18:58 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2018-12-11 23:18:58 +0300 |
| commit | 6445cf645b06b264540c292542c9f251cb28040a (patch) | |
| tree | d67b559dd07a8952ec7075a92349fb892db759a9 /tdutils/td/utils/StringBuilder.cpp | |
| parent | 70ad4eb366ac9cb32cbd36e55d71f99490ec103c (diff) | |
A lot of various fixes.
GitOrigin-RevId: 64963bfb55e5ffe8b099c1953143158b44a540c6
Diffstat (limited to 'tdutils/td/utils/StringBuilder.cpp')
| -rw-r--r-- | tdutils/td/utils/StringBuilder.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/tdutils/td/utils/StringBuilder.cpp b/tdutils/td/utils/StringBuilder.cpp index 86dfdf87d..369bd7de9 100644 --- a/tdutils/td/utils/StringBuilder.cpp +++ b/tdutils/td/utils/StringBuilder.cpp @@ -6,17 +6,52 @@ // #include "td/utils/StringBuilder.h" +#include "td/utils/logging.h" #include "td/utils/misc.h" #include "td/utils/port/thread_local.h" +#include "td/utils/Slice.h" #include <cstdio> +#include <cstring> #include <limits> #include <locale> +#include <memory> #include <sstream> #include <utility> namespace td { +StringBuilder::StringBuilder(MutableSlice slice, bool use_buffer) + : begin_ptr_(slice.begin()), current_ptr_(begin_ptr_), use_buffer_(use_buffer) { + if (slice.size() <= reserved_size) { + auto buffer_size = reserved_size + 100; + buffer_ = std::make_unique<char[]>(buffer_size); + begin_ptr_ = buffer_.get(); + current_ptr_ = begin_ptr_; + end_ptr_ = begin_ptr_ + buffer_size - reserved_size; + } else { + end_ptr_ = slice.end() - reserved_size; + } +} + +StringBuilder &StringBuilder::operator<<(Slice slice) { + size_t size = slice.size(); + if (unlikely(!reserve(size))) { + if (end_ptr_ < current_ptr_) { + return on_error(); + } + auto available_size = static_cast<size_t>(end_ptr_ + reserved_size - 1 - current_ptr_); + if (size > available_size) { + error_flag_ = true; + size = available_size; + } + } + + std::memcpy(current_ptr_, slice.begin(), size); + current_ptr_ += size; + return *this; +} + template <class T> static char *print_uint(char *current_ptr, T x) { if (x < 100) { |
