diff --git a/VTIL-Common/util/numeric_iterator.hpp b/VTIL-Common/util/numeric_iterator.hpp index 3f0ece6..f0ab4cd 100644 --- a/VTIL-Common/util/numeric_iterator.hpp +++ b/VTIL-Common/util/numeric_iterator.hpp @@ -55,34 +55,36 @@ namespace vtil // Default constructor. // - iterator( value_type at, value_type limit = 0 ) : + constexpr iterator( value_type at, value_type limit = 0 ) : at( at ), limit( limit ) {} // Support bidirectional iteration. // - iterator& operator++() { at++; return *this; } - iterator& operator--() { at--; return *this; } + constexpr iterator& operator++() { at++; return *this; } + constexpr iterator& operator--() { at--; return *this; } + constexpr iterator operator++( int ) { auto s = *this; operator--(); return s; } + constexpr iterator operator--( int ) { auto s = *this; operator++(); return s; } // Equality check against another iterator. // - bool operator==( const iterator& other ) const + constexpr bool operator==( const iterator& other ) const { return at == other.at && limit == other.limit; } - bool operator!=( const iterator& other ) const + constexpr bool operator!=( const iterator& other ) const { return at != other.at || limit != other.limit; } // Equality check against special end iterator. // - bool operator==( iterator_end_tag_t ) const { return at == limit; } - bool operator!=( iterator_end_tag_t ) const { return at != limit; } + constexpr bool operator==( iterator_end_tag_t ) const { return at == limit; } + constexpr bool operator!=( iterator_end_tag_t ) const { return at != limit; } // Redirect dereferencing to container. // - value_type operator*() { return at; } - value_type operator*() const { return at; } + constexpr value_type operator*() { return at; } + constexpr value_type operator*() const { return at; } }; using const_iterator = iterator; diff --git a/VTIL-Common/util/range.hpp b/VTIL-Common/util/range.hpp index cb79290..c09cb14 100644 --- a/VTIL-Common/util/range.hpp +++ b/VTIL-Common/util/range.hpp @@ -47,27 +47,35 @@ namespace vtil { // Declare proxying iterator. // - struct iterator : base_iterator + struct iterator { // Modify certain traits. // - using reference = decltype( std::declval()( std::declval() ) ); + using reference = decltype( std::declval()( *std::declval() ) ); using value_type = typename std::remove_reference_t; // Constructed by the original iterator and a reference to transformation function. // const F& transform; - constexpr iterator( base_iterator&& i, const F& transform ) : base_iterator( std::move( i ) ), transform( transform ) {} - constexpr iterator( const base_iterator& i, const F& transform ) : base_iterator( i ), transform( transform ) {} + base_iterator at; + constexpr iterator( base_iterator&& i, const F& transform ) : at( std::move( i ) ), transform( transform ) {} + constexpr iterator( const base_iterator& i, const F& transform ) : at( i ), transform( transform ) {} + + // Support bidirectional iteration. + // + constexpr iterator& operator++() { at++; return *this; } + constexpr iterator& operator--() { at--; return *this; } + constexpr iterator operator++( int ) { auto s = *this; operator--(); return s; } + constexpr iterator operator--( int ) { auto s = *this; operator++(); return s; } + + // Equality check against another iterator. + // + constexpr bool operator==( const iterator& other ) const { return at == other.at; } + constexpr bool operator!=( const iterator& other ) const { return at != other.at; } // Override accessor to apply transformation where relevant. // - reference operator*() const { return transform( base_iterator::operator*() ); } - - // Inherit rest from operator base. - // - using base_iterator::operator==; - using base_iterator::operator!=; + constexpr reference operator*() const { return transform( base_iterator::operator*() ); } }; using const_iterator = iterator; @@ -83,9 +91,6 @@ namespace vtil constexpr iterator end() const { return { iend, transform }; } constexpr size_t size() const { return ( size_t ) std::distance( begin(), end() ); } }; - - template - range_proxy( F, I, I )->range_proxy; }; template diff --git a/VTIL-Common/util/type_helpers.hpp b/VTIL-Common/util/type_helpers.hpp index 4a04aba..bb4b5a1 100644 --- a/VTIL-Common/util/type_helpers.hpp +++ b/VTIL-Common/util/type_helpers.hpp @@ -118,6 +118,8 @@ namespace vtil template concept Integral = std::is_integral_v; template + concept FloatingPoint = std::is_floating_point_v; + template concept Trivial = std::is_trivial_v; template concept Enum = std::is_enum_v;