source: cpp/frams/util/callbacks.cpp @ 176

Last change on this file since 176 was 166, checked in by sz, 11 years ago

Iterating a copy of callback list allows to modify the original while iterating it (still not safe in general, but it is good enough for the most common case of self-unregistration)

  • Property svn:eol-style set to native
File size: 2.1 KB
RevLine 
[121]1// This file is a part of the Framsticks GDK.
2// Copyright (C) 2002-2014  Maciej Komosinski and Szymon Ulatowski.  See LICENSE.txt for details.
[109]3// Refer to http://www.framsticks.com/ for further information.
4
5#include "callbacks.h"
6#include <stdio.h>
7
8#ifdef USEMEMBERCALLBACK
9int MemberCallbackNode::equals(CallbackNode*n)
10{
11if (n==this) return 1;
12MemberCallbackNode *classok=dynamic_cast<MemberCallbackNode*>(n);
13if (!classok) return 0;
14return ((userdata==classok->userdata)&&(object==classok->object)&&(member==classok->member));
15}
16#endif
17
18int FunctionCallbackNode::equals(CallbackNode*n)
19{
20if (n==this) return 1;
21FunctionCallbackNode *classok=dynamic_cast<FunctionCallbackNode*>(n);
22if (!classok) return 0;
23return ((userdata==classok->userdata)&&(fun==classok->fun));
24}
25
26int StatrickCallbackNode::equals(CallbackNode*n)
27{
28if (n==this) return 1;
29StatrickCallbackNode *classok=dynamic_cast<StatrickCallbackNode*>(n);
30if (!classok) return 0;
31return ((object==classok->object)&&(userdata==classok->userdata)&&(fun==classok->fun));
32}
33
34/////////////////
35
36CallbackNode* Callback::add(CallbackNode*n)
37{
38SList::operator+=(n);
39return n;
40}
41
42void Callback::removeNode(CallbackNode*n)
43{
44SList::operator-=(n);
45delete n;
46}
47
48void Callback::remove(CallbackNode*node)
49{
50CallbackNode *n;
51//printf("Hint: removing callbacks (former 'DuoList') is more efficient using removeNode(). (refer to 'callbacks.h')\n");
52for (int i=0;n=(CallbackNode *)operator()(i);i++)
53        if (node->equals(n))
54                {
55                SList::operator-=(i);
56                delete node;
57                if (n!=node) delete n;
58                return;
59                }
60delete node; // tu nie wiem czy na pewno...
61}
62
63void Callback::action(long data)
64{
[166]65if (size()==0) return;
66SList copy=*this;
67FOREACH(CallbackNode*,n,copy)
[109]68        n->action(data);
69}
70
71Callback::~Callback()
72{
73CallbackNode *n;
74for (int i=size()-1;i>=0;i--)
75        {
76        n=(CallbackNode *)operator()(i);
77        delete n;
78// todo: zrobic zeby kolejnosc delete callbacknode <-> delete callback nie wplywala na poprawne dzialania
79// blad odkryty 24.01 pokazal, ze deletowanie callbacknodow w ~callback
80// moze powodowac problemy, jezeli obiekty sa usuwane w "zlej" kolejnosci
81// ale na razie tak zostanie
82        }
83}
84
Note: See TracBrowser for help on using the repository browser.