Tag: add class const_iterator and methods begin(), end()

Enables using range-based "for".
This commit is contained in:
Max Kellermann
2014-07-12 17:22:39 +02:00
parent 543a58bb87
commit 41a7203c28
13 changed files with 89 additions and 47 deletions

View File

@@ -30,10 +30,10 @@ CopyTagItem(TagBuilder &dest, TagType dest_type,
const Tag &src, TagType src_type)
{
bool found = false;
const unsigned n = src.num_items;
for (unsigned i = 0; i < n; ++i) {
if (src.items[i]->type == src_type) {
dest.AddItem(dest_type, src.items[i]->value);
for (const auto &item : src) {
if (item.type == src_type) {
dest.AddItem(dest_type, item.value);
found = true;
}
}
@@ -87,11 +87,10 @@ TagSet::CheckUnique(TagType dest_type,
uint32_t group_mask)
{
bool found = false;
for (unsigned i = 0; i < tag.num_items; ++i) {
if (tag.items[i]->type == src_type) {
InsertUnique(tag, dest_type,
tag.items[i]->value,
group_mask);
for (const auto &item : tag) {
if (item.type == src_type) {
InsertUnique(tag, dest_type, item.value, group_mask);
found = true;
}
}

View File

@@ -118,9 +118,9 @@ Tag::GetValue(TagType type) const
{
assert(type < TAG_NUM_OF_ITEM_TYPES);
for (unsigned i = 0; i < num_items; i++)
if (items[i]->type == type)
return items[i]->value;
for (const auto &item : *this)
if (item.type == type)
return item.value;
return nullptr;
}

View File

@@ -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};
}
};
/**