#ifndef FLUXSOURCE_H #define FLUXSOURCE_H #include "flags.h" class CwfFluxSourceProto; class DiskFlux; class EraseFluxSourceProto; class Fl2FluxSourceProto; class FluxSourceProto; class FluxSpec; class Fluxmap; class HardwareFluxSourceProto; class KryofluxFluxSourceProto; class ScpFluxSourceProto; class TestPatternFluxSourceProto; class FlxFluxSourceProto; class FluxSourceIterator { public: virtual ~FluxSourceIterator() {} virtual bool hasNext() const = 0; virtual std::unique_ptr next() = 0; }; class FluxSource { public: virtual ~FluxSource() {} private: static std::unique_ptr createCwfFluxSource( const CwfFluxSourceProto& config); static std::unique_ptr createEraseFluxSource( const EraseFluxSourceProto& config); static std::unique_ptr createFl2FluxSource( const Fl2FluxSourceProto& config); static std::unique_ptr createFlxFluxSource( const FlxFluxSourceProto& config); static std::unique_ptr createHardwareFluxSource( const HardwareFluxSourceProto& config); static std::unique_ptr createKryofluxFluxSource( const KryofluxFluxSourceProto& config); static std::unique_ptr createScpFluxSource( const ScpFluxSourceProto& config); static std::unique_ptr createTestPatternFluxSource( const TestPatternFluxSourceProto& config); public: static std::unique_ptr createMemoryFluxSource( const DiskFlux& flux); static std::unique_ptr create(const FluxSourceProto& spec); static void updateConfigForFilename( FluxSourceProto* proto, const std::string& filename); public: virtual std::unique_ptr readFlux( int track, int side) = 0; virtual void recalibrate() {} virtual void seek(int track) {} virtual bool isHardware() { return false; } }; class TrivialFluxSource : public FluxSource { public: std::unique_ptr readFlux(int track, int side); virtual std::unique_ptr readSingleFlux( int track, int side) = 0; }; #endif