X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fport_set.cc;h=b96e45662b945da03a9e513ddb6a4e3e6c02ca81;hb=9e0d03020ff47773f7d1c0414de1c74e6c9e0dac;hp=31f06cb139d82864c9c687eb74888ecaaf8cbc39;hpb=cbdf686e391bc2e7b93f37a5d3fa9197cb178078;p=ardour.git diff --git a/libs/ardour/port_set.cc b/libs/ardour/port_set.cc index 31f06cb139..b96e45662b 100644 --- a/libs/ardour/port_set.cc +++ b/libs/ardour/port_set.cc @@ -1,22 +1,24 @@ /* - 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. */ -#include +#include "ardour/port_set.h" +#include "ardour/midi_port.h" +#include "ardour/audio_port.h" namespace ARDOUR { @@ -32,21 +34,32 @@ static bool sort_ports_by_name (Port* a, Port* b) } void -PortSet::add_port(Port* port) +PortSet::add(Port* port) { - const size_t list_index = port->type().to_index(); - assert(list_index < _ports.size()); - - PortVec& v = _ports[list_index]; - + PortVec& v = _ports[port->type()]; + v.push_back(port); sort(v.begin(), v.end(), sort_ports_by_name); - _chan_count.set(port->type(), _chan_count.get(port->type()) + 1); + _count.set(port->type(), _count.get(port->type()) + 1); - assert(_chan_count.get(port->type()) == _ports[port->type().to_index()].size()); + assert(_count.get(port->type()) == _ports[port->type()].size()); } +bool +PortSet::remove(Port* port) +{ + for (std::vector::iterator l = _ports.begin(); l != _ports.end(); ++l) { + PortVec::iterator i = find(l->begin(), l->end(), port); + if (i != l->end()) { + l->erase(i); + _count.set(port->type(), _count.get(port->type()) - 1); + return true; + } + } + + return false; +} /** Get the total number of ports (of all types) in the PortSet */ @@ -74,8 +87,8 @@ PortSet::contains(const Port* port) const Port* PortSet::port(size_t n) const { - // This is awesome - + // This is awesome. Awesomely slow. + size_t size_so_far = 0; for (std::vector::const_iterator l = _ports.begin(); l != _ports.end(); ++l) { @@ -89,23 +102,27 @@ PortSet::port(size_t n) const } Port* -PortSet::nth_port_of_type(DataType type, size_t n) const +PortSet::port(DataType type, size_t n) const { - const PortVec& v = _ports[type.to_index()]; - assert(n < v.size()); - return v[n]; + if (type == DataType::NIL) { + return port(n); + } else { + const PortVec& v = _ports[type]; + assert(n < v.size()); + return v[n]; + } } AudioPort* PortSet::nth_audio_port(size_t n) const { - return dynamic_cast(nth_port_of_type(DataType::AUDIO, n)); + return dynamic_cast(port(DataType::AUDIO, n)); } MidiPort* PortSet::nth_midi_port(size_t n) const { - return dynamic_cast(nth_port_of_type(DataType::MIDI, n)); + return dynamic_cast(port(DataType::MIDI, n)); } } // namepace ARDOUR