diff --git a/src/variant.cpp b/src/variant.cpp index cd6c5b5527fb..5521a737fdc8 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -164,6 +164,33 @@ variant_iterator variant_iterator::operator++(int) return iter; } +variant_iterator& variant_iterator::operator--() +{ + if (type_ == TYPE_LIST) + { + --list_iterator_; + } else if (type_ == TYPE_MAP) + { + --map_iterator_; + } + + return *this; +} + +variant_iterator variant_iterator::operator--(int) +{ + variant_iterator iter(*this); + if (type_ == TYPE_LIST) + { + --list_iterator_; + } else if (type_ == TYPE_MAP) + { + --map_iterator_; + } + + return iter; +} + variant_iterator& variant_iterator::operator=(const variant_iterator& that) { if (this == &that) diff --git a/src/variant.hpp b/src/variant.hpp index 1720bff44bce..19e19c2dd9bd 100644 --- a/src/variant.hpp +++ b/src/variant.hpp @@ -181,6 +181,12 @@ class variant { */ class variant_iterator { public: + typedef variant value_type; + typedef std::bidirectional_iterator_tag iterator_category; + typedef variant& reference; + typedef variant* pointer; + typedef int difference_type; + /** * Constructor for a TYPE_NULL variant. */ @@ -209,6 +215,8 @@ class variant_iterator { variant operator*() const; variant_iterator& operator++(); variant_iterator operator++(int); + variant_iterator& operator--(); + variant_iterator operator--(int); variant_iterator& operator=(const variant_iterator& that); bool operator==(const variant_iterator& that) const; bool operator!=(const variant_iterator& that) const;