10 #ifndef smtk_markup_SequentialAssignedIds_h
11 #define smtk_markup_SequentialAssignedIds_h
13 #include "smtk/markup/AssignedIds.h"
14 #include "smtk/markup/IdType.h"
34 template<
typename... Args>
36 const std::shared_ptr<IdSpace>& space,
42 :
AssignedIds(space, nature, begin, end, owningNode)
48 using AssignedIds::AssignedIdCtor;
52 AssignedIdCtor cloneFunctor()
const override;
57 template<Forwardness IsForward>
61 using reference_type =
IdType&;
63 static constexpr
IdType Invalid = ~0ull;
73 if (m_value == Invalid)
78 (IsForward == Forwardness::Forward && m_value == m_range[1] - 1) ||
79 (IsForward == Forwardness::Reverse && m_value == m_range[0]))
85 m_value += (IsForward == Forwardness::Forward ? 1 : -1);
92 if (m_value == Invalid)
97 (IsForward == Forwardness::Forward && m_value == m_range[1] - 1) ||
98 (IsForward == Forwardness::Reverse && m_value == m_range[0]))
104 m_value += (IsForward == Forwardness::Forward ? 1 : -1);
112 if (m_value == Invalid)
117 (IsForward == Forwardness::Forward && m_value == m_range[0]) ||
118 (IsForward == Forwardness::Reverse && m_value == m_range[1] - 1))
124 m_value -= (IsForward == Forwardness::Forward ? 1 : -1);
131 if (m_value == Invalid)
136 (IsForward == Forwardness::Forward && m_value == m_range[0]) ||
137 (IsForward == Forwardness::Reverse && m_value == m_range[1] - 1))
143 m_value -= (IsForward == Forwardness::Forward ? 1 : -1);
148 Iterator& operator+=(std::size_t count)
150 if (m_value == Invalid)
155 (IsForward == Forwardness::Forward && m_value + count >= m_range[1]) ||
156 (IsForward == Forwardness::Reverse && m_value < m_range[0] + count))
165 #pragma warning(push)
166 #pragma warning(disable : 4146)
168 m_value += (IsForward == Forwardness::Forward ? count : -count);
176 Iterator& operator-=(std::size_t count)
178 if (m_value == Invalid)
183 (IsForward == Forwardness::Forward && m_value < m_range[0] + count) ||
184 (IsForward == Forwardness::Reverse && m_value + count >= m_range[1]))
193 #pragma warning(push)
194 #pragma warning(disable : 4146)
196 m_value -= (IsForward == Forwardness::Forward ? count : -count);
218 const value_type& operator*()
const {
return m_value; }
220 const value_type& operator->()
const {
return m_value; }
232 if (m_value == Invalid)
236 return m_value - m_range[0];
239 bool operator==(
const Iterator& other)
const
242 return m_value == other.m_value;
244 bool operator!=(
const Iterator& other)
const
247 return m_value != other.m_value;
251 friend class SequentialAssignedIds;
252 Iterator(
IdType value,
const IdRange& range)
263 IdRange range()
const;
273 Iterator<Forward> begin()
const;
275 Iterator<Forward> end()
const;
278 Iterator<Reverse> rbegin()
const;
280 Iterator<Reverse> rend()
const;
286 template<
typename Functor>
291 for (
const auto&
id : *
this)
306 #endif // smtk_markup_SequentialAssignedIds_h