// // PCMPatchedTrack.hpp // Clock Signal // // Created by Thomas Harte on 15/12/2016. // Copyright © 2016 Thomas Harte. All rights reserved. // #ifndef PCMPatchedTrack_hpp #define PCMPatchedTrack_hpp #include "PCMTrack.hpp" #include "PCMSegment.hpp" namespace Storage { namespace Disk { /*! A subclass of @c Track that patches an existing track with PCM segments. */ class PCMPatchedTrack: public Track { public: /*! Constructs a @c PCMPatchedTrack that will return events from @c underlying_track in regions where it has not had alternative PCM data installed. */ PCMPatchedTrack(std::shared_ptr underlying_track); /*! Replaces whatever is currently on the track from @c start_position to @c start_position + segment length with the contents of @c segment. */ void add_segment(const Time &start_time, const PCMSegment &segment); // To satisfy Storage::Disk::Track Event get_next_event(); Time seek_to(const Time &time_since_index_hole); private: std::shared_ptr underlying_track_; std::vector event_sources_; struct Period { Time start_time, end_time; Time segment_start_time; PCMSegmentEventSource *event_source; // nullptr => use the underlying track Period(const Time &start_time, const Time &end_time, const Time &segment_start_time, PCMSegmentEventSource *event_source) : start_time(start_time), end_time(end_time), segment_start_time(segment_start_time), event_source(event_source) {} }; std::vector periods_; Period *active_period_; void insert_period(const Period &period); }; } } #endif /* PCMPatchedTrack_hpp */