6 Copyright (C) 2003-2005 Kern Sibbald
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2 of
11 the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public
19 License along with this program; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23 Kern Sibbald, June MMIII
28 * There is a lot of extra casting here to work around the fact
29 * that some compilers (Sun and Visual C++) do not accept
30 * (void *) as an lvalue on the left side of an equal.
32 * Loop var through each member of list
34 #define foreach_alist(var, list) \
35 for((*((void **)&(var))=(void*)((list)->first())); \
37 (*((void **)&(var))=(void*)((list)->next())))
40 #define foreach_alist(var, list) \
41 for((void*(var))=(list)->first(); (var); (void *(var))=(list)->next(var)); )
45 /* Second arg of init */
47 owned_by_alist = true,
48 not_owned_by_alist = false
52 * Array list -- much like a simplified STL vector
53 * array of pointers to inserted items
55 class alist : public SMARTALLOC {
64 alist(int num = 1, bool own=true);
66 void init(int num = 1, bool own=true);
67 void append(void *item);
68 void prepend(void *item);
69 void *remove(int index);
76 void * operator [](int index) const;
81 /* Use it as a stack, pushing and poping from the end */
82 void push(void *item) { append(item); };
83 void pop() { num_items?NULL:remove(num_items-1); };
86 inline void * alist::operator [](int index) const {
87 if (index < 0 || index >= num_items) {
93 inline bool alist::empty() const
95 /* Check for null pointer */
96 return this ? num_items == 0 : true;
100 * This allows us to do explicit initialization,
101 * allowing us to mix C++ classes inside malloc'ed
102 * C structures. Define before called in constructor.
104 inline void alist::init(int num, bool own) {
113 inline alist::alist(int num, bool own) {
118 inline alist::~alist() {
124 /* Current size of list */
125 inline int alist::size() const
128 * Check for null pointer, which allows test
129 * on size to succeed even if nothing put in
132 return this ? num_items : 0;
135 /* How much to grow by each time */
136 inline void alist::grow(int num)