// This file is a part of the Framsticks GDK library. // Copyright (C) 2002-2011 Szymon Ulatowski. See LICENSE.txt for details. // Refer to http://www.framsticks.com/ for further information. #include "callbacks.h" #include #ifdef USEMEMBERCALLBACK int MemberCallbackNode::equals(CallbackNode*n) { if (n==this) return 1; MemberCallbackNode *classok=dynamic_cast(n); if (!classok) return 0; return ((userdata==classok->userdata)&&(object==classok->object)&&(member==classok->member)); } #endif int FunctionCallbackNode::equals(CallbackNode*n) { if (n==this) return 1; FunctionCallbackNode *classok=dynamic_cast(n); if (!classok) return 0; return ((userdata==classok->userdata)&&(fun==classok->fun)); } int StatrickCallbackNode::equals(CallbackNode*n) { if (n==this) return 1; StatrickCallbackNode *classok=dynamic_cast(n); if (!classok) return 0; return ((object==classok->object)&&(userdata==classok->userdata)&&(fun==classok->fun)); } ///////////////// CallbackNode* Callback::add(CallbackNode*n) { SList::operator+=(n); return n; } void Callback::removeNode(CallbackNode*n) { SList::operator-=(n); delete n; } void Callback::remove(CallbackNode*node) { CallbackNode *n; //printf("Hint: removing callbacks (former 'DuoList') is more efficient using removeNode(). (refer to 'callbacks.h')\n"); for (int i=0;n=(CallbackNode *)operator()(i);i++) if (node->equals(n)) { SList::operator-=(i); delete node; if (n!=node) delete n; return; } delete node; // tu nie wiem czy na pewno... } void Callback::action(long data) { FOREACH(CallbackNode*,n,(*this)) n->action(data); } Callback::~Callback() { CallbackNode *n; for (int i=size()-1;i>=0;i--) { n=(CallbackNode *)operator()(i); delete n; // todo: zrobic zeby kolejnosc delete callbacknode <-> delete callback nie wplywala na poprawne dzialania // blad odkryty 24.01 pokazal, ze deletowanie callbacknodow w ~callback // moze powodowac problemy, jezeli obiekty sa usuwane w "zlej" kolejnosci // ale na razie tak zostanie } }