-
- template<typename B, typename E>
- struct iterator_base {
- iterator_base<B,E>(B& b, size_t o) : buffer(b), offset(o) {}
- inline E operator*() const {
- uint8_t* ev_start = buffer._data + offset + sizeof(TimeType);
- assert(Evoral::midi_event_size(*ev_start) >= 0);
- return E(EventTypeMap::instance().midi_event_type(*ev_start),
- *((TimeType*)(buffer._data + offset)),
- Evoral::midi_event_size(*ev_start) + 1, ev_start);
+
+ template<typename BufferType, typename EventType>
+ class iterator_base {
+ public:
+ iterator_base<BufferType, EventType>(BufferType& b, framecnt_t o)
+ : buffer(&b), offset(o) {}
+ iterator_base<BufferType, EventType>(const iterator_base<BufferType,EventType>& o)
+ : buffer (o.buffer), offset(o.offset) {}
+
+ inline iterator_base<BufferType,EventType> operator= (const iterator_base<BufferType,EventType>& o) {
+ if (&o != this) {
+ buffer = o.buffer;
+ offset = o.offset;
+ }
+ return *this;
+ }
+
+ inline EventType operator*() const {
+ uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType);
+ int event_size = Evoral::midi_event_size(ev_start);
+ assert(event_size >= 0);
+ return EventType(EventTypeMap::instance().midi_event_type(*ev_start),
+ *((TimeType*)(buffer->_data + offset)),
+ event_size, ev_start);
+ }
+ inline EventType operator*() {
+ uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType);
+ int event_size = Evoral::midi_event_size(ev_start);
+ assert(event_size >= 0);
+ return EventType(EventTypeMap::instance().midi_event_type(*ev_start),
+ *((TimeType*)(buffer->_data + offset)),
+ event_size, ev_start);