00e5e772d1
* NEW: Replace the previously removed symbolic links by the real source files. git-svn-id: svn://localhost/gambas/trunk@2685 867c0c6c-44f3-4631-809d-bfa615b0a4ec
111 lines
3.0 KiB
C++
111 lines
3.0 KiB
C++
/***************************************************************************
|
|
|
|
garray.h
|
|
|
|
(c) 2000-2009 Benoît Minisini <gambas@users.sourceforge.net>
|
|
|
|
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, or (at your option)
|
|
any later version.
|
|
|
|
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
***************************************************************************/
|
|
|
|
#ifndef __GARRAY_H
|
|
#define __GARRAY_H
|
|
|
|
#include "gb_common.h"
|
|
#include "gambas.h"
|
|
|
|
extern "C" GB_INTERFACE GB;
|
|
|
|
class GArrayImpl
|
|
{
|
|
protected:
|
|
void **array;
|
|
bool autoDelete;
|
|
uint pos;
|
|
|
|
public:
|
|
GArrayImpl() { GB.NewArray((void **)(void *)&array, sizeof(void *), 0); autoDelete = false; }
|
|
~GArrayImpl() { GB.FreeArray((void **)(void *)&array); }
|
|
|
|
uint count() const { return GB.Count(array); }
|
|
void setAutoDelete(bool a) { autoDelete = a; }
|
|
void *last() const { return count() ? array[count() - 1] : 0; }
|
|
void append(const void *d) { *((const void **)GB.Add((void **)(void *)&array)) = d; }
|
|
void clear();
|
|
void *take();
|
|
void *at(uint i) const { return array[i]; }
|
|
void insert(uint i, const void *d);
|
|
void remove(uint i);
|
|
int find(const void *d);
|
|
void *first() { pos = 0; return next(); }
|
|
void *next() { return (pos >= count()) ? 0 : array[pos++]; }
|
|
};
|
|
|
|
template<class type>
|
|
class GArray : GArrayImpl
|
|
{
|
|
public:
|
|
GArray() {}
|
|
~GArray() { clear(); }
|
|
|
|
uint count() const { return GArrayImpl::count(); }
|
|
bool isEmpty() const { return GArrayImpl::count() == 0; }
|
|
void setAutoDelete(bool a) { GArrayImpl::setAutoDelete(a); }
|
|
type *last() const { return (type *)GArrayImpl::last(); }
|
|
void append(const type *d) { GArrayImpl::append(d); }
|
|
|
|
void clear();
|
|
type *take() { return (type *)GArrayImpl::take(); }
|
|
type *at(uint i) const { return (type *)GArrayImpl::at(i); }
|
|
void insert(uint i, const type *d) { GArrayImpl::insert(i, d); }
|
|
void remove(uint i);
|
|
int find(const type *d) { return GArrayImpl::find(d); }
|
|
void removeRef(const type *d);
|
|
|
|
type *first() { return (type *)GArrayImpl::first(); }
|
|
type *next() { return (type *)GArrayImpl::next(); }
|
|
};
|
|
|
|
|
|
template <class type> inline void GArray<type>::clear()
|
|
{
|
|
if (autoDelete)
|
|
{
|
|
for (uint i = 0; i < count(); i++)
|
|
delete (type *)array[i];
|
|
}
|
|
|
|
GArrayImpl::clear();
|
|
}
|
|
|
|
template <class type> inline void GArray<type>::remove(uint i)
|
|
{
|
|
if (autoDelete)
|
|
delete (type *)array[i];
|
|
|
|
GArrayImpl::remove(i);
|
|
}
|
|
|
|
|
|
template <class type> inline void GArray<type>::removeRef(const type *d)
|
|
{
|
|
int i = find(d);
|
|
if (i >= 0)
|
|
remove((uint )i);
|
|
}
|
|
|
|
|
|
#endif
|