#pragma once #include "engine/array.h" #include "engine/delegate.h" namespace Lumix { template struct DelegateList; template struct DelegateList { explicit DelegateList(IAllocator& allocator) : m_delegates(allocator) { } template void bind(C* instance) { Delegate cb; cb.template bind(instance); m_delegates.push(cb); } template void bind() { Delegate cb; cb.template bind(); m_delegates.push(cb); } template void unbind() { Delegate cb; cb.template bind(); for (int i = 0; i < m_delegates.size(); ++i) { if (m_delegates[i] == cb) { m_delegates.swapAndPop(i); break; } } } template void unbind(C* instance) { Delegate cb; cb.template bind(instance); for (int i = 0; i < m_delegates.size(); ++i) { if (m_delegates[i] == cb) { m_delegates.swapAndPop(i); break; } } } void invoke(Args... args) { for (i32 i = 0, c = m_delegates.size(); i < c; ++i) m_delegates[i].invoke(args...); } private: Array> m_delegates; }; } // namespace Lumix