aboutsummaryrefslogtreecommitdiffstats
path: root/util/string/cast.h
diff options
context:
space:
mode:
authorevelkin <evelkin@yandex-team.com>2022-08-09 21:48:31 +0300
committerevelkin <evelkin@yandex-team.com>2022-08-09 21:48:31 +0300
commitdd2db1bb6afc3705b308e83bef1a467ac38d4427 (patch)
tree08057116ec1ec06069c4ed0fdf0ffacfa76fe2e3 /util/string/cast.h
parentf07e857ae1593c68375cdea3a2a9bdbdd164ccc8 (diff)
downloadydb-dd2db1bb6afc3705b308e83bef1a467ac38d4427.tar.gz
Introduce TryFromString returning TMaybe
Позволяем писать без неиницилизированных переменных по месту использования. Вот такую красоту например: ``` if (auto a = TryFromString<T>(str)) { что-то делаем с \*a } ```
Diffstat (limited to 'util/string/cast.h')
-rw-r--r--util/string/cast.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/util/string/cast.h b/util/string/cast.h
index 90e925c194..3d94ecb0de 100644
--- a/util/string/cast.h
+++ b/util/string/cast.h
@@ -2,6 +2,7 @@
#include <util/system/defaults.h>
#include <util/stream/str.h>
+#include <util/generic/maybe.h>
#include <util/generic/string.h>
#include <util/generic/strbuf.h>
#include <util/generic/typetraits.h>
@@ -270,6 +271,36 @@ inline bool TryFromString(const TUtf16String& s, T& result) {
return TryFromString<T>(s.data(), s.size(), result);
}
+template <class T, class TChar>
+inline TMaybe<T> TryFromString(TBasicStringBuf<TChar> s) {
+ TMaybe<T> result{NMaybe::TInPlace{}};
+ if (!TryFromString<T>(s, *result)) {
+ result.Clear();
+ }
+
+ return result;
+}
+
+template <class T, class TChar>
+inline TMaybe<T> TryFromString(const TChar* data) {
+ return TryFromString<T>(TBasicStringBuf<TChar>(data));
+}
+
+template <class T>
+inline TMaybe<T> TryFromString(const TString& s) {
+ return TryFromString<T>(TStringBuf(s));
+}
+
+template <class T>
+inline TMaybe<T> TryFromString(const std::string& s) {
+ return TryFromString<T>(TStringBuf(s));
+}
+
+template <class T>
+inline TMaybe<T> TryFromString(const TUtf16String& s) {
+ return TryFromString<T>(TWtringBuf(s));
+}
+
template <class T, class TStringType>
inline bool TryFromStringWithDefault(const TStringType& s, T& result, const T& def) {
return TryFromString<T>(s.data(), s.size(), result, def);