5 template <
typename T,
typename ID>
6 T* GenericMemoryMap<T,ID>::CreateEntry(
char* data, ID
id,
const char* name) {
9 fprintf(stderr,
"CreateEntry %u no data provided\n",
id);
12 GenericMapHeader* header = (GenericMapHeader*)data;
14 if (
id >= header->maxID) {
15 fprintf(stderr,
"CreateEntry bit location %u out of range\n",
id);
26 if (!utils::GetBit(
id, ((
char*)header +
sizeof(GenericMapHeader)), header->bitFieldSize, check) || (check == BITOCCUPIED)) {
29 entry = GetEntry(data,
id);
30 if (entry && (strcmp(name, entry->name) == 0)) {
39 utils::SetBit(
id, BITOCCUPIED, ((
char*)header +
sizeof(GenericMapHeader)), header->bitFieldSize);
42 uint32 offset =
sizeof(GenericMapHeader) + header->bitFieldSize +
id *
sizeof(T);
43 if (offset > header->size) {
44 fprintf(stderr,
"CreateEntry offset error in Memory Map\n");
47 entry = (T*) (data+offset);
48 if ((entry->id ==
id) || (entry->time == 0)) {
51 entry->time = GetTimeNow();
53 utils::strcpyavail(entry->name, name, MAXKEYNAMELEN,
true);
58 fprintf(stderr,
"CreateEntry entry error in Memory Map\n");
64 template <
typename T,
typename ID>
65 T* GenericMemoryMap<T,ID>::CreateFirstFreeEntry(
char* data, ID &
id,
const char* name) {
69 GenericMapHeader* header = (GenericMapHeader*)data;
78 if (!utils::GetFirstFreeBitLoc(((
char*)header +
sizeof(GenericMapHeader)), header->bitFieldSize, loc) || (loc >= header->maxID)) {
79 fprintf(stderr,
"No more bit locations available\n");
85 utils::SetBit(
id, BITOCCUPIED, ((
char*)header +
sizeof(GenericMapHeader)), header->bitFieldSize);
88 uint32 offset =
sizeof(GenericMapHeader) + header->bitFieldSize +
id *
sizeof(T);
89 if (offset > header->size) {
90 fprintf(stderr,
"Offset error in Memory Map\n");
93 entry = (T*) (data+offset);
94 if ((entry->id ==
id) || (entry->time == 0)) {
97 entry->time = GetTimeNow();
99 utils::strcpyavail(entry->name, name, MAXKEYNAMELEN,
true);
104 fprintf(stderr,
"Entry error in Memory Map\n");
109 template <
typename T,
typename ID>
110 bool GenericMemoryMap<T,ID>::DeleteEntry(
char* data, ID
id) {
114 GenericMapHeader* header = (GenericMapHeader*)data;
117 uint32 offset =
sizeof(GenericMapHeader) + header->bitFieldSize +
id *
sizeof(T);
118 if (offset > header->size)
120 entry = (T*) (data+offset);
121 if ((entry->id !=
id) || (entry->time == 0))
127 utils::SetBit(
id, BITFREE, ((
char*)header +
sizeof(GenericMapHeader)), header->bitFieldSize);
132 template <
typename T,
typename ID>
133 uint64 GenericMemoryMap<T,ID>::GetEntryTime(
char* data, ID
id) {
134 T* entry = GetEntry(data,
id);
140 template <
typename T,
typename ID>
141 T* GenericMemoryMap<T,ID>::GetEntry(
char* data, ID
id) {
145 GenericMapHeader* header = (GenericMapHeader*)data;
148 uint32 offset =
sizeof(GenericMapHeader) + header->bitFieldSize +
id *
sizeof(T);
149 if (offset > header->size)
151 entry = (T*) (data+offset);
152 if ((entry->id ==
id) && (entry->time != 0) && (entry->status > 1))
158 template <
typename T,
typename ID>
159 bool GenericMemoryMap<T,ID>::ConfirmEntry(
char* data, ID
id) {
163 GenericMapHeader* header = (GenericMapHeader*)data;
166 uint32 offset =
sizeof(GenericMapHeader) + header->bitFieldSize +
id *
sizeof(T);
167 if (offset > header->size)
169 entry = (T*) (data+offset);
170 if ((entry->id ==
id) && entry->time && (entry->status >= 1)) {
178 template <
typename T,
typename ID>
179 bool GenericMemoryMap<T,ID>::CancelEntry(
char* data, ID
id) {
183 GenericMapHeader* header = (GenericMapHeader*)data;
186 uint32 offset =
sizeof(GenericMapHeader) + header->bitFieldSize +
id *
sizeof(T);
187 if (offset > header->size)
189 entry = (T*) (data+offset);
190 if ((entry->id ==
id) && entry->time && (entry->status <= 1)) {
195 else if ((entry->id == 0) || (entry->status == 0))
201 template <
typename T,
typename ID>
202 bool GenericMemoryMap<T,ID>::GetEntryName(
char* data, ID
id,
char* name, uint32 maxSize) {
203 T* entry = GetEntry(data,
id);
206 return (utils::strcpyavail(name, entry->name, maxSize,
true) > 0);
209 template <
typename T,
typename ID>
210 ID GenericMemoryMap<T,ID>::GetEntryID(
char* data,
const char* name,
bool force) {
214 GenericMapHeader* header = (GenericMapHeader*)data;
216 entry = (T*) (data +
sizeof(GenericMapHeader) + header->bitFieldSize);
217 while ((uint32)((
char*)entry - data) < header->size) {
218 if (stricmp(name, entry->name) == 0) {
219 if ((entry->status > 1) || force)
229 template <
typename T,
typename ID>
230 uint8 GenericMemoryMap<T,ID>::LookupEntryID(
char* data,
const char* name, ID&
id) {
234 GenericMapHeader* header = (GenericMapHeader*)data;
237 entry = (T*) (data +
sizeof(GenericMapHeader) + header->bitFieldSize);
238 while ((uint32)((
char*)entry - data) < header->size) {
239 if (stricmp(name, entry->name) == 0) {
241 return entry->status;
249 template <
typename T,
typename ID>
250 std::string GenericMemoryMap<T,ID>::PrintAllEntries(
char* data) {
255 GenericMapHeader* header = (GenericMapHeader*)data;
257 entry = (T*) (data +
sizeof(GenericMapHeader) + header->bitFieldSize);
258 while ((uint32)((
char*)entry - data) < header->size) {
260 if (entry->status > 1)
261 str += utils::StringFormat(
"%u = %s (%s)\n", entry->id, entry->name, PrintTimeString(entry->time).c_str());
263 str += utils::StringFormat(
"*%u = %s (%s)\n", entry->id, entry->name, PrintTimeString(entry->time).c_str());
270 template <
typename T,
typename ID>
271 std::string GenericMemoryMap<T,ID>::PrintAllEntriesHTML(
char* data) {
276 GenericMapHeader* header = (GenericMapHeader*)data;
278 entry = (T*) (data +
sizeof(GenericMapHeader) + header->bitFieldSize);
279 while ((uint32)((
char*)entry - data) < header->size) {
281 if (entry->status > 1)
282 str += utils::StringFormat(
"<tr><td>%u</td><td>%s</td><td>%s</td></tr>", entry->id, entry->name, PrintTimeString(entry->time).c_str());
284 str += utils::StringFormat(
"<tr><td>%**u</td><td>%s</td><td>%s</td></tr>\n", entry->id, entry->name, PrintTimeString(entry->time).c_str());
291 template <
typename T,
typename ID>
292 std::string GenericMemoryMap<T,ID>::ToXML(
char* data) {
297 GenericMapHeader* header = (GenericMapHeader*)data;
300 entry = (T*) (data +
sizeof(GenericMapHeader) + header->bitFieldSize);
301 while ((uint32)((
char*)entry - data) < header->size) {
303 str += entry->toXML();
308 std::string outerName = T::GetOuterXMLName();
310 return utils::StringFormat(
"<%s count=\"%u\" />\n", outerName.c_str(), count);
312 return utils::StringFormat(
"<%s count=\"%u\">\n%s</%s>\n", outerName.c_str(), count, str.c_str(), outerName.c_str());
315 template <
typename T,
typename ID>
316 bool GenericMemoryMap<T, ID>::WriteAllIDsToMsg(
const char* arrayname,
char* data, DataMessage* msg) {
320 GenericMapHeader* header = (GenericMapHeader*)data;
323 entry = (T*)(data +
sizeof(GenericMapHeader) + header->bitFieldSize);
324 while ((uint32)((
char*)entry - data) < header->size) {
326 if (!entry->writeIDToMsg(arrayname, n, msg))
336 template <
typename T,
typename ID>
337 bool GenericMemoryMap<T, ID>::WriteAllEntriesToMsg(
char* data, DataMessage* msg) {
341 GenericMapHeader* header = (GenericMapHeader*)data;
344 entry = (T*)(data +
sizeof(GenericMapHeader) + header->bitFieldSize);
345 while ((uint32)((
char*)entry - data) < header->size) {
347 if (!entry->writeToMsg(n, msg))
357 template <
typename T,
typename ID>
358 uint32 GenericMemoryMap<T,ID>::GetCount(
char* data) {
361 return ((GenericMapHeader*)data)->count;
364 template <
typename T,
typename ID>
365 uint32 GenericMemoryMap<T,ID>::GetUsage(
char* data) {
368 return ((GenericMapHeader*)data)->count *
sizeof(T);