25#include "boost/functional/hash.hpp"
36 static GlobalState &
get() {
37 static GlobalState instance;
45 _allMaskDicts.insert(dict);
48 return _defaultMaskDict;
54 _allMaskDicts.insert(result);
64 _defaultMaskDict =
copy(*_defaultMaskDict);
65 return _defaultMaskDict;
68 template <
typename Functor>
72 for (
auto const &ptr : _allMaskDicts) {
79 _allMaskDicts.insert(_defaultMaskDict);
80 _defaultMaskDict->_addInitialMaskPlanes();
83 GlobalState(GlobalState
const &) =
delete;
84 GlobalState(GlobalState &&) =
delete;
86 GlobalState &operator=(GlobalState
const &) =
delete;
87 GlobalState &operator=(GlobalState &&) =
delete;
89 ~GlobalState() =
default;
94 for (
auto iter = _allMaskDicts.begin(); iter != _allMaskDicts.end();) {
95 if (iter->expired()) {
96 iter = _allMaskDicts.erase(iter);
121 [bitId](
auto const &item) { return item.second == bitId; });
122 if (found == dict.
end()) {
124 if (dict.
find(name) == dict.
end()) {
125 dict.
add(name, bitId);
141 [](
auto const &a,
auto const &b) {
return a.second < b.second; });
142 assert(maxIter !=
end());
143 int id = maxIter->second + 1;
145 for (
int i = 0; i < id; ++i) {
147 auto const sameIter =
149 if (sameIter ==
end()) {
158 auto iter =
find(name);
159 return (iter ==
end()) ? -1 : iter->second;
163 for (
auto const &item : *
this) {
169 return this == &rhs || (_hash == rhs._hash && _dict == rhs._dict);
174 _hash = boost::hash<MaskPlaneDict>()(_dict);
179 _hash = boost::hash<MaskPlaneDict>()(_dict);
187void MaskDict::_addInitialMaskPlanes() {
191 _dict[
"INTRP"] = ++i;
194 _dict[
"DETECTED"] = ++i;
195 _dict[
"DETECTED_NEGATIVE"] = ++i;
196 _dict[
"SUSPECT"] = ++i;
197 _dict[
"NO_DATA"] = ++i;
198 _dict[
"VIGNETTED"] = ++i;
199 _dict[
"STREAK"] = ++i;
200 _hash = boost::hash<MaskPlaneDict>()(_dict);
203MaskDict::MaskDict() : _dict(), _hash(0x0) {}
std::shared_ptr< MaskDict > getDefault() const noexcept
static GlobalState & get()
std::shared_ptr< MaskDict > copyOrGetDefault(MaskPlaneDict const &mpd)
std::shared_ptr< MaskDict > copy(MaskDict const &dict)
void setDefault(std::shared_ptr< MaskDict > dict)
void forEachMaskDict(Functor functor)
std::shared_ptr< MaskDict > detachDefault()
int getMaskPlane(std::string const &name) const
const_iterator begin() const noexcept
static void addAllMasksPlane(std::string const &name, int bitId)
static std::shared_ptr< MaskDict > detachDefault()
const_iterator end() const noexcept
static std::shared_ptr< MaskDict > getDefault()
std::shared_ptr< MaskDict > clone() const
static void setDefault(std::shared_ptr< MaskDict > dict)
bool operator==(MaskDict const &rhs) const
const_iterator find(std::string const &name) const
int getUnusedPlane() const
void add(std::string const &name, int bitId)
static std::shared_ptr< MaskDict > copyOrGetDefault(MaskPlaneDict const &dict)
bool empty() const noexcept
void erase(std::string const &name)
std::map< std::string, int > MaskPlaneDict