Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <typename ... Parameters>
- class ACTIONRPG_API DelegateChain
- {
- protected:
- typedef std::function<bool(Parameters...)> FunctionType;
- struct Delegate {
- Delegate(UObject* Target, int32 Priority, FunctionType Function) {
- this->Target = Target;
- this->Priority = Priority;
- this->Function = Function;
- }
- UObject* Target;
- int32 Priority;
- FunctionType Function;
- };
- std::list<Delegate> Delegates;
- void AddDelegate(Delegate& Delegate) {
- for (auto Iterator = Delegates.begin(); Iterator != Delegates.end(); Iterator++) {
- if (Iterator->Priority < Delegate.Priority) {
- Delegates.insert(Iterator, Delegate);
- return;
- }
- }
- Delegates.insert(Delegates.end(), Delegate);
- }
- public:
- template <typename ObjectType, typename MemberType>
- void Register(ObjectType* Object, MemberType Function, int32 Priority) {
- Delegate Delegate(Object, Priority, [=](Parameters... params) -> bool {
- return (Object->*Function)(params...);
- });
- AddDelegate(Delegate);
- }
- void Unregister(UObject* Target) {
- for (auto Iterator = Delegates.begin(); Iterator != Delegates.end();) {
- auto OldIterator = Iterator++;
- if (OldIterator->Target == Target) {
- Delegates.erase(OldIterator);
- }
- }
- return;
- }
- bool Call(Parameters... params) {
- for (auto Iterator = Delegates.begin(); Iterator != Delegates.end(); ) {
- auto Current = Iterator++;
- if (Current->Function(params...)) {
- return true;
- }
- }
- return false;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement