/******************************************************************************** * * * P o i n t e r L i s t * * * ********************************************************************************* * Copyright (C) 1997,2024 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This library 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 Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this program. If not, see * ********************************************************************************/ #ifndef FXPTRLIST_H #define FXPTRLIST_H namespace FX { /// List of void pointers class FXAPI FXPtrList { protected: FXptr* ptr; public: /// Default constructor FXPtrList(); /// Copy constructor FXPtrList(const FXPtrList& other); /// Construct and init with single object FXPtrList(FXptr object); /// Construct and init with n copies of object FXPtrList(FXptr object,FXival n); /// Construct and init with list of objects FXPtrList(FXptr* objects,FXival n); /// Assignment operator FXPtrList& operator=(const FXPtrList& other); /// Adopt objects from other, leaving other empty FXPtrList& adopt(FXPtrList& other); /// Return number of objects FXival no() const { return *((FXival*)(ptr-1)); } /// Set number of objects FXbool no(FXival num); /// Indexing operator FXptr& operator[](FXival i){ return ptr[i]; } FXptr const& operator[](FXival i) const { return ptr[i]; } /// Indexing operator FXptr& at(FXival i){ return ptr[i]; } FXptr const& at(FXival i) const { return ptr[i]; } /// First element in list FXptr& head(){ return ptr[0]; } FXptr const& head() const { return ptr[0]; } /// Last element in list FXptr& tail(){ return ptr[no()-1]; } FXptr const& tail() const { return ptr[no()-1]; } /// Access to content array FXptr* data(){ return ptr; } const FXptr* data() const { return ptr; } /// Find object in list, searching forward; return position or -1 FXival find(FXptr object,FXival pos=0) const; /// Find object in list, searching backward; return position or -1 FXival rfind(FXptr object,FXival pos=2147483647) const; /// Assign object to list FXbool assign(FXptr object); /// Assign n copies of object to list FXbool assign(FXptr object,FXival n); /// Assign n objects to list FXbool assign(FXptr* objects,FXival n); /// Assign objects to list FXbool assign(const FXPtrList& objects); /// Insert object at certain position FXbool insert(FXival pos,FXptr object); /// Insert n copies of object at specified position FXbool insert(FXival pos,FXptr object,FXival n); /// Insert n objects at specified position FXbool insert(FXival pos,FXptr* objects,FXival n); /// Insert objects at specified position FXbool insert(FXival pos,const FXPtrList& objects); /// Prepend object FXbool prepend(FXptr object); /// Prepend n copies of object FXbool prepend(FXptr object,FXival n); /// Prepend n objects FXbool prepend(FXptr* objects,FXival n); /// Prepend objects FXbool prepend(const FXPtrList& objects); /// Append object FXbool append(FXptr object); /// Append n copies of object FXbool append(FXptr object,FXival n); /// Append n objects FXbool append(FXptr* objects,FXival n); /// Append objects FXbool append(const FXPtrList& objects); /// Replace object at position by given object FXbool replace(FXival pos,FXptr object); /// Replaces the m objects at pos with n copies of object FXbool replace(FXival pos,FXival m,FXptr object,FXival n); /// Replaces the m objects at pos with n objects FXbool replace(FXival pos,FXival m,FXptr* objects,FXival n); /// Replace the m objects at pos with objects FXbool replace(FXival pos,FXival m,const FXPtrList& objects); /// Remove object at pos FXbool erase(FXival pos); /// Remove n objects at pos FXbool erase(FXival pos,FXival n); /// Remove object FXbool remove(FXptr object); /// Push object to end FXbool push(FXptr object); /// Pop object from end FXbool pop(); /// Remove all objects FXbool clear(); /// Destructor ~FXPtrList(); }; /// List to pointers to TYPE template class FXPtrListOf : public FXPtrList { public: /// Default constructor FXPtrListOf(){} /// Copy constructor FXPtrListOf(const FXPtrListOf& src):FXPtrList(src){ } /// Construct and init with single object FXPtrListOf(TYPE* object):FXPtrList(object){ } /// Construct and init with n copies of object FXPtrListOf(TYPE* object,FXival n):FXPtrList(object,n){ } /// Construct and init with list of objects FXPtrListOf(TYPE** objects,FXival n):FXPtrList(objects,n){ } /// Assignment operator FXPtrListOf& operator=(const FXPtrListOf& src){ return reinterpret_cast&>(FXPtrList::operator=(src)); } /// Adopt objects from orig, leaving orig empty FXPtrListOf& adopt(FXPtrListOf& src){ return reinterpret_cast&>(FXPtrList::adopt(src)); } /// Indexing operator TYPE*& operator[](FXival i){ return reinterpret_cast(ptr[i]); } TYPE *const& operator[](FXival i) const { return reinterpret_cast(ptr[i]); } /// Indexing operator TYPE*& at(FXival i){ return reinterpret_cast(ptr[i]); } TYPE *const& at(FXival i) const { return reinterpret_cast(ptr[i]); } /// First element in list TYPE*& head(){ return reinterpret_cast(ptr[0]); } TYPE* const& head() const { return reinterpret_cast(ptr[0]); } /// Last element in list TYPE*& tail(){ return reinterpret_cast(ptr[no()-1]); } TYPE* const& tail() const { return reinterpret_cast(ptr[no()-1]); } /// Access to content array TYPE** data(){ return reinterpret_cast(ptr); } TYPE *const * data() const { return reinterpret_cast(ptr); } /// Find object in list, searching forward; return position or -1 FXival find(TYPE* object,FXival pos=0) const { return FXPtrList::find(object,pos); } /// Find object in list, searching backward; return position or -1 FXival rfind(TYPE* object,FXival pos=2147483647) const { return FXPtrList::rfind(object,pos); } /// Assign object to list FXbool assign(TYPE* object){ return FXPtrList::assign(object); } /// Assign n copies of object to list FXbool assign(TYPE* object,FXival n){ return FXPtrList::assign(object,n); } /// Assign n objects to list FXbool assign(TYPE** objects,FXival n){ return FXPtrList::assign(objects,n); } /// Assign objects to list FXbool assign(const FXPtrListOf& objects){ return FXPtrList::assign(objects); } /// Insert object at certain position FXbool insert(FXival pos,TYPE* object){ return FXPtrList::insert(pos,object); } /// Insert n copies of object at specified position FXbool insert(FXival pos,TYPE* object,FXival n){ return FXPtrList::insert(pos,object,n); } /// Insert n objects at specified position FXbool insert(FXival pos,TYPE** objects,FXival n){ return FXPtrList::insert(pos,objects,n); } /// Insert objects at specified position FXbool insert(FXival pos,const FXPtrListOf& objects){ return FXPtrList::insert(pos,objects); } /// Prepend object FXbool prepend(TYPE* object){ return FXPtrList::prepend(object); } /// Prepend n copies of object FXbool prepend(TYPE* object,FXival n){ return FXPtrList::prepend(object,n); } /// Prepend n objects FXbool prepend(TYPE** objects,FXival n){ return FXPtrList::prepend(objects,n); } /// Prepend objects FXbool prepend(const FXPtrListOf& objects){ return FXPtrList::prepend(objects); } /// Append object FXbool append(TYPE* object){ return FXPtrList::append(object); } /// Append n copies of object FXbool append(TYPE* object,FXival n){ return FXPtrList::append(object,n); } /// Append n objects FXbool append(TYPE** objects,FXival n){ return FXPtrList::append(objects,n); } /// Append objects FXbool append(const FXPtrListOf& objects){ return FXPtrList::append(objects); } /// Replace object at position by given object FXbool replace(FXival pos,TYPE* object){ return FXPtrList::replace(pos,object); } /// Replaces the m objects at pos with n copies of object FXbool replace(FXival pos,FXival m,TYPE* object,FXival n){ return FXPtrList::replace(pos,m,object,n); } /// Replaces the m objects at pos with n objects FXbool replace(FXival pos,FXival m,TYPE** objects,FXival n){ return FXPtrList::replace(pos,m,objects,n); } /// Replace the m objects at pos with objects FXbool replace(FXival pos,FXival m,const FXPtrListOf& objects){ return FXPtrList::replace(pos,m,objects); } /// Remove object FXbool remove(TYPE* object){ return FXPtrList::remove(object); } /// Push object to end FXbool push(TYPE* object){ return FXPtrList::push(object); } }; } #endif