40 class const_iterator :
public std::iterator<std::bidirectional_iterator_tag, std::pair<const _KeyType&, const _ValueType&>>
44 typedef std::pair<typename _Key_Container::iterator, typename _Mapped_Container::iterator>
value_type;
59 using _Tree = _Key_Container;
60 using _RTree = _Mapped_Container;
61 using _Tree_Node = std::pair<key_type, value_type>;
62 using _RTree_Node = std::pair<rkey_type, rvalue_type>;
66 static_assert(std::is_same_v<key_type, typename _Tree::key_type>,
67 "OdTrVisBimap::key_type has to match _Container_Type::key_type!");
68 static_assert(std::is_same_v<rkey_type, typename _RTree::key_type>,
69 "OdTrVisBimap::rkey_type has to match _Reverse_Container_Type::key_type!");
71 static_assert(std::is_same<key_type, typename _Tree::key_type>::value,
72 "OdTrVisBimap::key_type has to match _Container_Type::key_type!");
73 static_assert(std::is_same<rkey_type, typename _RTree::key_type>::value,
74 "OdTrVisBimap::rkey_type has to match _Reverse_Container_Type::key_type!");
81 inline size_t index_of_key(
const key_type& key)
const
83 const auto k_itr = m_key_tree.find(key);
84 const auto offset =
static_cast<unsigned>(std::distance(m_key_tree.begin(), k_itr));
89 const auto v_itr = m_value_tree.find(
value);
90 const auto offset =
static_cast<unsigned>(std::distance(m_value_tree.begin(), v_itr));
95 auto v_itr = m_value_tree.begin();
96 std::advance(v_itr,
index);
101 auto k_itr = m_key_tree.begin();
102 std::advance(k_itr,
index);
110 for (
const auto& elem : init)
115 const_iterator
begin()
const {
return const_iterator({ m_key_tree.begin(), m_value_tree.begin() }); }
116 const_iterator
end()
const {
return const_iterator({ m_key_tree.end(), m_value_tree.end() }); }
121 m_key_tree.emplace_hint(m_key_tree.begin(), std::move(node.first));
122 m_value_tree.emplace_hint(m_value_tree.begin(), std::move(node.second));
126 m_key_tree.emplace_hint(m_key_tree.begin(), std::move(node.first));
127 m_value_tree.emplace_hint(m_value_tree.begin(), std::move(node.second));
131 m_key_tree.emplace_hint(m_key_tree.begin(), std::move(key));
132 m_value_tree.emplace_hint(m_value_tree.begin(), std::move(
value));
136 const auto k_itr = m_key_tree.find(key);
137 const auto offset = std::distance(m_key_tree.begin(), k_itr);
138 auto v_itr = m_value_tree.begin();
139 std::advance(v_itr,
offset);
140 m_key_tree.erase(k_itr);
141 m_value_tree.erase(v_itr);
145 const auto v_itr = m_value_tree.find(
value);
146 const auto offset = std::distance(m_value_tree.begin(), v_itr);
147 auto k_itr = m_key_tree.begin();
148 std::advance(k_itr,
offset);
149 m_key_tree.erase(k_itr);
150 m_value_tree.erase(v_itr);
156 return m_key_tree.find(key) != m_key_tree.end();
160 return m_value_tree.find(
value) != m_value_tree.end();
164 const auto offset = index_of_key(key);
165 auto v_itr = m_value_tree.begin();
166 std::advance(v_itr,
offset);
172 auto k_itr = m_key_tree.begin();
173 std::advance(k_itr,
offset);
178 return m_key_tree.size();