| Index: compiled/String.h |
| diff --git a/compiled/String.h b/compiled/String.h |
| index a031621a087d2785a68ef2be6e1ec6918b08c6bb..043fdd075df5164eed9d52caad8135d42c46938e 100644 |
| --- a/compiled/String.h |
| +++ b/compiled/String.h |
| @@ -21,6 +21,7 @@ |
| #include <cstddef> |
| #include <cstring> |
| #include <type_traits> |
| +#include <utility> |
| #include "debug.h" |
| #include "library.h" |
| @@ -191,6 +192,38 @@ public: |
| } |
| } |
| } |
| + |
| + int64_t toInt64() const |
| + { |
| + size_type len = length(); |
| + if (len == 0) |
| + return 0; |
|
Wladimir Palant
2017/12/21 10:30:36
What about using StringScanner so that we won't ne
|
| + size_type pos = 0; |
| + bool negative = mBuf[0] == u'-'; |
| + if (negative) |
| + { |
| + ++pos; |
| + } |
| + int64_t result = 0; |
| + for (; pos < len && mBuf[pos] >= u'0' && mBuf[pos] <= u'9'; ++pos) |
| + { |
| + result *= 10; |
| + result += mBuf[pos] - u'0'; |
| + } |
|
hub
2017/11/22 15:40:12
No overflow checking?
int64_t is quite a lot of s
hub
2017/11/30 21:35:37
std::numeric_limits<int64_t>::digit10 is the value
|
| + return negative ? -result : result; |
| + } |
| + |
| + uint64_t toUInt64() const |
|
Wladimir Palant
2017/12/21 10:30:36
Nit: This should be called toUint64().
|
| + { |
| + uint64_t result = 0; |
| + size_type len = length(); |
| + for (size_type pos = 0; pos < len && mBuf[pos] >= u'0' && mBuf[pos] <= u'9'; ++pos) |
| + { |
| + result *= 10; |
| + result += mBuf[pos] - u'0'; |
| + } |
| + return result; |
| + } |
|
Wladimir Palant
2017/12/21 10:30:36
General note: this should be ok as a first iterati
|
| }; |
| class DependentString : public String |
| @@ -405,3 +438,36 @@ public: |
| } |
| } |
| }; |
| + |
| +template<typename Type> |
| +inline Type AdaptValue(const String& value); |
|
hub
2017/11/22 15:40:12
I would have called this "lexical_cast<>" probably
Wladimir Palant
2017/12/21 10:30:36
Can't we have that as an instance method instead?
|
| + |
| +template<> |
| +inline bool AdaptValue<bool>(const String& value) |
| +{ |
| + return value == u"true"_str; |
| +} |
| +template<> |
| +inline int AdaptValue<int>(const String& value) |
| +{ |
| + return static_cast<int>(value.toInt64()); |
| +} |
| +template<> |
| +inline uint64_t AdaptValue<uint64_t>(const String& value) |
| +{ |
| + return value.toUInt64(); |
| +} |
| +template<> |
| +inline OwnedString AdaptValue<OwnedString>(const String& value) |
| +{ |
| + return OwnedString{value}; |
| +} |
| + |
| +DependentString TrimSpaces(const String& value); |
| + |
| +inline std::pair<DependentString, DependentString> SplitString(const String& value, String::size_type separatorPos) |
| +{ |
| + const auto secondBeginPos = separatorPos < String::npos ? separatorPos + 1 : String::npos; |
| + return {DependentString{value, 0, separatorPos}, |
| + DependentString{value, secondBeginPos, value.length() - secondBeginPos}}; |
|
Wladimir Palant
2017/12/21 10:30:36
What is `value.length() - secondBeginPos` going to
sergei
2018/03/01 15:05:25
It's handled by the constructor of DependentString
|
| +} |
|
Wladimir Palant
2017/12/21 10:30:37
Why aren't these helpers methods of the String cla
sergei
2018/03/01 15:05:25
These functions are rather helper functions than m
|