diff --git a/include/gamepad/triggers.hpp b/include/gamepad/triggers.hpp new file mode 100644 index 0000000..d3cf9f8 --- /dev/null +++ b/include/gamepad/triggers.hpp @@ -0,0 +1,85 @@ +#pragma once + +namespace Gamepad { + +class AbstractTrigger; +class ConstantTrigger; + +class Trigger final { + public: + Trigger (bool val): impl(new ConstantTrigger(val)) {} + explicit Trigger(std::unique_ptr _impl) : impl(std::move(_impl)) {} + bool eval() { return impl.eval(); } + //private: + std::unique_ptr impl; +} + +class AbstractTrigger { + public: + virtual bool eval() = 0; + virtual ~AbstractTrigger() = default; +} + +class ConstantTrigger { + public: + explicit ConstantTrigger (bool _val) : _val(val) {} + override bool eval() { return val; } + private: + bool val; +} + +class AndTrigger : public AbstractTrigger { + public: + AndTrigger(std::unique_ptr _left, + std::unique_ptr _right) : left(_left), right(_right) {} + override bool eval() { return left.eval() & right.eval(); } + private: + std::unique_ptr left; + std::unique_ptr right; +} + +class OrTrigger : public AbstractTrigger { + public: + OrTrigger(std::unique_ptr _left, + std::unique_ptr _right) : left(_left), right(_right) {} + override bool eval() { return left.eval() | right.eval(); } + private: + std::unique_ptr left; + std::unique_ptr right; +} + +class XorTrigger : public AbstractTrigger { + public: + XorTrigger(std::unique_ptr _left, + std::unique_ptr _right) : left(_left), right(_right) {} + override bool eval() { return left.eval() ^ right.eval(); } + private: + std::unique_ptr left; + std::unique_ptr right; +} + +class NotTrigger : public AbstractTrigger { + public: + NotTrigger(std::unique_ptr _op) : op(_op) {} + override bool eval() { return !op.eval(); } + private: + std::unique_ptr op; +} + +Trigger operator&(Trigger left, Trigger right) { + return Trigger(new AndTrigger(std::move(left.impl), std::move(right.impl))); +} + +Trigger operator|(Trigger left, Trigger right) { + return Trigger(new OrTrigger(std::move(left.impl), std::move(right.impl))); +} + +Trigger operator^(Trigger left, Trigger right) { + return Trigger(new XorTrigger(std::move(left.impl), std::move(right.impl))); +} + +Trigger operator!(Trigger op) { + return Trigger(new NotTrigger(std::move(op.impl))); +} + +} \ No newline at end of file