*/
/*
- Copyright (C) 2000-2003 Kern Sibbald and John Walker
+ Copyright (C) 2003-2004 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
*/
+/*
+ * There is a lot of extra casting here to work around the fact
+ * that some compilers (Sun and Visual C++) do not accept
+ * (void *) as an lvalue on the left side of an equal.
+ *
+ * Loop var through each member of list
+ */
+#define foreach_alist(var, list) \
+ for((*((void **)&(var))=(void*)((list)->first())); (var); (*((void **)&(var))=(void*)((list)->next())))
+
+#ifdef the_easy_way
+#define foreach_dlist(var, list) \
+ for((void*(var))=(list)->first(); (var); (void *(var))=(list)->next(var)); )
+#endif
+
+
/* Second arg of init */
enum {
owned_by_alist = true,
not_owned_by_alist = false
};
-
/*
* Array list -- much like a simplified STL vector
* array of pointers to inserted items
*/
-class alist {
+class alist : public SMARTALLOC {
void **items;
int num_items;
int max_items;
int num_grow;
+ int cur_item;
bool own_items;
+ void grow_list(void);
public:
alist(int num = 1, bool own=true);
void init(int num = 1, bool own=true);
void append(void *item);
+ void prepend(void *item);
+ void *remove(int index);
void *get(int index);
+ bool empty() const;
+ void *prev();
+ void *next();
+ void *first();
+ void *last();
void * operator [](int index) const;
- int size();
+ int size() const;
void destroy();
void grow(int num);
- void * operator new(size_t);
- void operator delete(void *);
};
inline void * alist::operator [](int index) const {
return items[index];
}
+inline bool alist::empty() const
+{
+ return num_items == 0;
+}
+
/*
* This allows us to do explicit initialization,
* allowing us to mix C++ classes inside malloc'ed
/* Current size of list */
-inline int alist::size()
+inline int alist::size() const
{
return num_items;
}
num_grow = num;
}
-inline void * alist::operator new(size_t)
-{
- return malloc(sizeof(alist));
-}
-inline void alist::operator delete(void *item)
-{
- ((alist *)item)->destroy();
- free(item);
-}