]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/base.cpp
Make classbase and refcountbase uncopyable; expand comments on their indended uses
[user/henk/code/inspircd.git] / src / base.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
6  * See: http://wiki.inspircd.org/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 /* $Core */
15
16 #include "inspircd_config.h"
17 #include "base.h"
18 #include <time.h>
19 #include "inspircd.h"
20
21 classbase::classbase()
22 {
23 }
24
25 CullResult classbase::cull()
26 {
27         return CullResult();
28 }
29
30 classbase::~classbase()
31 {
32 }
33
34 CullResult::CullResult()
35 {
36 }
37
38 refcountbase::refcountbase() : refcount(0)
39 {
40 }
41
42 refcountbase::~refcountbase()
43 {
44 }
45
46 ExtensionItem::ExtensionItem(const std::string& Key, Module* mod) : key(Key), owner(mod)
47 {
48 }
49
50 ExtensionItem::~ExtensionItem()
51 {
52 }
53
54 void* ExtensionItem::get_raw(const Extensible* container) const
55 {
56         Extensible::ExtensibleStore::const_iterator i =
57                 container->extensions.find(const_cast<ExtensionItem*>(this));
58         if (i == container->extensions.end())
59                 return NULL;
60         return i->second;
61 }
62
63 void* ExtensionItem::set_raw(Extensible* container, void* value)
64 {
65         std::pair<Extensible::ExtensibleStore::iterator,bool> rv =
66                 container->extensions.insert(std::make_pair(this, value));
67         if (rv.second)
68         {
69                 return NULL;
70         }
71         else
72         {
73                 void* old = rv.first->second;
74                 rv.first->second = value;
75                 return old;
76         }
77 }
78
79 void* ExtensionItem::unset_raw(Extensible* container)
80 {
81         Extensible::ExtensibleStore::iterator i = container->extensions.find(this);
82         if (i == container->extensions.end())
83                 return NULL;
84         void* rv = i->second;
85         container->extensions.erase(i);
86         return rv;
87 }
88
89 void ExtensionManager::Register(ExtensionItem* item)
90 {
91         types.insert(std::make_pair(item->key, item));
92 }
93
94 void ExtensionManager::BeginUnregister(Module* module, std::vector<ExtensionItem*>& list)
95 {
96         std::map<std::string, ExtensionItem*>::iterator i = types.begin();
97         while (i != types.end())
98         {
99                 std::map<std::string, ExtensionItem*>::iterator me = i++;
100                 ExtensionItem* item = me->second;
101                 if (item->owner == module)
102                 {
103                         list.push_back(item);
104                         types.erase(me);
105                 }
106         }
107 }
108
109 ExtensionItem* ExtensionManager::GetItem(const std::string& name)
110 {
111         std::map<std::string, ExtensionItem*>::iterator i = types.find(name);
112         if (i == types.end())
113                 return NULL;
114         return i->second;
115 }
116
117 void Extensible::doUnhookExtensions(const std::vector<ExtensionItem*>& toRemove)
118 {
119         for(std::vector<ExtensionItem*>::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
120         {
121                 ExtensionItem* item = *i;
122                 ExtensibleStore::iterator e = extensions.find(item);
123                 if (e != extensions.end())
124                 {
125                         item->free(e->second);
126                         extensions.erase(e);
127                 }
128         }
129 }
130
131 CullResult Extensible::cull()
132 {
133         for(ExtensibleStore::iterator i = extensions.begin(); i != extensions.end(); ++i)
134         {
135                 i->first->free(i->second);      
136         }
137         return classbase::cull();
138 }
139
140 Extensible::~Extensible()
141 {
142 }
143
144 LocalExtItem::LocalExtItem(const std::string& Key, Module* mod) : ExtensionItem(Key, mod)
145 {
146 }
147
148 LocalExtItem::~LocalExtItem()
149 {
150 }
151
152 std::string LocalExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) const
153 {
154         return "";
155 }
156
157 void LocalExtItem::unserialize(SerializeFormat format, Extensible* container, const std::string& value)
158 {
159 }
160
161 LocalStringExt::LocalStringExt(const std::string& Key, Module* Owner)
162         : SimpleExtItem<std::string>(Key, Owner) { }
163
164 LocalStringExt::~LocalStringExt()
165 {
166 }
167
168 std::string LocalStringExt::serialize(SerializeFormat format, const Extensible* container, void* item) const
169 {
170         if (item && format == FORMAT_USER)
171                 return *static_cast<std::string*>(item);
172         return "";
173 }
174
175 LocalIntExt::LocalIntExt(const std::string& Key, Module* mod) : LocalExtItem(Key, mod)
176 {
177 }
178
179 LocalIntExt::~LocalIntExt()
180 {
181 }
182
183 std::string LocalIntExt::serialize(SerializeFormat format, const Extensible* container, void* item) const
184 {
185         if (format != FORMAT_USER)
186                 return "";
187         return ConvToStr(reinterpret_cast<intptr_t>(item));
188 }
189
190 intptr_t LocalIntExt::get(const Extensible* container) const
191 {
192         return reinterpret_cast<intptr_t>(get_raw(container));
193 }
194
195 intptr_t LocalIntExt::set(Extensible* container, intptr_t value)
196 {
197         if (value)
198                 return reinterpret_cast<intptr_t>(set_raw(container, reinterpret_cast<void*>(value)));
199         else
200                 return reinterpret_cast<intptr_t>(unset_raw(container));
201 }
202
203 void LocalIntExt::free(void*)
204 {
205 }
206
207 StringExtItem::StringExtItem(const std::string& Key, Module* mod) : ExtensionItem(Key, mod)
208 {
209 }
210
211 StringExtItem::~StringExtItem()
212 {
213 }
214
215 std::string* StringExtItem::get(const Extensible* container) const
216 {
217         return static_cast<std::string*>(get_raw(container));
218 }
219
220 std::string StringExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) const
221 {
222         return item ? *static_cast<std::string*>(item) : "";
223 }
224
225 void StringExtItem::unserialize(SerializeFormat format, Extensible* container, const std::string& value)
226 {
227         if (value.empty())
228                 unset(container);
229         else
230                 set(container, value);
231 }
232
233 void StringExtItem::set(Extensible* container, const std::string& value)
234 {
235         void* old = set_raw(container, new std::string(value));
236         delete static_cast<std::string*>(old);
237 }
238
239 void StringExtItem::unset(Extensible* container)
240 {
241         void* old = unset_raw(container);
242         delete static_cast<std::string*>(old);
243 }
244
245 void StringExtItem::free(void* item)
246 {
247         delete static_cast<std::string*>(item);
248 }