Skip to content

Commit

Permalink
Move some functions implementations to cpp.
Browse files Browse the repository at this point in the history
GitOrigin-RevId: ff0db41e43df5152046160474f9b8cf52474b877
  • Loading branch information
levlam committed Feb 3, 2018
1 parent 35d039f commit 499e644
Show file tree
Hide file tree
Showing 5 changed files with 192 additions and 131 deletions.
4 changes: 3 additions & 1 deletion tdutils/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,12 @@ set(TDUTILS_SOURCE
td/utils/HttpUrl.cpp
td/utils/JsonBuilder.cpp
td/utils/logging.cpp
td/utils/misc.cpp
td/utils/MimeType.cpp
td/utils/Random.cpp
td/utils/StackAllocator.cpp
td/utils/Status.cpp
td/utils/StringBuilder.cpp
td/utils/Time.cpp
td/utils/Timer.cpp
td/utils/tl_parsers.cpp
Expand Down Expand Up @@ -162,10 +164,10 @@ set(TDUTILS_SOURCE
td/utils/queue.h
td/utils/Random.h
td/utils/ScopeGuard.h
td/utils/SharedObjectPool.h
td/utils/Slice-decl.h
td/utils/Slice.h
td/utils/SpinLock.h
td/utils/SharedObjectPool.h
td/utils/StackAllocator.h
td/utils/Status.h
td/utils/Storer.h
Expand Down
108 changes: 108 additions & 0 deletions tdutils/td/utils/StringBuilder.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/utils/StringBuilder.h"

#include <cstdio>

namespace td {

// TODO: optimize
StringBuilder &StringBuilder::operator<<(int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%d", x);
return *this;
}

StringBuilder &StringBuilder::operator<<(unsigned int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%u", x);
return *this;
}

StringBuilder &StringBuilder::operator<<(long int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%ld", x);
return *this;
}

StringBuilder &StringBuilder::operator<<(long unsigned int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%lu", x);
return *this;
}

StringBuilder &StringBuilder::operator<<(long long int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%lld", x);
return *this;
}

StringBuilder &StringBuilder::operator<<(long long unsigned int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%llu", x);
return *this;
}

StringBuilder &StringBuilder::operator<<(double x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
auto left = end_ptr_ + reserved_size - current_ptr_;
int len = std::snprintf(current_ptr_, left, "%lf", x);
if (unlikely(len >= left)) {
error_flag_ = true;
current_ptr_ += left - 1;
} else {
current_ptr_ += len;
}
return *this;
}

StringBuilder &StringBuilder::operator<<(const void *ptr) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%p", ptr);
return *this;
}

void StringBuilder::vprintf(const char *fmt, va_list list) {
if (unlikely(end_ptr_ < current_ptr_)) {
on_error();
return;
}

auto left = end_ptr_ + reserved_size - current_ptr_;
int len = std::vsnprintf(current_ptr_, left, fmt, list);
if (unlikely(len >= left)) {
error_flag_ = true;
current_ptr_ += left - 1;
} else {
current_ptr_ += len;
}
}

void StringBuilder::printf(const char *fmt, ...) {
va_list list;
va_start(list, fmt);
vprintf(fmt, list);
va_end(list);
}

} // namespace td
97 changes: 13 additions & 84 deletions tdutils/td/utils/StringBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "td/utils/StackAllocator.h"

#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <type_traits>
Expand All @@ -31,6 +30,7 @@ class StringBuilder {
current_ptr_ = begin_ptr_;
error_flag_ = false;
}

MutableCSlice as_cslice() {
if (current_ptr_ >= end_ptr_ + reserved_size) {
std::abort(); // shouldn't happen
Expand Down Expand Up @@ -82,101 +82,30 @@ class StringBuilder {
return *this << static_cast<int>(c);
}

// TODO: optimize
StringBuilder &operator<<(int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%d", x);
return *this;
}
StringBuilder &operator<<(int x);

StringBuilder &operator<<(unsigned int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%u", x);
return *this;
}
StringBuilder &operator<<(unsigned int x);

StringBuilder &operator<<(long int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%ld", x);
return *this;
}
StringBuilder &operator<<(long int x);

StringBuilder &operator<<(long unsigned int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%lu", x);
return *this;
}
StringBuilder &operator<<(long unsigned int x);

StringBuilder &operator<<(long long int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%lld", x);
return *this;
}
StringBuilder &operator<<(long long int x);

StringBuilder &operator<<(long long unsigned int x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%llu", x);
return *this;
}
StringBuilder &operator<<(long long unsigned int x);

StringBuilder &operator<<(double x) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
auto left = end_ptr_ + reserved_size - current_ptr_;
int len = std::snprintf(current_ptr_, left, "%lf", x);
if (unlikely(len >= left)) {
error_flag_ = true;
current_ptr_ += left - 1;
} else {
current_ptr_ += len;
}
return *this;
}
StringBuilder &operator<<(double x);

StringBuilder &operator<<(const void *ptr);

template <class T>
StringBuilder &operator<<(const T *ptr) {
if (unlikely(end_ptr_ < current_ptr_)) {
return on_error();
}
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%p", ptr);
return *this;
return *this << static_cast<const void *>(ptr);
}

void vprintf(const char *fmt, va_list list) {
if (unlikely(end_ptr_ < current_ptr_)) {
on_error();
return;
}
void vprintf(const char *fmt, va_list list);

auto left = end_ptr_ + reserved_size - current_ptr_;
int len = std::vsnprintf(current_ptr_, left, fmt, list);
if (unlikely(len >= left)) {
error_flag_ = true;
current_ptr_ += left - 1;
} else {
current_ptr_ += len;
}
}

void printf(const char *fmt, ...) TD_ATTRIBUTE_FORMAT_PRINTF(2, 3) {
va_list list;
va_start(list, fmt);
vprintf(fmt, list);
va_end(list);
}
void printf(const char *fmt, ...) TD_ATTRIBUTE_FORMAT_PRINTF(2, 3);

private:
char *begin_ptr_;
Expand Down
63 changes: 63 additions & 0 deletions tdutils/td/utils/misc.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/utils/misc.h"

#include <algorithm>
#include <cstdlib>

namespace td {

char *str_dup(Slice str) {
char *res = static_cast<char *>(std::malloc(str.size() + 1));
if (res == nullptr) {
return nullptr;
}
std::copy(str.begin(), str.end(), res);
res[str.size()] = '\0';
return res;
}

string implode(vector<string> v, char delimiter) {
string result;
for (auto &str : v) {
if (!result.empty()) {
result += delimiter;
}
result += str;
}
return result;
}

string oneline(Slice str) {
string result;
result.reserve(str.size());
bool after_new_line = true;
for (auto c : str) {
if (c != '\n') {
if (after_new_line) {
if (c == ' ') {
continue;
}
after_new_line = false;
}
result += c;
} else {
after_new_line = true;
result += ' ';
}
}
while (!result.empty() && result.back() == ' ') {
result.pop_back();
}
return result;
}

double to_double(CSlice str) {
return std::atof(str.c_str());
}

} // namespace td

0 comments on commit 499e644

Please sign in to comment.