From aad3d78d3ec7e4916028059cb7b0023eedbaa095 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Wed, 28 Aug 2013 00:40:01 +0200 Subject: added "similar"-comparison to Event(Base) --- muse2/muse/event.cpp | 4 ++++ muse2/muse/event.h | 3 +++ muse2/muse/eventbase.h | 2 ++ muse2/muse/eventlist.cpp | 23 +++++++++++++++++++++++ muse2/muse/midievent.cpp | 15 +++++++++++++++ muse2/muse/midievent.h | 2 ++ muse2/muse/waveevent.cpp | 9 +++++++++ muse2/muse/waveevent.h | 2 ++ 8 files changed, 60 insertions(+) diff --git a/muse2/muse/event.cpp b/muse2/muse/event.cpp index 065a49cf..32b72277 100644 --- a/muse2/muse/event.cpp +++ b/muse2/muse/event.cpp @@ -179,6 +179,10 @@ Event& Event::operator=(const Event& e) { bool Event::operator==(const Event& e) const { return ev == e.ev; } +bool Event::isSimilarTo(const Event& other) const +{ + return ev->isSimilarTo(*other.ev); +} int Event::getRefCount() const { return ev->getRefCount(); } bool Event::selected() const { return ev->_selected; } diff --git a/muse2/muse/event.h b/muse2/muse/event.h index e512e03d..b2f5a50a 100644 --- a/muse2/muse/event.h +++ b/muse2/muse/event.h @@ -64,6 +64,7 @@ class Event { void setType(EventType t); Event& operator=(const Event& e); bool operator==(const Event& e) const; + bool isSimilarTo(const Event& other) const; int getRefCount() const; bool selected() const; @@ -137,6 +138,8 @@ class EventList : public EL { public: ciEvent find(const Event&) const; iEvent find(const Event&); + ciEvent findSimilar(const Event&) const; + iEvent findSimilar(const Event&); iEvent add(Event event); void move(Event& event, unsigned tick); void dump() const; diff --git a/muse2/muse/eventbase.h b/muse2/muse/eventbase.h index adf7da97..92e91761 100644 --- a/muse2/muse/eventbase.h +++ b/muse2/muse/eventbase.h @@ -56,6 +56,8 @@ class EventBase : public PosLen { void setSelected(bool val) { _selected = val; } void move(int offset); + + virtual bool isSimilarTo(const EventBase& other) const = 0; virtual void read(Xml&) = 0; virtual void write(int, Xml&, const Pos& offset, bool forcePath = false) const = 0; diff --git a/muse2/muse/eventlist.cpp b/muse2/muse/eventlist.cpp index ecc7f452..80180ab7 100644 --- a/muse2/muse/eventlist.cpp +++ b/muse2/muse/eventlist.cpp @@ -151,6 +151,29 @@ ciEvent EventList::find(const Event& event) const return end(); } +iEvent EventList::findSimilar(const Event& event) +{ + std::pair range = equal_range(event.type() == Wave ? event.frame() : event.tick()); + + for (iEvent i = range.first; i != range.second; ++i) { + if (i->second.isSimilarTo(event)) + return i; + } + return end(); +} + +ciEvent EventList::findSimilar(const Event& event) const + { + EventRange range = equal_range(event.type() == Wave ? event.frame() : event.tick()); + + + for (ciEvent i = range.first; i != range.second; ++i) { + if (i->second.isSimilarTo(event)) + return i; + } + return end(); + } + //--------------------------------------------------------- // dump //--------------------------------------------------------- diff --git a/muse2/muse/midievent.cpp b/muse2/muse/midievent.cpp index 5330b518..fb6517cd 100644 --- a/muse2/muse/midievent.cpp +++ b/muse2/muse/midievent.cpp @@ -41,6 +41,21 @@ MidiEventBase::MidiEventBase(EventType t) c = 0; } +bool MidiEventBase::isSimilarTo(const EventBase& other_) const +{ + const MidiEventBase* other = dynamic_cast(&other_); + if (other==NULL) // dynamic cast hsa failed: "other_" is not of type MidiEventBase. + return false; + + if ((a==other->a && b==other->b && c==other->c && edata.dataLen==other->edata.dataLen && this->PosLen::operator==(*other)) == false) + return false; + + if (edata.dataLen > 0) + return (memcmp(edata.data, other->edata.data, edata.dataLen) == 0); + else + return true; // no data equals no data. +} + //--------------------------------------------------------- // MidiEventBase::mid //--------------------------------------------------------- diff --git a/muse2/muse/midievent.h b/muse2/muse/midievent.h index 8aa38f0e..dba2d727 100644 --- a/muse2/muse/midievent.h +++ b/muse2/muse/midievent.h @@ -41,6 +41,8 @@ class MidiEventBase : public EventBase { public: MidiEventBase(EventType t); virtual ~MidiEventBase() {} + + virtual bool isSimilarTo(const EventBase& other) const; virtual bool isNote() const { return type() == Note; } virtual bool isNoteOff() const; diff --git a/muse2/muse/waveevent.cpp b/muse2/muse/waveevent.cpp index 842e40b9..24be2d01 100644 --- a/muse2/muse/waveevent.cpp +++ b/muse2/muse/waveevent.cpp @@ -58,6 +58,15 @@ EventBase* WaveEventBase::clone() const return new WaveEventBase(*this); } +bool WaveEventBase::isSimilarTo(const EventBase& other_) const +{ + const WaveEventBase* other = dynamic_cast(&other_); + if (other==NULL) // dynamic cast hsa failed: "other_" is not of type WaveEventBase. + return false; + + return f.dirPath()==other->f.dirPath() && _spos==other->_spos && this->PosLen::operator==(*other); +} + //--------------------------------------------------------- // WaveEvent::mid //--------------------------------------------------------- diff --git a/muse2/muse/waveevent.h b/muse2/muse/waveevent.h index 4174e3f5..d11803c7 100644 --- a/muse2/muse/waveevent.h +++ b/muse2/muse/waveevent.h @@ -49,6 +49,8 @@ class WaveEventBase : public EventBase { public: WaveEventBase(EventType t); virtual ~WaveEventBase() {} + + virtual bool isSimilarTo(const EventBase& other) const; virtual void read(Xml&); virtual void write(int, Xml&, const Pos& offset, bool forcePath = false) const; -- cgit v1.2.1