2016-07-10 08:54:39 -04:00
|
|
|
//
|
|
|
|
// Disk.hpp
|
|
|
|
// Clock Signal
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 10/07/2016.
|
|
|
|
// Copyright © 2016 Thomas Harte. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef Disk_hpp
|
|
|
|
#define Disk_hpp
|
|
|
|
|
2016-11-26 14:27:06 +08:00
|
|
|
#include <map>
|
2016-12-29 22:15:58 -05:00
|
|
|
#include <memory>
|
|
|
|
#include <mutex>
|
2016-12-24 22:11:31 -05:00
|
|
|
#include <set>
|
2016-12-29 22:15:58 -05:00
|
|
|
|
2016-07-10 08:54:39 -04:00
|
|
|
#include "../Storage.hpp"
|
2017-09-22 22:39:23 -04:00
|
|
|
#include "Track/Track.hpp"
|
2016-12-29 22:15:58 -05:00
|
|
|
#include "../../Concurrency/AsyncTaskQueue.hpp"
|
2016-07-10 08:54:39 -04:00
|
|
|
|
|
|
|
namespace Storage {
|
2016-08-27 17:15:09 -04:00
|
|
|
namespace Disk {
|
2016-07-10 08:54:39 -04:00
|
|
|
|
|
|
|
class Disk {
|
|
|
|
public:
|
2017-10-07 19:14:18 -04:00
|
|
|
virtual ~Disk() {}
|
2016-07-10 08:54:39 -04:00
|
|
|
|
|
|
|
/*!
|
2016-11-26 23:35:11 +08:00
|
|
|
@returns the number of discrete positions that this disk uses to model its complete surface area.
|
2016-07-10 08:54:39 -04:00
|
|
|
|
|
|
|
This is not necessarily a track count. There is no implicit guarantee that every position will
|
2016-11-26 23:35:11 +08:00
|
|
|
return a distinct track, or — e.g. if the media is holeless — will return any track at all.
|
2016-07-10 08:54:39 -04:00
|
|
|
*/
|
2017-10-06 21:45:12 -04:00
|
|
|
virtual int get_head_position_count() = 0;
|
2016-07-10 08:54:39 -04:00
|
|
|
|
2016-09-18 19:21:02 -04:00
|
|
|
/*!
|
2016-11-26 23:35:11 +08:00
|
|
|
@returns the number of heads (and, therefore, impliedly surfaces) available on this disk.
|
2016-09-18 19:21:02 -04:00
|
|
|
*/
|
2017-10-06 21:45:12 -04:00
|
|
|
virtual int get_head_count() = 0;
|
2016-09-18 19:21:02 -04:00
|
|
|
|
2016-07-10 08:54:39 -04:00
|
|
|
/*!
|
2016-11-26 23:35:11 +08:00
|
|
|
@returns the @c Track at @c position underneath @c head if there are any detectable events there;
|
|
|
|
returns @c nullptr otherwise.
|
2016-07-10 08:54:39 -04:00
|
|
|
*/
|
2017-10-06 21:45:12 -04:00
|
|
|
virtual std::shared_ptr<Track> get_track_at_position(Track::Address address) = 0;
|
2016-11-26 14:27:06 +08:00
|
|
|
|
2016-12-24 22:11:31 -05:00
|
|
|
/*!
|
|
|
|
Replaces the Track at position @c position underneath @c head with @c track. Ignored if this disk is read-only.
|
|
|
|
*/
|
2017-10-06 21:45:12 -04:00
|
|
|
virtual void set_track_at_position(Track::Address address, const std::shared_ptr<Track> &track) = 0;
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Provides a hint that no further tracks are likely to be written for a while.
|
|
|
|
*/
|
|
|
|
virtual void flush_tracks() = 0;
|
2016-12-24 22:11:31 -05:00
|
|
|
|
|
|
|
/*!
|
|
|
|
@returns whether the disk image is read only. Defaults to @c true if not overridden.
|
|
|
|
*/
|
2017-09-22 20:28:11 -04:00
|
|
|
virtual bool get_is_read_only() = 0;
|
2016-07-10 08:54:39 -04:00
|
|
|
};
|
|
|
|
|
2016-08-27 17:15:09 -04:00
|
|
|
}
|
2016-07-10 08:54:39 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* Disk_hpp */
|