Browse Source

meta: prepare meta_sequence_container::meta_iterator to model a bidirectional iterator

Michele Caini 4 years ago
parent
commit
900d2bf816
1 changed files with 6 additions and 5 deletions
  1. 6 5
      src/entt/meta/meta.hpp

+ 6 - 5
src/entt/meta/meta.hpp

@@ -1445,16 +1445,16 @@ class meta_sequence_container::meta_iterator final {
         deref
     };
 
-    using vtable_type = void(const operation, const any &, void *);
+    using vtable_type = void(const operation, const any &, const void *);
 
     template<typename It>
-    static void basic_vtable(const operation op, const any &value, void *other) {
+    static void basic_vtable(const operation op, const any &value, const void *other) {
         switch(op) {
         case operation::incr:
-            ++any_cast<It &>(const_cast<any &>(value));
+            any_cast<It &>(const_cast<any &>(value)) += *static_cast<const std::ptrdiff_t *>(other);
             break;
         case operation::deref:
-            static_cast<meta_any *>(other)->emplace<typename std::iterator_traits<It>::reference>(*any_cast<const It &>(value));
+            static_cast<meta_any *>(const_cast<void *>(other))->emplace<typename std::iterator_traits<It>::reference>(*any_cast<const It &>(value));
             break;
         }
     }
@@ -1486,7 +1486,8 @@ public:
 
     /*! @brief Pre-increment operator. @return This iterator. */
     meta_iterator &operator++() ENTT_NOEXCEPT {
-        return vtable(operation::incr, handle, nullptr), *this;
+        const std::ptrdiff_t diff{1};
+        return vtable(operation::incr, handle, &diff), *this;
     }
 
     /*! @brief Post-increment operator. @return This iterator. */