git / moonbite-core / src/util/string.h · raw

// Copyright (c) 2019-2020 The Bitcoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#ifndef BITCOIN_UTIL_STRING_H#define BITCOIN_UTIL_STRING_H#include <attributes.h>#include <algorithm>#include <array>#include <cstring>#include <cstdint>#include <locale>#include <sstream>#include <string>#include <vector>NODISCARD inline std::string TrimString(const std::string& str, const std::string& pattern = " \f\n\r\t\v"){    std::string::size_type front = str.find_first_not_of(pattern);    if (front == std::string::npos) {        return std::string();    }    std::string::size_type end = str.find_last_not_of(pattern);    return str.substr(front, end - front + 1);}/** * Join a list of items * * @param list       The list to join * @param separator  The separator * @param unary_op   Apply this operator to each item in the list */template <typename T, typename BaseType, typename UnaryOp>auto Join(const std::vector<T>& list, const BaseType& separator, UnaryOp unary_op)    -> decltype(unary_op(list.at(0))){    decltype(unary_op(list.at(0))) ret;    for (size_t i = 0; i < list.size(); ++i) {        if (i > 0) ret += separator;        ret += unary_op(list.at(i));    }    return ret;}template <typename T>T Join(const std::vector<T>& list, const T& separator){    return Join(list, separator, [](const T& i) { return i; });}// Explicit overload needed for c_str arguments, which would otherwise cause a substitution failure in the template above.inline std::string Join(const std::vector<std::string>& list, const std::string& separator){    return Join<std::string>(list, separator);}/** * Check if a string does not contain any embedded NUL (\0) characters */NODISCARD inline bool ValidAsCString(const std::string& str) noexcept{    return str.size() == strlen(str.c_str());}/** * Locale-independent version of std::to_string */template <typename T>std::string ToString(const T& t){    std::ostringstream oss;    oss.imbue(std::locale::classic());    oss << t;    return oss.str();}/** * Check whether a container begins with the given prefix. */template <typename T1, size_t PREFIX_LEN>NODISCARD inline bool HasPrefix(const T1& obj,                                const std::array<uint8_t, PREFIX_LEN>& prefix){    return obj.size() >= PREFIX_LEN &&           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));}#endif // BITCOIN_UTIL_STRENCODINGS_H