12 template <
typename ArrayT, ArrayT Arr>
15 static constexpr
auto begin() {
return std::begin(Arr); }
16 static constexpr
auto end() {
return std::end(Arr); }
18 static constexpr
auto findValue(
const decltype(Arr[0].second)& val) {
20 for (; it !=
end(); ++it) {
21 if (it->second == val) {
27 static constexpr
auto findKey(
const decltype(Arr[0].first)& val) {
29 for (; it !=
end(); ++it) {
30 if (strcmp(it->first, val) == 0) {
38 template <
typename Iterator,
typename Map>
39 std::vector<Iterator>
copyIterators(
const std::vector<Iterator>& oldV,
const Map& oldM, Map& newM) {
40 std::vector<Iterator> newV(oldV.size(), newM.end());
41 for (
auto i = 0u; i < oldV.size(); ++i) {
42 if (oldV[i] != oldM.end()) {
43 newV[i] = newM.find(oldV[i]->first);
49 template <
typename Iterator,
typename Vector>
51 for (
auto& elem : v) {
52 if (elem == replace) {
66 template <
typename ValueT,
typename PairArrayT, PairArrayT PairArray>
71 using Map = std::map<std::string, ValueT>;
72 using Vec = std::vector<typename Map::iterator>;
73 using Enum = std::decay_t<decltype(PairArray[0].second)>;
88 m_ = std::move(rhs.m_);
89 v_ = std::move(rhs.v_);
100 HybridMap(
const std::initializer_list<std::pair<const std::string, ValueT>>& list) {
101 for (
const auto& item : list) {
105 template <
typename InputIterator>
116 const auto pos =
static_cast<size_t>(k);
117 return v_.size() < pos + 1 ? m_.end() : v_[pos];
121 const auto pos =
static_cast<size_t>(k);
122 return v_.size() < pos + 1 ? m_.end() : v_[pos];
131 auto it = m_.insert(v);
139 auto it = m_.insert(hint, v);
145 auto itV =
std::find(v_.begin(), v_.end(), pos);
146 if (itV != v_.end()) {
149 return m_.erase(pos);
163 if (it == m_.end()) {
172 auto attr = Array::findValue(k);
180 if (it == m_.end()) {
181 throw std::out_of_range(std::string(
"Could not find ") + k);
187 if (it == m_.end()) {
188 throw std::out_of_range(std::string(
"Could not find ") + std::to_string(static_cast<int>(k)));
195 if (it == m_.end()) {
196 throw std::out_of_range(std::string(
"Could not find ") + k);
202 if (it == m_.end()) {
203 throw std::out_of_range(std::string(
"Could not find ") + std::to_string(static_cast<int>(k)));
208 void clear() { m_.clear(), v_.clear(); }
210 bool empty()
const {
return m_.empty(); }
211 size_t size()
const {
return m_.size(); }
221 auto attr = Array::findKey(it->first.c_str());
222 if (attr != std::end(PairArray)) {
223 const auto pos =
static_cast<size_t>(attr->second);
224 if (v_.size() < pos + 1) {
225 v_.resize(pos + 1, m_.end());
234 template <
typename Value,
typename Enum, const std::pair<const
char*, const Enum> Lookup[]>
235 std::ostream& operator<<(std::ostream& stream, HybridMap<Value, Enum, Lookup> map) {
237 for (
const auto& elem : map) {
238 stream <<
"{" << elem.first <<
": " << elem.second <<
"}";
240 return stream <<
"}";
bool operator!=(const HybridMap &other) const
std::vector< Iterator > copyIterators(const std::vector< Iterator > &oldV, const Map &oldM, Map &newM)
std::decay_t< decltype(PairArray[0].second)> Enum
typename Map::iterator iterator
auto find(ContainerT &&c, const ValueT &val)
typename Map::const_iterator const_iterator
A hybrid map is just like a normal map with keys as string, but elements can also be accessed using a...
ValueT & at(const key_type &k)
static constexpr auto findValue(const decltype(Arr[0].second)&val)
static constexpr auto begin()
std::pair< iterator, bool > insert(const value_type &v)
iterator find(const key_type &k)
ValueT & operator[](const key_type &k)
const ValueT & at(const key_type &k) const
iterator insert(const_iterator hint, const value_type &v)
const_iterator end() const
iterator erase(const_iterator pos)
size_type erase(const std::string &k)
static constexpr auto findKey(const decltype(Arr[0].first)&val)
HybridMap(const HybridMap &rhs)
typename Map::value_type value_type
const_iterator find(Enum k) const
const_iterator find(const key_type &k) const
HybridMap & operator=(HybridMap &&rhs) noexcept
HybridMap(const std::initializer_list< std::pair< const std::string, ValueT >> &list)
const ValueT & at(const Enum &k) const
HybridMap & operator=(const HybridMap &rhs)
typename Map::difference_type difference_type
ValueT & operator[](const Enum &k)
std::map< std::string, RuleParameters > Map
void replaceIterator(Vector &v, const Iterator &replace, const Iterator &by)
const_iterator begin() const
bool operator==(const HybridMap &other) const
ValueT & at(const Enum &k)
HybridMap(InputIterator begin, InputIterator end)
typename Map::size_type size_type
typename Map::key_type key_type
void updateV(iterator it)
typename Map::mapped_type mapped_type
static constexpr auto end()
std::vector< typename Map::iterator > Vec