#pragma once namespace lt { class Layer; class Event; class LayerStack { public: template void emplace_layer(Args &&...args) { attach_layer(create_ref(std::forward(args)...)); } void attach_layer(Ref layer); void detach_layer(const Ref &layer); [[nodiscard]] auto is_empty() const -> bool { return m_layers.empty(); } [[nodiscard]] auto begin() -> std::vector>::iterator { return m_layers.begin(); } [[nodiscard]] auto end() -> std::vector>::iterator { return m_layers.end(); } [[nodiscard]] auto rbegin() -> std::vector>::reverse_iterator { return m_layers.rbegin(); } [[nodiscard]] auto rend() -> std::vector>::reverse_iterator { return m_layers.rend(); } private: std::vector> m_layers; }; } // namespace lt