Advertisement
Guest User

DelegateChain

a guest
Mar 29th, 2017
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. template <typename ... Parameters>
  2. class ACTIONRPG_API DelegateChain
  3. {
  4. protected:
  5.     typedef std::function<bool(Parameters...)> FunctionType;
  6.  
  7.     struct Delegate {
  8.         Delegate(UObject* Target, int32 Priority, FunctionType Function) {
  9.             this->Target = Target;
  10.             this->Priority = Priority;
  11.             this->Function = Function;
  12.         }
  13.         UObject* Target;
  14.         int32 Priority;
  15.         FunctionType Function;
  16.     };
  17.  
  18.     std::list<Delegate> Delegates;
  19.  
  20.     void AddDelegate(Delegate& Delegate) {
  21.         for (auto Iterator = Delegates.begin(); Iterator != Delegates.end(); Iterator++) {
  22.             if (Iterator->Priority < Delegate.Priority) {
  23.                 Delegates.insert(Iterator, Delegate);
  24.                 return;
  25.             }
  26.         }
  27.         Delegates.insert(Delegates.end(), Delegate);
  28.     }
  29.  
  30. public:
  31.     template <typename ObjectType, typename MemberType>
  32.     void Register(ObjectType* Object, MemberType Function, int32 Priority) {
  33.         Delegate Delegate(Object, Priority, [=](Parameters... params) -> bool {
  34.             return (Object->*Function)(params...);
  35.         });
  36.         AddDelegate(Delegate);
  37.     }
  38.  
  39.     void Unregister(UObject* Target) {
  40.         for (auto Iterator = Delegates.begin(); Iterator != Delegates.end();) {
  41.             auto OldIterator = Iterator++;
  42.             if (OldIterator->Target == Target) {
  43.                 Delegates.erase(OldIterator);
  44.             }
  45.         }
  46.         return;
  47.     }
  48.  
  49.     bool Call(Parameters... params) {
  50.         for (auto Iterator = Delegates.begin(); Iterator != Delegates.end(); ) {
  51.             auto Current = Iterator++;
  52.             if (Current->Function(params...)) {
  53.                 return true;
  54.             }
  55.         }
  56.         return false;
  57.     }
  58. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement