diff options
author | crupest <crupest@outlook.com> | 2022-03-09 23:12:26 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-03-09 23:12:26 +0800 |
commit | dceef749139061fdac4946df77219f1cc8aa6483 (patch) | |
tree | 0b413e605183226034fdaf342adfd6dc5e8fc08e /include/cru/common/StringToNumberConverter.h | |
parent | 78f5221e8fbab510bb8b5ac268b7d42bed762961 (diff) | |
download | cru-dceef749139061fdac4946df77219f1cc8aa6483.tar.gz cru-dceef749139061fdac4946df77219f1cc8aa6483.tar.bz2 cru-dceef749139061fdac4946df77219f1cc8aa6483.zip |
...
Diffstat (limited to 'include/cru/common/StringToNumberConverter.h')
-rw-r--r-- | include/cru/common/StringToNumberConverter.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/include/cru/common/StringToNumberConverter.h b/include/cru/common/StringToNumberConverter.h new file mode 100644 index 00000000..e68d12a6 --- /dev/null +++ b/include/cru/common/StringToNumberConverter.h @@ -0,0 +1,50 @@ +#pragma once +#include "Base.h" + +namespace cru { +struct StringToNumberFlags { + constexpr static unsigned kNoFlags = 0; + constexpr static unsigned kAllowLeadingSpaces = 1 << 0; + constexpr static unsigned kAllowTrailingSpaces = 1 << 1; + constexpr static unsigned kAllowTrailingJunk = 1 << 2; + constexpr static unsigned kAllowLeadingZeroForInteger = 1 << 2; + constexpr static unsigned kThrowOnError = 1 << 3; +}; + +struct StringToIntegerConverterImplResult { + bool negate; + unsigned long long value; +}; + +/** + * \brief A converter that convert number into long long. + */ +struct StringToIntegerConverterImpl { + public: + explicit StringToIntegerConverterImpl(unsigned flags, int base = 0) + : flags(flags), base(base) {} + + bool CheckParams() const; + + /** + * \brief Convert string to long long. + * \param str The string to convert. + * \param size The size of the string. + * \param processed_characters_count The number of characters that were + * processed. Or nullptr to not retrieve. + */ + StringToIntegerConverterImplResult Parse( + const char* str, Index size, Index* processed_characters_count) const; + + unsigned flags; + /** + * \brief The base of the number used for parse or 0 for auto detect. + * \remarks Base can only be of range [2, 36] or 0. If base is 0, decimal is + * assumed by default ,or if str is started with "0x" or "0X" hexadecimal is + * assumed, or if str is started with a single "0" octoral is assumed, or if + * str is started with "0b" or "0B" binary is assumed. Otherwise it is an + * error. + */ + int base; +}; +} // namespace cru |