10 #ifndef smtk_markup_IndirectAssignedIds_h
11 #define smtk_markup_IndirectAssignedIds_h
13 #include "smtk/markup/AssignedIds.h"
14 #include "smtk/markup/IdType.h"
18 #include "vtkIdTypeArray.h"
19 #include "vtkSmartPointer.h"
39 template<
typename... Args>
41 const std::shared_ptr<IdSpace>& space,
47 :
AssignedIds(space, nature, begin, end, owningNode)
53 using AssignedIds::AssignedIdCtor;
57 AssignedIdCtor cloneFunctor()
const override;
60 void setIdArray(vtkSmartPointer<vtkIdTypeArray> idArray);
61 vtkSmartPointer<vtkIdTypeArray> idArray()
const {
return m_idArray; }
74 template<Forwardness IsForward>
78 using reference_type =
IdType&;
79 using index_type = vtkIdType;
81 static constexpr
IdType Invalid = ~0ull;
91 auto parent = m_parent.lock();
92 if (!parent || m_value == Invalid)
97 (IsForward == Forward ? this->advance(m_value, parent) : this->retreat(m_value, parent));
103 if (m_value == Invalid)
107 auto parent = m_parent.lock();
113 (IsForward == Forward ? this->advance(m_value, parent) : this->retreat(m_value, parent));
120 auto parent = m_parent.lock();
121 if (!parent || m_value == Invalid)
126 (IsForward == Forward ? this->retreat(m_value, parent) : this->advance(m_value, parent));
132 if (m_value == Invalid)
136 auto parent = m_parent.lock();
142 (IsForward == Forward ? this->retreat(m_value, parent) : this->advance(m_value, parent));
146 Iterator& operator+=(std::size_t count)
148 if (m_value == Invalid)
152 auto parent = m_parent.lock();
158 (IsForward == Forward ? this->advance(m_value, parent, count)
159 : this->retreat(m_value, parent, count));
163 Iterator& operator-=(std::size_t count)
165 if (m_value == Invalid)
169 auto parent = m_parent.lock();
175 (IsForward == Forward ? this->retreat(m_value, parent, count)
176 : this->advance(m_value, parent, count));
194 const value_type& operator*()
const {
return m_value; }
196 const value_type& operator->()
const {
return m_value; }
208 auto parent = m_parent.lock();
209 if (!parent || m_value == Invalid)
213 return parent->firstIndexFor(m_value);
216 bool operator==(
const Iterator& other)
const
219 return m_value == other.m_value;
221 bool operator!=(
const Iterator& other)
const
224 return m_value != other.m_value;
228 friend class IndirectAssignedIds;
229 Iterator(
IdType value, std::shared_ptr<const IndirectAssignedIds> parent)
237 const std::shared_ptr<const IndirectAssignedIds>& parent,
238 std::size_t count = 1)
const
240 value_type result = current;
243 auto it = parent->m_idToIndex.upper_bound(result);
244 if (it == parent->m_idToIndex.end())
256 const std::shared_ptr<const IndirectAssignedIds>& parent,
257 std::size_t count = 1)
const
259 value_type result = current;
262 auto it = parent->m_idToIndex.lower_bound(result);
263 if (it == parent->m_idToIndex.end() || it == parent->m_idToIndex.begin())
276 std::weak_ptr<const IndirectAssignedIds> m_parent;
288 Iterator<Forward> begin()
const;
290 Iterator<Forward> end()
const;
293 Iterator<Reverse> rbegin()
const;
295 Iterator<Reverse> rend()
const;
306 template<
typename Functor>
311 for (
const auto&
id : *
this)
322 vtkIdType firstIndexFor(
IdType value)
const;
325 vtkSmartPointer<vtkIdTypeArray> m_idArray;
326 std::multimap<IdType, vtkIdType> m_idToIndex;
332 #endif // smtk_markup_IndirectAssignedIds_h