1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
7 * <brain@chatspike.net>
8 * <Craig@chatspike.net>
10 * Written by Craig Edwards, Craig McLure, and others.
11 * This program is free but copyrighted software; see
12 * the file COPYING for details.
14 * ---------------------------------------------------
20 #include "inspircd_config.h"
26 typedef void* VoidPointer;
27 typedef std::map<std::string,char*> ExtensibleStore;
31 /** The base class for all inspircd classes
36 /** Time that the object was instantiated (used for TS calculation etc)
41 * Sets the object's time
47 /** class Extensible is the parent class of many classes such as userrec and chanrec.
48 * class Extensible implements a system which allows modules to 'extend' the class by attaching data within
49 * a map associated with the object. In this way modules can store their own custom information within user
50 * objects, channel objects and server objects, without breaking other modules (this is more sensible than using
51 * a flags variable, and each module defining bits within the flag as 'theirs' as it is less prone to conflict and
52 * supports arbitary data storage).
54 class Extensible : public classbase
56 /** Private data store
58 ExtensibleStore Extension_Items;
62 /** Extend an Extensible class.
64 * @param key The key parameter is an arbitary string which identifies the extension data
65 * @param p This parameter is a pointer to any data you wish to associate with the object
67 * You must provide a key to store the data as via the parameter 'key' and store the data
68 * in the templated parameter 'p'.
69 * The data will be inserted into the map. If the data already exists, you may not insert it
70 * twice, Extensible::Extend will return false in this case.
72 * @return Returns true on success, false if otherwise
74 template<typename T> bool Extend(const std::string &key, T* p)
76 /* This will only add an item if it doesnt already exist,
77 * the return value is a std::pair of an iterator to the
78 * element, and a bool saying if it was actually inserted.
80 return this->Extension_Items.insert(std::make_pair(key, (char*)p)).second;
83 /** Extend an Extensible class.
85 * @param key The key parameter is an arbitary string which identifies the extension data
87 * You must provide a key to store the data as via the parameter 'key', this single-parameter
88 * version takes no 'data' parameter, this is used purely for boolean values.
89 * The key will be inserted into the map with a NULL 'data' pointer. If the key already exists
90 * then you may not insert it twice, Extensible::Extend will return false in this case.
92 * @return Returns true on success, false if otherwise
94 bool Extend(const std::string &key)
96 /* This will only add an item if it doesnt already exist,
97 * the return value is a std::pair of an iterator to the
98 * element, and a bool saying if it was actually inserted.
100 return this->Extension_Items.insert(std::make_pair(key, (char*)NULL)).second;
103 /** Shrink an Extensible class.
105 * @param key The key parameter is an arbitary string which identifies the extension data
107 * You must provide a key name. The given key name will be removed from the classes data. If
108 * you provide a nonexistent key (case is important) then the function will return false.
109 * @return Returns true on success.
111 bool Shrink(const std::string &key);
113 /** Get an extension item.
115 * @param key The key parameter is an arbitary string which identifies the extension data
116 * @param p If you provide a non-existent key, this value will be NULL. Otherwise a pointer to the item you requested will be placed in this templated parameter.
117 * @return Returns true if the item was found and false if it was nor, regardless of wether 'p' is NULL. This allows you to store NULL values in Extensible.
119 template<typename T> bool GetExt(const std::string &key, T* &p)
121 ExtensibleStore::iterator iter = this->Extension_Items.find(key);
122 if(iter != this->Extension_Items.end())
124 p = (T*)iter->second;
134 /** Get an extension item.
136 * @param key The key parameter is an arbitary string which identifies the extension data
137 * @return Returns true if the item was found and false if it was not.
139 * This single-parameter version only checks if the key exists, it does nothing with
140 * the 'data' field and is probably only useful in conjunction with the single-parameter
141 * version of Extend().
143 bool GetExt(const std::string &key)
145 return (this->Extension_Items.find(key) != this->Extension_Items.end());
148 /** Get a list of all extension items names.
149 * @param list A deque of strings to receive the list
150 * @return This function writes a list of all extension items stored in this object by name into the given deque and returns void.
152 void GetExtList(std::deque<std::string> &list);
155 /** BoolSet is a utility class designed to hold eight bools in a bitmask.
156 * Use BoolSet::Set and BoolSet::Get to set and get bools in the bitmask,
157 * and Unset and Invert for special operations upon them.
159 class BoolSet : public classbase
165 /** The default constructor initializes the BoolSet to all values unset.
169 /** This constructor copies the default bitmask from a char
171 BoolSet(char bitmask);
173 /** The Set method sets one bool in the set.
175 * @param number The number of the item to set. This must be between 0 and 7.
177 void Set(int number);
179 /** The Get method returns the value of one bool in the set
181 * @param number The number of the item to retrieve. This must be between 0 and 7.
183 * @return True if the item is set, false if it is unset.
185 bool Get(int number);
187 /** The Unset method unsets one value in the set
189 * @param number The number of the item to set. This must be between 0 and 7.
191 void Unset(int number);
193 /** The Unset method inverts (flips) one value in the set
195 * @param number The number of the item to invert. This must be between 0 and 7.
197 void Invert(int number);
199 /** Compare two BoolSets
201 bool operator==(BoolSet other);
203 /** OR two BoolSets together
205 BoolSet operator|(BoolSet other);
207 /** AND two BoolSets together
209 BoolSet operator&(BoolSet other);
211 /** Assign one BoolSet to another
213 bool operator=(BoolSet other);