1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 23:52:26 +00:00

Ensured the patchable track owns its underlying track.

This commit is contained in:
Thomas Harte 2016-12-17 18:17:22 -05:00
parent 3017062e89
commit 313db75303
3 changed files with 24 additions and 10 deletions

View File

@ -13,27 +13,41 @@
@implementation PCMPatchedTrackTests
- (Storage::Disk::PCMTrack)togglingTrack
- (std::shared_ptr<Storage::Disk::Track>)togglingTrack
{
Storage::Disk::PCMSegment segment;
segment.data = { 0xff, 0xff, 0xff, 0xff };
segment.number_of_bits = 32;
return Storage::Disk::PCMTrack(segment);
return std::shared_ptr<Storage::Disk::Track>(new Storage::Disk::PCMTrack(segment));
}
- (void)testUnpatchedTrack
- (std::shared_ptr<Storage::Disk::Track>)patchableTogglingTrack
{
Storage::Disk::PCMTrack track = self.togglingTrack;
std::shared_ptr<Storage::Disk::Track> track = self.togglingTrack;
return std::shared_ptr<Storage::Disk::Track>(new Storage::Disk::PCMPatchedTrack(track));
}
- (void)assertOneThirtyTwosForTrack:(std::shared_ptr<Storage::Disk::Track>)track
{
// Confirm that there are now flux transitions (just the first five will do)
// located 1/32nd of a rotation apart.
int c = 5;
while(c--)
{
Storage::Disk::Track::Event event = track.get_next_event();
Storage::Disk::Track::Event event = track->get_next_event();
Storage::Time simplified_time = event.length.simplify();
XCTAssert(simplified_time.length == 1 && simplified_time.clock_rate == 32, "flux transitions should be 1/32nd of a track apart");
}
}
- (void)testUnpatchedRawTrack
{
[self assertOneThirtyTwosForTrack:self.togglingTrack];
}
- (void)testUnpatchedTrack
{
[self assertOneThirtyTwosForTrack:self.patchableTogglingTrack];
}
@end

View File

@ -10,7 +10,7 @@
using namespace Storage::Disk;
PCMPatchedTrack::PCMPatchedTrack(Track &underlying_track) :
PCMPatchedTrack::PCMPatchedTrack(std::shared_ptr<Track> underlying_track) :
underlying_track_(underlying_track),
active_patch_((size_t)-1)
{}
@ -23,10 +23,10 @@ void PCMPatchedTrack::add_segment(const Time &start_position, const PCMSegment &
Track::Event PCMPatchedTrack::get_next_event()
{
// if(active_patch_ == (size_t)-1)
return underlying_track_.get_next_event();
return underlying_track_->get_next_event();
}
Storage::Time PCMPatchedTrack::seek_to(const Time &time_since_index_hole)
{
return underlying_track_.seek_to(time_since_index_hole);
return underlying_track_->seek_to(time_since_index_hole);
}

View File

@ -23,7 +23,7 @@ class PCMPatchedTrack: public Track {
Constructs a @c PCMPatchedTrack that will return events from @c underlying_track in
regions where it has not had alternative PCM data installed.
*/
PCMPatchedTrack(Track &underlying_track);
PCMPatchedTrack(std::shared_ptr<Track> underlying_track);
/*!
Replaces whatever is currently on the track from @c start_position to @c start_position + segment length
@ -36,7 +36,7 @@ class PCMPatchedTrack: public Track {
Time seek_to(const Time &time_since_index_hole);
private:
Track &underlying_track_;
std::shared_ptr<Track> underlying_track_;
struct Patch {
Time start_position;
PCMSegment segment;