diff options
-rw-r--r-- | src/events_ds.cc | 14 | ||||
-rw-r--r-- | src/events_ds.h | 30 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/events_ds.cc b/src/events_ds.cc index 097ddc1..3e1573f 100644 --- a/src/events_ds.cc +++ b/src/events_ds.cc @@ -56,6 +56,20 @@ void EventsDS::remove(EventID event_id) id_to_info.remove(event_id); } +Event* EventsDS::get(EventID event_id) +{ + auto const& info = id_to_info.get(event_id); + + // add new event types here + switch (info.type) + { + case Event::Type::SampleEvent: + return &getSample<SampleEvent>(info); + default: + assert(false); + } +} + std::size_t EventsDS::numberOfEvents(channel_t ch) const { auto& channel_data = channel_data_array[ch]; diff --git a/src/events_ds.h b/src/events_ds.h index dd13ec0..2e8fa43 100644 --- a/src/events_ds.h +++ b/src/events_ds.h @@ -67,6 +67,15 @@ public: //! Removes the event with id being event_id. void remove(EventID event_id); + //! Returns a reference to the element with id begin event_id. Note that to + //! get an event with this function, one has to know its type! + template <typename T> + T& get(EventID event_id); + + //! Returns a pointer to the event with id begin event_id. As Event has a + //! member variable that carries the type, it can be then casted appropriately. + Event* get(EventID event_id); + //! Returns the number of all events of a certain channel. std::size_t numberOfEvents(channel_t ch) const; @@ -129,6 +138,9 @@ private: InstrumentID current_groups_instrument_id; void removeGroup(EventGroupID group_id, InstrumentID instrument_id = InstrumentID()); + + template <typename T> + T& getSample(EventInfo const& info); }; template <typename T, typename... Args> @@ -157,6 +169,12 @@ T& EventsDS::emplace(channel_t ch, Args&&... args) } template <typename T> +T& EventsDS::get(EventID event_id) +{ + return getSample<T>(id_to_info.get(event_id)); +} + +template <typename T> ContainerRange<std::vector<T>> EventsDS::iterateOver(channel_t ch) { // add new event types here @@ -168,3 +186,15 @@ ContainerRange<std::vector<T>> EventsDS::iterateOver(channel_t ch) return ContainerRange<std::vector<T>>(sample_events.begin(), sample_events.end()); } } + +template <typename T> +T& EventsDS::getSample(EventInfo const& info) +{ + // add new event types here + static_assert(std::is_same<T, SampleEvent>::value); + + if (std::is_same<T, SampleEvent>::value) + { + return channel_data_array[info.ch].sample_events[info.channel_event_index]; + } +} |