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

Last change on this file since 1040 was 793, checked in by Maciej Komosinski, 3 years ago

Code formatting

  • Property svn:eol-style set to native
File size: 2.1 KB
Line 
1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
4
5#include "callbacks.h"
6#include <stdio.h>
7
8#ifdef USEMEMBERCALLBACK
9int MemberCallbackNode::equals(CallbackNode*n)
10{
11        if (n == this) return 1;
12        MemberCallbackNode *classok = dynamic_cast<MemberCallbackNode*>(n);
13        if (!classok) return 0;
14        return ((userdata == classok->userdata) && (object == classok->object) && (member == classok->member));
15}
16#endif
17
18int FunctionCallbackNode::equals(CallbackNode*n)
19{
20        if (n == this) return 1;
21        FunctionCallbackNode *classok = dynamic_cast<FunctionCallbackNode*>(n);
22        if (!classok) return 0;
23        return ((userdata == classok->userdata) && (fun == classok->fun));
24}
25
26int StatrickCallbackNode::equals(CallbackNode*n)
27{
28        if (n == this) return 1;
29        StatrickCallbackNode *classok = dynamic_cast<StatrickCallbackNode*>(n);
30        if (!classok) return 0;
31        return ((object == classok->object) && (userdata == classok->userdata) && (fun == classok->fun));
32}
33
34/////////////////
35
36CallbackNode* Callback::add(CallbackNode*n)
37{
38        SList::operator+=(n);
39        return n;
40}
41
42void Callback::removeNode(CallbackNode*n)
43{
44        SList::operator-=(n);
45        delete n;
46}
47
48void Callback::remove(CallbackNode*node)
49{
50        CallbackNode *n;
51        //printf("Hint: removing callbacks (former 'DuoList') is more efficient using removeNode(). (refer to 'callbacks.h')\n");
52        for (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                }
60        delete node; // tu nie wiem czy na pewno...
61}
62
63void Callback::action(intptr_t data)
64{
65        if (size() == 0) return;
66        SList copy = *this;
67        FOREACH(CallbackNode*, n, copy)
68                n->action(data);
69}
70
71Callback::~Callback()
72{
73        CallbackNode *n;
74        for (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.