X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fport_set.cc;h=c7f5e2e674e7557cc1ca7eb3ce33a38dc0ce6a3e;hb=944c32346b3c6bb87fccb22f159bdd9297bae50d;hp=44a5f436a98742e0ea92bff03f096173a3486f3b;hpb=862972eaaa2232c399bb819eb1092379689d747e;p=ardour.git diff --git a/libs/ardour/port_set.cc b/libs/ardour/port_set.cc index 44a5f436a9..c7f5e2e674 100644 --- a/libs/ardour/port_set.cc +++ b/libs/ardour/port_set.cc @@ -18,9 +18,10 @@ #include -#include "ardour/port_set.h" -#include "ardour/midi_port.h" #include "ardour/audio_port.h" +#include "ardour/midi_port.h" +#include "ardour/port.h" +#include "ardour/port_set.h" using std::string; @@ -32,7 +33,7 @@ PortSet::PortSet() _ports.push_back( PortVec() ); } -static bool sort_ports_by_name (Port* a, Port* b) +static bool sort_ports_by_name (boost::shared_ptr a, boost::shared_ptr b) { string aname (a->name()); string bname (b->name()); @@ -55,7 +56,7 @@ static bool sort_ports_by_name (Port* a, Port* b) // if some of the names don't have a number as posfix, compare as strings - if (last_digit_position_a == aname.size() or last_digit_position_b == bname.size()) { + if (last_digit_position_a == aname.size() || last_digit_position_b == bname.size()) { return aname < bname; } @@ -71,21 +72,39 @@ static bool sort_ports_by_name (Port* a, Port* b) } } + +static bool sort_ports_by_type_and_name (boost::shared_ptr a, boost::shared_ptr b) +{ + if (a->type() != b->type()) { + return a->type() < b->type(); + } + + return sort_ports_by_name (a, b); +} + void -PortSet::add(Port* port) +PortSet::add (boost::shared_ptr port) { PortVec& v = _ports[port->type()]; v.push_back(port); + _all_ports.push_back(port); sort(v.begin(), v.end(), sort_ports_by_name); + sort(_all_ports.begin(), _all_ports.end(), sort_ports_by_type_and_name); + _count.set(port->type(), _count.get(port->type()) + 1); assert(_count.get(port->type()) == _ports[port->type()].size()); } bool -PortSet::remove(Port* port) +PortSet::remove (boost::shared_ptr port) { + PortVec::iterator i = find(_all_ports.begin(), _all_ports.end(), port); + if (i != _all_ports.end()) { + _all_ports.erase(i); + } + for (std::vector::iterator l = _ports.begin(); l != _ports.end(); ++l) { PortVec::iterator i = find(l->begin(), l->end(), port); if (i != l->end()) { @@ -103,42 +122,23 @@ PortSet::remove(Port* port) size_t PortSet::num_ports() const { - size_t ret = 0; - - for (std::vector::const_iterator l = _ports.begin(); l != _ports.end(); ++l) - ret += (*l).size(); - - return ret; + return _all_ports.size(); } bool -PortSet::contains(const Port* port) const +PortSet::contains (boost::shared_ptr port) const { - for (std::vector::const_iterator l = _ports.begin(); l != _ports.end(); ++l) - if (find((*l).begin(), (*l).end(), port) != (*l).end()) - return true; - - return false; + return find(_all_ports.begin(), _all_ports.end(), port) != _all_ports.end(); } -Port* +boost::shared_ptr PortSet::port(size_t n) const { - // This is awesome. Awesomely slow. - - size_t size_so_far = 0; - - for (std::vector::const_iterator l = _ports.begin(); l != _ports.end(); ++l) { - if (n < size_so_far + (*l).size()) - return (*l)[n - size_so_far]; - else - size_so_far += (*l).size(); - } - - return NULL; // n out of range + assert(n < _all_ports.size()); + return _all_ports[n]; } -Port* +boost::shared_ptr PortSet::port(DataType type, size_t n) const { if (type == DataType::NIL) { @@ -150,16 +150,23 @@ PortSet::port(DataType type, size_t n) const } } -AudioPort* +boost::shared_ptr PortSet::nth_audio_port(size_t n) const { - return dynamic_cast(port(DataType::AUDIO, n)); + return boost::dynamic_pointer_cast (port (DataType::AUDIO, n)); } -MidiPort* +boost::shared_ptr PortSet::nth_midi_port(size_t n) const { - return dynamic_cast(port(DataType::MIDI, n)); + return boost::dynamic_pointer_cast (port (DataType::MIDI, n)); +} + +void +PortSet::clear() +{ + _ports.clear(); + _all_ports.clear(); } } // namepace ARDOUR