summaryrefslogtreecommitdiff
path: root/src/game-server/thing.cpp
blob: 3aa7129e31539198ce58d6604d13010b85919595 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 *  The Mana World Server
 *  Copyright 2007 The Mana World Development Team
 *
 *  This file is part of The Mana World.
 *
 *  The Mana World  is free software; you can redistribute  it and/or modify it
 *  under the terms of the GNU General  Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or any later version.
 *
 *  The Mana  World is  distributed in  the hope  that it  will be  useful, but
 *  WITHOUT ANY WARRANTY; without even  the implied warranty of MERCHANTABILITY
 *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 *  more details.
 *
 *  You should  have received a  copy of the  GNU General Public  License along
 *  with The Mana  World; if not, write to the  Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include <cassert>

#include "game-server/thing.hpp"

#include "game-server/eventlistener.hpp"

Thing::~Thing()
{
    /* As another object will stop listening and call removeListener when it is
       deleted, the following assertion ensures that all the calls to
       removeListener have been performed will this object was still alive. It
       is not strictly necessary, as there are cases where no removal is
       performed (e.g. ~SpawnArea). But this is rather exceptional, so keep the
       assertion to catch all the other forgotten calls to removeListener. */
    assert(mListeners.empty());
}

void Thing::addListener(const EventListener *l)
{
    mListeners.insert(l);
}

void Thing::removeListener(const EventListener *l)
{
    mListeners.erase(l);
}

void Thing::inserted()
{
    for (Listeners::iterator i = mListeners.begin(),
         i_end = mListeners.end(); i != i_end;)
    {
        const EventListener &l = **i;
        ++i; // In case the listener removes itself from the list on the fly.
        if (l.dispatch->inserted) l.dispatch->inserted(&l, this);
    }
}

void Thing::removed()
{
    for (Listeners::iterator i = mListeners.begin(),
         i_end = mListeners.end(); i != i_end;)
    {
        const EventListener &l = **i;
        ++i; // In case the listener removes itself from the list on the fly.
        if (l.dispatch->removed) l.dispatch->removed(&l, this);
    }
}