// // TypedDynamicMachine.hpp // Clock Signal // // Created by Thomas Harte on 24/11/2017. // Copyright 2017 Thomas Harte. All rights reserved. // #ifndef TypedDynamicMachine_h #define TypedDynamicMachine_h #include "MachineForTarget.hpp" namespace Machine { template class TypedDynamicMachine: public ::Machine::DynamicMachine { public: TypedDynamicMachine(T *machine) : machine_(machine) {} T *get() { return machine_.get(); } TypedDynamicMachine() : TypedDynamicMachine(nullptr) {} TypedDynamicMachine(TypedDynamicMachine &&rhs) : machine_(std::move(rhs.machine_)) {} TypedDynamicMachine &operator=(TypedDynamicMachine &&rhs) { machine_ = std::move(rhs.machine_); return *this; } Activity::Source *activity_source() override { return get(); } MediaTarget::Machine *media_target() override { return get(); } CRTMachine::Machine *crt_machine() override { return get(); } JoystickMachine::Machine *joystick_machine() override { return get(); } KeyboardMachine::Machine *keyboard_machine() override { return get(); } MouseMachine::Machine *mouse_machine() override { return get(); } Configurable::Device *configurable_device() override { return get(); } void *raw_pointer() override { return get(); } private: template Class *get() { return dynamic_cast(machine_.get()); } std::unique_ptr machine_; }; } #endif /* TypedDynamicMachine_h */