#pragma once #if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II) #include #include "dxxsconf.h" #include "object.h" #include "segment.h" namespace detail { template struct unspecified_pointer_t; }; template class segment_object_iterator_t : public std::iterator, T>, T { using T::m_ptr; using T::m_idx; public: segment_object_iterator_t(T o) : T(o) { } T operator *() { return *static_cast(this); } segment_object_iterator_t &operator++() { const auto ni = m_ptr->next; m_ptr = (ni == object_none) ? nullptr : m_ptr + (static_cast(ni) - static_cast(m_idx)); m_idx = ni; return *this; } bool operator==(const segment_object_iterator_t &rhs) const { return m_idx == rhs.m_idx; } bool operator!=(const segment_object_iterator_t &rhs) const { return !(*this == rhs); } }; template struct segment_object_range_t { segment_object_iterator_t b; segment_object_range_t(T o) : b(o) { } segment_object_iterator_t begin() const { return b; } segment_object_iterator_t end() const { return T(object_none); } }; __attribute_warn_unused_result static inline segment_object_range_t objects_in(segment &s) { return s.objects == object_none ? objptridx_t(object_none) : objptridx_t(s.objects); } __attribute_warn_unused_result static inline segment_object_range_t objects_in(const segment &s) { return s.objects == object_none ? cobjptridx_t(object_none) : cobjptridx_t(s.objects); } #endif