// // 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 "td/utils/port/thread_local.h" #include #include #include #include namespace td { char *str_dup(Slice str) { char *res = static_cast(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 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(Slice str) { static TD_THREAD_LOCAL std::stringstream *ss; if (init_thread_local(ss)) { ss->imbue(std::locale::classic()); } else { ss->str(std::string()); ss->clear(); } ss->write(str.begin(), narrow_cast(str.size())); double result = 0.0; *ss >> result; return result; } } // namespace td