aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/encode/encoder_state.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/monlib/encode/encoder_state.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/monlib/encode/encoder_state.h')
-rw-r--r--library/cpp/monlib/encode/encoder_state.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/library/cpp/monlib/encode/encoder_state.h b/library/cpp/monlib/encode/encoder_state.h
new file mode 100644
index 0000000000..e6a098f404
--- /dev/null
+++ b/library/cpp/monlib/encode/encoder_state.h
@@ -0,0 +1,62 @@
+#pragma once
+
+#include "encoder_state_enum.h"
+
+#include <util/generic/serialized_enum.h>
+#include <util/generic/yexception.h>
+
+
+namespace NMonitoring {
+
+ template <typename EEncoderState>
+ class TEncoderStateImpl {
+ public:
+ using EState = EEncoderState;
+
+ explicit TEncoderStateImpl(EEncoderState state = EEncoderState::ROOT)
+ : State_(state)
+ {
+ }
+
+ TEncoderStateImpl& operator=(EEncoderState rhs) noexcept {
+ State_ = rhs;
+ return *this;
+ }
+
+ inline bool operator==(EEncoderState rhs) const noexcept {
+ return State_ == rhs;
+ }
+
+ inline bool operator!=(EEncoderState rhs) const noexcept {
+ return !operator==(rhs);
+ }
+
+ [[noreturn]] inline void ThrowInvalid(TStringBuf message) const {
+ ythrow yexception() << "invalid encoder state: "
+ << ToStr() << ", " << message;
+ }
+
+ inline void Expect(EEncoderState expected) const {
+ if (Y_UNLIKELY(State_ != expected)) {
+ ythrow yexception()
+ << "invalid encoder state: " << ToStr()
+ << ", expected: " << TEncoderStateImpl(expected).ToStr();
+ }
+ }
+
+ inline void Switch(EEncoderState from, EEncoderState to) {
+ Expect(from);
+ State_ = to;
+ }
+
+ TStringBuf ToStr() const noexcept {
+ return NEnumSerializationRuntime::GetEnumNamesImpl<EEncoderState>().at(State_);
+ }
+
+ private:
+ EEncoderState State_;
+ };
+
+ using TEncoderState = TEncoderStateImpl<EEncoderState>;
+
+} // namespace NMonitoring