aboutsummaryrefslogtreecommitdiffhomepage
path: root/tdutils/td/utils/StringBuilder.cpp
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2018-12-11 23:18:58 +0300
committerlevlam <levlam@telegram.org>2018-12-11 23:18:58 +0300
commit6445cf645b06b264540c292542c9f251cb28040a (patch)
treed67b559dd07a8952ec7075a92349fb892db759a9 /tdutils/td/utils/StringBuilder.cpp
parent70ad4eb366ac9cb32cbd36e55d71f99490ec103c (diff)
A lot of various fixes.
GitOrigin-RevId: 64963bfb55e5ffe8b099c1953143158b44a540c6
Diffstat (limited to 'tdutils/td/utils/StringBuilder.cpp')
-rw-r--r--tdutils/td/utils/StringBuilder.cpp35
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) {