X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Falist.h;h=7c0d104bc9e939a75e76f905614b64adf2d03d32;hb=4132c9f33642f579d89700f36caced609d374d51;hp=c65a17fbb79f04740067195f8806f9de71d1269c;hpb=ca48808928afdfa126564c721c40a294cb0c2488;p=bacula%2Fbacula diff --git a/bacula/src/lib/alist.h b/bacula/src/lib/alist.h index c65a17fbb7..7c0d104bc9 100644 --- a/bacula/src/lib/alist.h +++ b/bacula/src/lib/alist.h @@ -1,56 +1,65 @@ /* - * Version $Id$ - */ + Bacula® - The Network Backup Solution -/* - Copyright (C) 2003-2004 Kern Sibbald and John Walker + Copyright (C) 2003-2010 Free Software Foundation Europe e.V. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version three of the GNU Affero General Public + License as published by the Free Software Foundation and included + in the file LICENSE. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public - License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. - - Kern Sibbald, June MMIII + You should have received a copy of the GNU Affero General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ +/* + * Kern Sibbald, June MMIII */ -/* + +/* * 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 */ +#ifdef HAVE_TYPEOF #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)); ) + for((var)=(typeof(var))(list)->first(); (var); (var)=(typeof(var))(list)->next() ) +#else +#define foreach_alist(var, list) \ + for((*((void **)&(var))=(void*)((list)->first())); \ + (var); \ + (*((void **)&(var))=(void*)((list)->next()))) #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; @@ -60,6 +69,7 @@ class alist { void grow_list(void); public: alist(int num = 1, bool own=true); + ~alist(); void init(int num = 1, bool own=true); void append(void *item); void prepend(void *item); @@ -74,8 +84,10 @@ public: int size() const; void destroy(); void grow(int num); - void * operator new(size_t); - void operator delete(void *); + + /* Use it as a stack, pushing and poping from the end */ + void push(void *item) { append(item); }; + void *pop() { return remove(num_items-1); }; }; inline void * alist::operator [](int index) const { @@ -87,10 +99,11 @@ inline void * alist::operator [](int index) const { inline bool alist::empty() const { - return num_items == 0; + /* Check for null pointer */ + return this ? num_items == 0 : true; } -/* +/* * This allows us to do explicit initialization, * allowing us to mix C++ classes inside malloc'ed * C structures. Define before called in constructor. @@ -105,31 +118,29 @@ inline void alist::init(int num, bool own) { /* Constructor */ inline alist::alist(int num, bool own) { - this->init(num, own); + init(num, own); +} + +/* Destructor */ +inline alist::~alist() { + destroy(); } - + /* Current size of list */ -inline int alist::size() const +inline int alist::size() const { - return num_items; + /* + * Check for null pointer, which allows test + * on size to succeed even if nothing put in + * alist. + */ + return this ? num_items : 0; } /* How much to grow by each time */ -inline void alist::grow(int num) +inline void alist::grow(int num) { 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); -} -