forked from scylladb/scylladb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuser_provided_param.hh
135 lines (104 loc) · 3.12 KB
/
user_provided_param.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#pragma once
/*
* Copyright (C) 2024-present ScyllaDB
*/
/*
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
*/
#include <fmt/format.h>
#include <seastar/core/sstring.hh>
#include "enum_set.hh"
using namespace seastar;
namespace utils {
enum class optional_param_flag {
user_provided,
force
};
using optional_param_flags_set = enum_set<super_enum<optional_param_flag,
optional_param_flag::user_provided,
optional_param_flag::force
>>;
template <class T = sstring>
class optional_param_base {
public:
using value_type = T;
using flag = optional_param_flag;
using flags_set = optional_param_flags_set;
std::optional<T> _value;
// or implicitly provided as default by scylla
flags_set _flags;
public:
optional_param_base() = default;
explicit optional_param_base(sstring value, flags_set opts = {}) noexcept
: _value(std::move(value))
, _flags(opts)
{}
template <typename... Args>
optional_param_base& emplace(Args... args) {
_value.emplace(std::forward<Args>(args)...);
return *this;
}
constexpr explicit operator bool() const noexcept {
return has_value();
}
constexpr const T* operator->() const noexcept {
return &_value;
}
constexpr const T& operator*() const noexcept {
return *_value;
}
constexpr bool has_value() const noexcept {
return _value.has_value();
}
constexpr const T& value() const noexcept {
return _value.value();
}
constexpr T value_or(T&& default_value) const noexcept {
return _value.value_or(std::forward<T>(default_value));
}
flags_set flags() const noexcept {
return _flags;
}
constexpr bool user_provided() const noexcept {
return _flags.contains(flag::user_provided);
}
optional_param_base& set_user_provided(bool value = true) noexcept {
if (value) {
_flags.set(flag::user_provided);
} else {
_flags.remove(flag::user_provided);
}
return *this;
}
constexpr bool force() const noexcept {
return _flags.contains(flag::force);
}
optional_param_base& set_force(bool value = true) {
if (value) {
_flags.set(flag::force);
} else {
_flags.remove(flag::force);
}
return *this;
}
void reset() noexcept {
_value.reset();
_flags = {};
}
};
using optional_param = optional_param_base<sstring>;
} //namespace utils
template<>
struct fmt::formatter<utils::optional_param_flags_set> : fmt::formatter<string_view> {
auto format(const utils::optional_param_flags_set& flags, fmt::format_context& ctx) const -> decltype(ctx.out());
};
template<class T>
struct fmt::formatter<utils::optional_param_base<T>> : fmt::formatter<string_view> {
auto format(const utils::optional_param_base<T>& p, fmt::format_context& ctx) const -> decltype(ctx.out()) {
if (p) {
return fmt::format_to(ctx.out(), "{} ({})", p.value(), p.flags());
} else {
return fmt::format_to(ctx.out(), "(none)");
}
}
};