diff --git a/Telegram/SourceFiles/data/data_flags.h b/Telegram/SourceFiles/data/data_flags.h new file mode 100644 index 000000000..6a9520983 --- /dev/null +++ b/Telegram/SourceFiles/data/data_flags.h @@ -0,0 +1,88 @@ +// +// This file is part of Kepka, +// an unofficial desktop version of Telegram messaging app, +// see https://github.com/procxx/kepka +// +// Kepka is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// It is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// In addition, as a special exception, the copyright holders give permission +// to link the code of portions of this program with the OpenSSL library. +// +// Full license: https://github.com/procxx/kepka/blob/master/LICENSE +// Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org +// Copyright (c) 2017- Kepka Contributors, https://github.com/procxx +// +#pragma once + + +namespace Data { + +template < + typename FlagsType, + typename FlagsType::Type kEssential = -1> +class Flags { +public: + struct Change { + Change(FlagsType diff, FlagsType value) + : diff(diff) + , value(value) { + } + FlagsType diff = 0; + FlagsType value = 0; + }; + + Flags() = default; + Flags(FlagsType value) : _value(value) { + } + + void set(FlagsType which) { + if (auto diff = which ^ _value) { + _value = which; + updated(diff); + } + } + void add(FlagsType which) { + if (auto diff = which & ~_value) { + _value |= which; + updated(diff); + } + } + void remove(FlagsType which) { + if (auto diff = which & _value) { + _value &= ~which; + updated(diff); + } + } + FlagsType current() const { + return _value; + } +// rpl::producer changes() const { +// return _changes.events(); +// } +// rpl::producer value() const { +// return _changes.events_starting_with({ +// FlagsType::from_raw(kEssential), +// _value }); +// } + +private: + void updated(FlagsType diff) { + if ((diff &= FlagsType::from_raw(kEssential))) { + _changes.fire({ diff, _value }); + } + } + + FlagsType _value = 0; + //rpl::event_stream _changes; + +}; + +} // namespace Data