summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/port_set.h52
1 files changed, 20 insertions, 32 deletions
diff --git a/libs/ardour/ardour/port_set.h b/libs/ardour/ardour/port_set.h
index 106f2872d1..199c650f2b 100644
--- a/libs/ardour/ardour/port_set.h
+++ b/libs/ardour/ardour/port_set.h
@@ -66,28 +66,29 @@ public:
bool empty() const { return (_count.n_total() == 0); }
- // ITERATORS
- // FIXME: possible to combine these? templates?
-
- class iterator {
+ template<typename PS, typename P>
+ class iterator_base {
public:
- Port& operator*() { return *_set.port(_type, _index); }
- Port* operator->() { return _set.port(_type, _index); }
- iterator& operator++() { ++_index; return *this; } // yes, prefix only
- bool operator==(const iterator& other) { return (_index == other._index); }
- bool operator!=(const iterator& other) { return (_index != other._index); }
+ P& operator*() { return *_set.port(_type, _index); }
+ P* operator->() { return _set.port(_type, _index); }
+ iterator_base<PS,P>& operator++() { ++_index; return *this; } // yes, prefix only
+ bool operator==(const iterator_base<PS,P>& other) { return (_index == other._index); }
+ bool operator!=(const iterator_base<PS,P>& other) { return (_index != other._index); }
private:
friend class PortSet;
- iterator(PortSet& list, DataType type, size_t index)
+ iterator_base<PS,P>(PS& list, DataType type, size_t index)
: _set(list), _type(type), _index(index) {}
- PortSet& _set;
+ PS& _set;
DataType _type; ///< Ignored if NIL (to iterator over entire set)
size_t _index;
};
+ typedef iterator_base<PortSet, Port> iterator;
+ typedef iterator_base<const PortSet, const Port> const_iterator;
+
iterator begin(DataType type = DataType::NIL) {
return iterator(*this, type, 0);
}
@@ -97,32 +98,19 @@ public:
(type == DataType::NIL) ? _count.n_total() : _count.get(type));
}
+ const_iterator begin(DataType type = DataType::NIL) const {
+ return const_iterator(*this, type, 0);
+ }
- class const_iterator {
- public:
- const Port& operator*() { return *_set.port(_index); }
- const Port* operator->() { return _set.port(_index); }
- const_iterator& operator++() { ++_index; return *this; } // yes, prefix only
- bool operator==(const const_iterator& other) { return (_index == other._index); }
- bool operator!=(const const_iterator& other) { return (_index != other._index); }
-
- private:
- friend class PortSet;
-
- const_iterator(const PortSet& list, size_t index) : _set(list), _index(index) {}
-
- const PortSet& _set;
- size_t _index;
- };
-
- const_iterator begin() const { return const_iterator(*this, 0); }
- const_iterator end() const { return const_iterator(*this, _count.n_total()); }
-
+ const_iterator end(DataType type = DataType::NIL) const {
+ return const_iterator(*this, type,
+ (type == DataType::NIL) ? _count.n_total() : _count.get(type));
+ }
class audio_iterator {
public:
AudioPort& operator*() { return *_set.nth_audio_port(_index); }
- AudioPort* operator->() { return _set.nth_audio_port(_index); }
+ AudioPort* operator->() { return _set.nth_audio_port(_index); }
audio_iterator& operator++() { ++_index; return *this; } // yes, prefix only
bool operator==(const audio_iterator& other) { return (_index == other._index); }
bool operator!=(const audio_iterator& other) { return (_index != other._index); }