1414namespace oryx {
1515namespace detail {
1616
17+ template <typename T, typename ... Us>
18+ struct is_same_r : std::bool_constant<(std::is_same_v<T, Us> || ...)> {};
19+
20+ template <typename T, typename ... Us>
21+ inline constexpr bool is_same_r_v = is_same_r<T, Us...>::value;
22+
1723template <typename T>
1824constexpr auto FromChars (std::string_view s) -> std::optional<T> {
1925 T val;
@@ -33,18 +39,18 @@ constexpr auto FromChars<bool>(std::string_view s) -> std::optional<bool> {
3339}
3440
3541template <typename T>
36- auto Read (const std::string& val) -> std::optional<T> {
42+ constexpr auto Read (const std::string& val) -> std::optional<T> {
3743 using _T = std::remove_cvref_t <T>;
3844
39- if constexpr (std::is_same <_T, std::string>()) {
45+ if constexpr (std::is_same_v <_T, std::string>)
4046 return val;
41- } else if constexpr (std::is_same <_T, bool >()) {
47+ else if constexpr (std::is_same_v <_T, bool >)
4248 return FromChars<bool >(val);
43- } else if constexpr (std::is_floating_point <_T>()) {
49+ else if constexpr (std::is_floating_point_v <_T>)
4450 return FromChars<T>(val);
45- } else if constexpr (std::is_integral <_T>()) {
51+ else if constexpr (std::is_integral_v <_T>)
4652 return FromChars<T>(val);
47- } else {
53+ else {
4854 if (auto result = rfl::json::read<T>(val); result) {
4955 return result.value ();
5056 } else {
@@ -54,20 +60,19 @@ auto Read(const std::string& val) -> std::optional<T> {
5460}
5561
5662template <typename T>
57- auto Write (const T& obj) -> std::string {
63+ constexpr auto Write (const T& obj) {
5864 using _T = std::remove_cvref_t <T>;
5965
60- if constexpr (std::is_same <_T, std::string>()) {
66+ if constexpr (is_same_r_v <_T, std::string, std::string_view>)
6167 return obj;
62- } else if constexpr (std::is_same <_T, bool >()) {
68+ else if constexpr (std::is_same_v <_T, bool >)
6369 return std::to_string (static_cast <uint8_t >(obj));
64- } else if constexpr (std::is_floating_point <_T>()) {
70+ else if constexpr (std::is_floating_point_v <_T>)
6571 return std::to_string (obj);
66- } else if constexpr (std::is_integral <_T>()) {
72+ else if constexpr (std::is_integral_v <_T>)
6773 return std::to_string (obj);
68- } else {
74+ else
6975 return rfl::json::write (obj);
70- }
7176}
7277
7378} // namespace detail
@@ -79,11 +84,15 @@ class KeyValueDatabase {
7984 auto Open (const std::string& name, const leveldb::Options& opts = DefaultOptions()) -> leveldb::Status {
8085 Close ();
8186
87+ #ifdef __cpp_lib_out_ptr
88+ const auto status = leveldb::DB::Open (opts, name, std::out_ptr (handle_));
89+ #else
8290 leveldb::DB* db;
8391 const auto status = leveldb::DB::Open (opts, name, &db);
8492 if (status.ok ()) {
8593 handle_ = std::unique_ptr<leveldb::DB>(db);
8694 }
95+ #endif
8796 return status;
8897 }
8998
0 commit comments