|
From: <mrv...@us...> - 2007-06-02 05:24:15
|
Revision: 22
http://svn.sourceforge.net/dawnofinfinity/?rev=22&view=rev
Author: mrvacbob
Date: 2007-06-01 22:24:14 -0700 (Fri, 01 Jun 2007)
Log Message:
-----------
template for Set too
Modified Paths:
--------------
trunk/queue.h
trunk/set.h
trunk/tests.cpp
Modified: trunk/queue.h
===================================================================
--- trunk/queue.h 2007-06-02 05:04:30 UTC (rev 21)
+++ trunk/queue.h 2007-06-02 05:24:14 UTC (rev 22)
@@ -38,7 +38,7 @@
while(_inq_i != _inq2->end) {\
const type varname = _inq2->data[_inq_i];_inq2->clear(_inq_i++);
-#define PQPERFORM_START(_inq, varname) QPERFORM_START_(_inq, void *, varname)
+#define PQPERFORM_START(_inq, varname) QPERFORM_START(_inq, void *, varname)
#define QPERFORM_END() \
if (_inq_i == _inq2->allocated) _inq_i = 0;\
@@ -115,6 +115,6 @@
}
};
-typedef Queue<void *> PQueue;
+typedef Queue<const void *> PQueue;
#endif
Modified: trunk/set.h
===================================================================
--- trunk/set.h 2007-06-02 05:04:30 UTC (rev 21)
+++ trunk/set.h 2007-06-02 05:24:14 UTC (rev 22)
@@ -32,61 +32,66 @@
#include "utils.h"
/// Set equivalent of QPERFORM
-#define SETPERFORM_START(_inset, varname) \
+#define SETPERFORM_START(_inset, type, varname) \
{\
- Set *_ins2 = _inset;\
- for (unsigned int _set_i = 0;_set_i<_ins2->filled;) {\
- const void *varname = _ins2->data[_set_i++]; \
+ Set<type> *_ins2 = (Set<type> *)_inset;\
+ for (size_t _set_i = 0;_set_i<_ins2->filled;) {\
+ const type varname = _ins2->data[_set_i++]; \
/// A hack to allow the same block of code to operate on two sets without code duplication.
-#define TWOSETSPERFORM_START(_inset, _inset2, varname) \
+#define TWOSETSPERFORM_START(_inset, _inset2, type, varname) \
{\
- Set *_ins2 = _inset, *_ins22 = _inset2;\
- for (unsigned int _set_i = 0;;) {\
+ Set<type> *_ins2 = (Set<type> *)_inset, *_ins22 = (Set<type> *)_inset2;\
+ for (size_t _set_i = 0;;) {\
if (_set_i>=_ins2->filled) {if (_ins2 == _ins22) break; _ins2 = _ins22; _set_i = 0; continue;}\
const void *varname = _ins2->data[_set_i++];\
+#define PSETPERFORM_START(_inset, varname) SETPERFORM_START(_inset, void *, varname)
+#define TWOPSETSPERFORM_START(_inset, _inset2, varname) SETPERFORM_START(_inset, _inset2, void *, varname)
+
#define SETPERFORM_END() \
}\
}
/// Remove the current set member from the set, used inside setperform.
#define SETPERFORM_REMOVETHIS() \
-{_ins2->filled--; if (_set_i != _ins2->filled) _ins2->data[_set_i] = _ins2->data[_ins2->filled]; _ins2->data[_ins2->filled]=NULL; _set_i--;}
+{_ins2->filled--; if (_set_i != _ins2->filled) _ins2->data[_set_i] = _ins2->data[_ins2->filled]; _ins2->clear(_ins2->filled); _set_i--;}
/// Unordered set
+template<typename T>
struct Set : public Object
{
- const void **data;
+ T *data;
size_t allocated, filled;
Set(size_t defaultsize = 32) : allocated(defaultsize), filled(0)
{
- size_t s = sizeof(void *[allocated]);
- data = (const void**)GC_malloc(s);
+ size_t s = sizeof(T[allocated]);
+ data = (T*)GC_malloc(s);
memset(data,0,s);
}
~Set () {data = NULL;}
- void add(const void *p) {
+ void clear(size_t i) {memset(&data[i], 0, sizeof(T));}
+
+ void add(const T &p) {
if (allocated == filled) grow();
data[filled++] = p;
}
- void remove(const void *p) {
+ void remove(const T &p) {
for (size_t i = 0; i < filled; i++) {
if (data[i] == p) {
data[i] = data[filled];
- data[filled] = NULL;
- filled--;
+ clear(filled--);
break;
}
}
}
- bool contains(const void *p) {
+ bool contains(const T &p) {
for (size_t i = 0; i < filled; i++) {
if (data[i] == p) return true;
}
@@ -95,11 +100,12 @@
void grow() {
size_t newsize = allocated + 16;
- data = (const void**)GC_realloc(data, sizeof(void *[newsize]));
- memset(&data[allocated],0,sizeof(void*[16]));
+ data = (T*)GC_realloc(data, sizeof(T[newsize]));
+ memset(&data[allocated],0,sizeof(T[newsize - allocated]));
allocated = newsize;
}
};
+typedef Set<const void *> PSet;
#endif
Modified: trunk/tests.cpp
===================================================================
--- trunk/tests.cpp 2007-06-02 05:04:30 UTC (rev 21)
+++ trunk/tests.cpp 2007-06-02 05:24:14 UTC (rev 22)
@@ -4,7 +4,7 @@
void test_set()
{
- Set s;
+ PSet s;
const char *a="a",*b="b",*c="c";
s.add(a);
s.add(b);
@@ -14,7 +14,7 @@
printf("%d ",s.contains(0)); //1
s.remove(a);
printf("%d ",s.contains(a)); //0
- SETPERFORM_START(&s, i);
+ PSETPERFORM_START(&s, i);
if (i == 0) SETPERFORM_REMOVETHIS();
SETPERFORM_END();
printf("%d\n",s.contains(0)); //0
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|