#include "type.h" #include "ascii.h" #include bool IsSpace(const char* s, size_t len) noexcept { if (len == 0) { return false; } for (const char* p = s; p < s + len; ++p) { if (!IsAsciiSpace(*p)) { return false; } } return true; } template static bool IsNumberT(const TStringType& s) noexcept { if (s.empty()) { return false; } return std::all_of(s.begin(), s.end(), IsAsciiDigit); } bool IsNumber(const TStringBuf s) noexcept { return IsNumberT(s); } bool IsNumber(const TWtringBuf s) noexcept { return IsNumberT(s); } template static bool IsHexNumberT(const TStringType& s) noexcept { if (s.empty()) { return false; } return std::all_of(s.begin(), s.end(), IsAsciiHex); } bool IsHexNumber(const TStringBuf s) noexcept { return IsHexNumberT(s); } bool IsHexNumber(const TWtringBuf s) noexcept { return IsHexNumberT(s); } namespace { template bool IsCaseInsensitiveAnyOf(TStringBuf str, const std::array& options) { for (auto option : options) { if (str.size() == option.size() && ::strnicmp(str.data(), option.data(), str.size()) == 0) { return true; } } return false; } } // anonymous namespace bool IsTrue(const TStringBuf v) noexcept { static constexpr std::array trueOptions{ "true", "t", "yes", "y", "on", "1", "da"}; return IsCaseInsensitiveAnyOf(v, trueOptions); } bool IsFalse(const TStringBuf v) noexcept { static constexpr std::array falseOptions{ "false", "f", "no", "n", "off", "0", "net"}; return IsCaseInsensitiveAnyOf(v, falseOptions); }