ManaPlus
baselistener.hpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2014-2019 The ManaPlus Developers
4  * Copyright (C) 2019-2021 Andrei Karas
5  *
6  * This file is part of The ManaPlus Client.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #ifndef LISTENERS_BASELISTENER_HPP
23 #define LISTENERS_BASELISTENER_HPP
24 
25 #include "utils/vector.h"
26 
27 #define defineListener(name) \
28  STD_VECTOR<name*> name::mListeners; \
29  \
30  name::name() \
31  { \
32  addListener(this); \
33  } \
34  \
35  name::~name() \
36  { \
37  removeListener(this); \
38  } \
39  \
40  void name::addListener(name *const listener) \
41  { \
42  if (listener) \
43  mListeners.push_back(listener); \
44  } \
45  \
46  void name::removeListener(const name *const listener) \
47  { \
48  STD_VECTOR<name*>::iterator it = mListeners.begin(); \
49  while (it != mListeners.end()) \
50  { \
51  if (*it == listener) \
52  it = mListeners.erase(it); \
53  else \
54  ++ it; \
55  } \
56  }
57 
58 #define defineListenerHeader(name) \
59  public: \
60  name(); \
61  \
62  virtual ~name(); \
63  \
64  static void addListener(name *const listener); \
65  \
66  static void removeListener(const name *const listener); \
67  \
68  private: \
69  static STD_VECTOR<name*> mListeners;
70 
71 #endif // LISTENERS_BASELISTENER_HPP