Program Listing for File TickController.hpp

Return to documentation for file (engine/include/Cacao/TickController.hpp)

#pragma once

#include "Cacao/FrameProcessor.hpp"
#include "DllHelper.hpp"

#include <memory>
#include <semaphore>
#include <mutex>
#include <atomic>

namespace Cacao {
    class CACAO_API TickController {
      public:
        static TickController& Get();

        TickController(const TickController&) = delete;
        TickController(TickController&&) = delete;
        TickController& operator=(const TickController&) = delete;
        TickController& operator=(TickController&&) = delete;

        void Start();

        void Stop();

        bool IsRunning() const {
            return running;
        }

      private:
        struct Impl;
        std::unique_ptr<Impl> impl;

        bool running;

        struct SnapshotRequestControl {
            SnapshotRequestControl() : request(false), grant(0), done(0), mutex() {}

            std::atomic_bool request;
            std::binary_semaphore grant;
            std::binary_semaphore done;
            std::mutex mutex;
        } snapshotControl;
        friend class FrameProcessor;

        TickController();
        ~TickController();
    };
}