// // Electron.hpp // Clock Signal // // Created by Thomas Harte on 03/01/2016. // Copyright 2016 Thomas Harte. All rights reserved. // #pragma once #include "../../../Configurable/Configurable.hpp" #include "../../../Configurable/StandardOptions.hpp" #include "../../../Analyser/Static/StaticAnalyser.hpp" #include "../../ROMMachine.hpp" #include namespace Electron { /*! @abstract Represents an Acorn Electron. @discussion An instance of Electron::Machine represents the current state of an Acorn Electron. */ struct Machine { virtual ~Machine() = default; /// Creates and returns an Electron. static std::unique_ptr Electron(const Analyser::Static::Target *target, const ROMMachine::ROMFetcher &rom_fetcher); /// Defines the runtime options available for an Electron. class Options: public Reflection::StructImpl, public Configurable::DisplayOption, public Configurable::QuickloadOption { friend Configurable::DisplayOption; friend Configurable::QuickloadOption; public: Options(Configurable::OptionsType type) : Configurable::DisplayOption(type == Configurable::OptionsType::UserFriendly ? Configurable::Display::RGB : Configurable::Display::CompositeColour), Configurable::QuickloadOption(type == Configurable::OptionsType::UserFriendly) {} private: Options() : Options(Configurable::OptionsType::UserFriendly) {} friend Reflection::StructImpl; void declare_fields() { declare_display_option(); declare_quickload_option(); limit_enum(&output, Configurable::Display::RGB, Configurable::Display::CompositeColour, Configurable::Display::CompositeMonochrome, -1); } }; }; }