#ifdef the_old_way
#define foreach_dlist(var, list) \
- for((var)=NULL; (((void *)(var))=(list)->next(var)); )
+ for((var)=NULL; (((void *)(var))=(list)->next(var)); )
#endif
struct dlink {
class dlist {
void *head;
void *tail;
- int loffset;
- int num_items;
+ uint16_t loffset;
+ uint32_t num_items;
public:
dlist(void *item, void *link);
+ dlist(void);
+ ~dlist() { destroy(); }
void init(void *item, void *link);
void prepend(void *item);
void append(void *item);
void insert_before(void *item, void *where);
void insert_after(void *item, void *where);
- void *dlist::binary_insert(void *item, int compare(void *item1, void *item2));
+ void *unique_binary_insert(void *item, int compare(void *item1, void *item2));
+ void binary_insert(void *item, int compare(void *item1, void *item2));
void remove(void *item);
bool empty();
- int size();
+ int size();
void *next(void *item);
void *prev(void *item);
void destroy();
void operator delete(void *);
};
-/*
+/*
* This allows us to do explicit initialization,
* allowing us to mix C++ classes inside malloc'ed
* C structures. Define before called in constructor.
this->init(item, link);
}
+inline dlist::dlist(void)
+{
+ memset(this, 0, sizeof(dlist));
+}
+
inline bool dlist::empty()
{
return head == NULL;