diff options
author | Max Kellermann <max@duempel.org> | 2014-07-12 17:22:39 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-07-12 17:22:39 +0200 |
commit | 41a7203c28d2cc7550f1bb05f767950d388326cd (patch) | |
tree | 0b0970bbaf06b66ec0c0b3a50d90b3f6ef65dd20 /src/tag/Tag.hxx | |
parent | 543a58bb874be8a510d54e91a37797b0c71b1160 (diff) | |
download | mpd-41a7203c28d2cc7550f1bb05f767950d388326cd.tar.gz mpd-41a7203c28d2cc7550f1bb05f767950d388326cd.tar.xz mpd-41a7203c28d2cc7550f1bb05f767950d388326cd.zip |
Tag: add class const_iterator and methods begin(), end()
Enables using range-based "for".
Diffstat (limited to '')
-rw-r--r-- | src/tag/Tag.hxx | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/tag/Tag.hxx b/src/tag/Tag.hxx index 5d3aaad0c..74221417f 100644 --- a/src/tag/Tag.hxx +++ b/src/tag/Tag.hxx @@ -25,6 +25,7 @@ #include "Compiler.h" #include <algorithm> +#include <iterator> #include <stddef.h> @@ -136,6 +137,59 @@ struct Tag { */ gcc_pure bool HasType(TagType type) const; + + class const_iterator { + friend struct Tag; + const TagItem *const*cursor; + + constexpr const_iterator(const TagItem *const*_cursor) + :cursor(_cursor) {} + + public: + constexpr const TagItem &operator*() const { + return **cursor; + } + + constexpr const TagItem *operator->() const { + return *cursor; + } + + const_iterator &operator++() { + ++cursor; + return *this; + } + + const_iterator operator++(int) { + auto result = cursor++; + return const_iterator{result}; + } + + const_iterator &operator--() { + --cursor; + return *this; + } + + const_iterator operator--(int) { + auto result = cursor--; + return const_iterator{result}; + } + + constexpr bool operator==(const_iterator other) const { + return cursor == other.cursor; + } + + constexpr bool operator!=(const_iterator other) const { + return cursor != other.cursor; + } + }; + + const_iterator begin() const { + return const_iterator{items}; + } + + const_iterator end() const { + return const_iterator{items + num_items}; + } }; /** |