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

This commit is contained in:
Michele Caini
2022-03-11 16:03:20 +01:00
parent 3846fa3f28
commit 900d2bf816

View File

@@ -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. */