X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fport_set.h;h=199c650f2bb4a7fe2152911e0c06fbeb7a832c16;hb=90172686b92b53cc5ab1d60c0e6daecb65d17d3d;hp=d38aab2c4b15d2d6c4f3e46dd4dab8135af4d923;hpb=cbdf686e391bc2e7b93f37a5d3fa9197cb178078;p=ardour.git diff --git a/libs/ardour/ardour/port_set.h b/libs/ardour/ardour/port_set.h index d38aab2c4b..199c650f2b 100644 --- a/libs/ardour/ardour/port_set.h +++ b/libs/ardour/ardour/port_set.h @@ -1,16 +1,16 @@ /* - Copyright (C) 2006 Paul Davis - + Copyright (C) 2006 Paul Davis + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -20,13 +20,14 @@ #define __ardour_port_set_h__ #include -#include -#include -#include -#include +#include "ardour/chan_count.h" +#include namespace ARDOUR { +class Port; +class AudioPort; +class MidiPort; /** An ordered list of Ports, possibly of various types. * @@ -34,85 +35,82 @@ namespace ARDOUR { * the nth port of a given type. Note that port(n) and nth_audio_port(n) may * NOT return the same port. */ -class PortSet { +class PortSet : public boost::noncopyable { public: PortSet(); size_t num_ports() const; - size_t num_ports(DataType type) const { return _ports[type.to_index()].size(); } + size_t num_ports(DataType type) const { return _ports[type].size(); } - void add_port(Port* port); + void add(Port* port); + bool remove(Port* port); + /** nth port */ Port* port(size_t index) const; - Port* nth_port_of_type(DataType type, size_t n) const; + /** nth port of type @a t, or nth port if t = NIL */ + Port* port(DataType t, size_t index) const; AudioPort* nth_audio_port(size_t n) const; - + MidiPort* nth_midi_port(size_t n) const; bool contains(const Port* port) const; - + /** Remove all ports from the PortSet. Ports are not deregistered with * the engine, it's the caller's responsibility to not leak here! */ void clear() { _ports.clear(); } - const ChanCount& chan_count() const { return _chan_count; } + const ChanCount& count() const { return _count; } - bool empty() const { return (_chan_count.get_total() == 0); } + bool empty() const { return (_count.n_total() == 0); } - // ITERATORS - - // obviously these iterators will need to get more clever - // experimental phase, it's the interface that counts right now - - class iterator { + template + class iterator_base { public: - - Port* operator*() { return _list.port(_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& operator++() { ++_index; return *this; } // yes, prefix only + bool operator==(const iterator_base& other) { return (_index == other._index); } + bool operator!=(const iterator_base& other) { return (_index != other._index); } private: friend class PortSet; - iterator(PortSet& list, size_t index) : _list(list), _index(index) {} + iterator_base(PS& list, DataType type, size_t index) + : _set(list), _type(type), _index(index) {} - PortSet& _list; - size_t _index; + PS& _set; + DataType _type; ///< Ignored if NIL (to iterator over entire set) + size_t _index; }; - iterator begin() { return iterator(*this, 0); } - iterator end() { return iterator(*this, _chan_count.get_total()); } - - class const_iterator { - public: - - const Port* operator*() { return _list.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; + typedef iterator_base iterator; + typedef iterator_base const_iterator; - const_iterator(const PortSet& list, size_t index) : _list(list), _index(index) {} + iterator begin(DataType type = DataType::NIL) { + return iterator(*this, type, 0); + } - const PortSet& _list; - size_t _index; - }; + iterator end(DataType type = DataType::NIL) { + return iterator(*this, type, + (type == DataType::NIL) ? _count.n_total() : _count.get(type)); + } - const_iterator begin() const { return const_iterator(*this, 0); } - const_iterator end() const { return const_iterator(*this, _chan_count.get_total()); } + const_iterator begin(DataType type = DataType::NIL) const { + return const_iterator(*this, type, 0); + } - + 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 _list.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); } @@ -120,29 +118,22 @@ public: private: friend class PortSet; - audio_iterator(PortSet& list, size_t index) : _list(list), _index(index) {} + audio_iterator(PortSet& list, size_t index) : _set(list), _index(index) {} - PortSet& _list; - size_t _index; + PortSet& _set; + size_t _index; }; audio_iterator audio_begin() { return audio_iterator(*this, 0); } - audio_iterator audio_end() { return audio_iterator(*this, _chan_count.get(DataType::AUDIO)); } - - - - -private: - // Prevent copies (undefined) - PortSet(const PortSet& copy); - void operator=(const PortSet& other); + audio_iterator audio_end() { return audio_iterator(*this, _count.n_audio()); } +private: typedef std::vector PortVec; - + // Vector of vectors, indexed by DataType::to_index() std::vector _ports; - ChanCount _chan_count; + ChanCount _count; };