Move some functions implementations to cpp.
GitOrigin-RevId: ff0db41e43df5152046160474f9b8cf52474b877
This commit is contained in:
parent
35d039f42f
commit
499e64430b
@ -68,10 +68,12 @@ set(TDUTILS_SOURCE
|
|||||||
td/utils/HttpUrl.cpp
|
td/utils/HttpUrl.cpp
|
||||||
td/utils/JsonBuilder.cpp
|
td/utils/JsonBuilder.cpp
|
||||||
td/utils/logging.cpp
|
td/utils/logging.cpp
|
||||||
|
td/utils/misc.cpp
|
||||||
td/utils/MimeType.cpp
|
td/utils/MimeType.cpp
|
||||||
td/utils/Random.cpp
|
td/utils/Random.cpp
|
||||||
td/utils/StackAllocator.cpp
|
td/utils/StackAllocator.cpp
|
||||||
td/utils/Status.cpp
|
td/utils/Status.cpp
|
||||||
|
td/utils/StringBuilder.cpp
|
||||||
td/utils/Time.cpp
|
td/utils/Time.cpp
|
||||||
td/utils/Timer.cpp
|
td/utils/Timer.cpp
|
||||||
td/utils/tl_parsers.cpp
|
td/utils/tl_parsers.cpp
|
||||||
@ -162,10 +164,10 @@ set(TDUTILS_SOURCE
|
|||||||
td/utils/queue.h
|
td/utils/queue.h
|
||||||
td/utils/Random.h
|
td/utils/Random.h
|
||||||
td/utils/ScopeGuard.h
|
td/utils/ScopeGuard.h
|
||||||
|
td/utils/SharedObjectPool.h
|
||||||
td/utils/Slice-decl.h
|
td/utils/Slice-decl.h
|
||||||
td/utils/Slice.h
|
td/utils/Slice.h
|
||||||
td/utils/SpinLock.h
|
td/utils/SpinLock.h
|
||||||
td/utils/SharedObjectPool.h
|
|
||||||
td/utils/StackAllocator.h
|
td/utils/StackAllocator.h
|
||||||
td/utils/Status.h
|
td/utils/Status.h
|
||||||
td/utils/Storer.h
|
td/utils/Storer.h
|
||||||
|
108
tdutils/td/utils/StringBuilder.cpp
Normal file
108
tdutils/td/utils/StringBuilder.cpp
Normal file
@ -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
|
@ -11,7 +11,6 @@
|
|||||||
#include "td/utils/StackAllocator.h"
|
#include "td/utils/StackAllocator.h"
|
||||||
|
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@ -31,6 +30,7 @@ class StringBuilder {
|
|||||||
current_ptr_ = begin_ptr_;
|
current_ptr_ = begin_ptr_;
|
||||||
error_flag_ = false;
|
error_flag_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MutableCSlice as_cslice() {
|
MutableCSlice as_cslice() {
|
||||||
if (current_ptr_ >= end_ptr_ + reserved_size) {
|
if (current_ptr_ >= end_ptr_ + reserved_size) {
|
||||||
std::abort(); // shouldn't happen
|
std::abort(); // shouldn't happen
|
||||||
@ -82,101 +82,30 @@ class StringBuilder {
|
|||||||
return *this << static_cast<int>(c);
|
return *this << static_cast<int>(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: optimize
|
StringBuilder &operator<<(int x);
|
||||||
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<<(unsigned 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<<(long 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 unsigned 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 long 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 unsigned 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<<(double x) {
|
StringBuilder &operator<<(double x);
|
||||||
if (unlikely(end_ptr_ < current_ptr_)) {
|
|
||||||
return on_error();
|
StringBuilder &operator<<(const void *ptr);
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
StringBuilder &operator<<(const T *ptr) {
|
StringBuilder &operator<<(const T *ptr) {
|
||||||
if (unlikely(end_ptr_ < current_ptr_)) {
|
return *this << static_cast<const void *>(ptr);
|
||||||
return on_error();
|
|
||||||
}
|
|
||||||
current_ptr_ += std::snprintf(current_ptr_, reserved_size, "%p", ptr);
|
|
||||||
return *this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vprintf(const char *fmt, va_list list) {
|
void vprintf(const char *fmt, va_list list);
|
||||||
if (unlikely(end_ptr_ < current_ptr_)) {
|
|
||||||
on_error();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto left = end_ptr_ + reserved_size - current_ptr_;
|
void printf(const char *fmt, ...) TD_ATTRIBUTE_FORMAT_PRINTF(2, 3);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char *begin_ptr_;
|
char *begin_ptr_;
|
||||||
|
63
tdutils/td/utils/misc.cpp
Normal file
63
tdutils/td/utils/misc.cpp
Normal file
@ -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
|
@ -12,8 +12,8 @@
|
|||||||
#include "td/utils/Status.h"
|
#include "td/utils/Status.h"
|
||||||
#include "td/utils/StringBuilder.h"
|
#include "td/utils/StringBuilder.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdlib>
|
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
@ -23,15 +23,7 @@
|
|||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
inline char *str_dup(Slice str) {
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
std::pair<T, T> split(T s, char delimiter = ' ') {
|
std::pair<T, T> split(T s, char delimiter = ' ') {
|
||||||
@ -54,16 +46,7 @@ vector<T> full_split(T s, char delimiter = ' ') {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline string implode(vector<string> v, char delimiter = ' ') {
|
string implode(vector<string> v, char delimiter = ' ');
|
||||||
string result;
|
|
||||||
for (auto &str : v) {
|
|
||||||
if (!result.empty()) {
|
|
||||||
result += delimiter;
|
|
||||||
}
|
|
||||||
result += str;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
@ -209,29 +192,7 @@ T trim(T str) {
|
|||||||
return T(begin, end);
|
return T(begin, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline string oneline(Slice str) {
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
std::enable_if_t<std::is_signed<T>::value, T> to_integer(Slice str) {
|
std::enable_if_t<std::is_signed<T>::value, T> to_integer(Slice str) {
|
||||||
@ -303,9 +264,7 @@ typename std::enable_if<std::is_unsigned<T>::value, T>::type hex_to_integer(Slic
|
|||||||
return integer_value;
|
return integer_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline double to_double(CSlice str) {
|
double to_double(CSlice str);
|
||||||
return std::atof(str.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
T clamp(T value, T min_value, T max_value) {
|
T clamp(T value, T min_value, T max_value) {
|
||||||
|
Reference in New Issue
Block a user