/******************************************************************************** * * * O b j e c t 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 FXOBJECTLIST_H #define FXOBJECTLIST_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /// List of pointers to objects class FXAPI FXObjectList { protected: FXObject **ptr; public: /// Default constructor FXObjectList(); /// Copy constructor FXObjectList(const FXObjectList& other); /// Construct and init with single object FXObjectList(FXObject* object); /// Construct and init with n copies of object FXObjectList(FXObject* object,FXival n); /// Construct and init with list of objects FXObjectList(FXObject** objects,FXival n); /// Assignment operator FXObjectList& operator=(const FXObjectList& other); /// Adopt objects from other, leaving other empty FXObjectList& adopt(FXObjectList& other); /// Return number of objects FXival no() const { return *((FXival*)(ptr-1)); } /// Set number of objects FXbool no(FXival num); /// Indexing operator FXObject*& operator[](FXival i){ return ptr[i]; } FXObject* const& operator[](FXival i) const { return ptr[i]; } /// Indexing operator FXObject*& at(FXival i){ return ptr[i]; } FXObject* const& at(FXival i) const { return ptr[i]; } /// First element in list FXObject*& head(){ return ptr[0]; } FXObject* const& head() const { return ptr[0]; } /// Last element in list FXObject*& tail(){ return ptr[no()-1]; } FXObject* const& tail() const { return ptr[no()-1]; } /// Access to content array FXObject** data(){ return ptr; } FXObject *const * data() const { return ptr; } /// Find object in list, searching forward; return position or -1 FXival find(const FXObject *object,FXival pos=0) const; /// Find object in list, searching backward; return position or -1 FXival rfind(const FXObject *object,FXival pos=2147483647) const; /// Assign object to list FXbool assign(FXObject* object); /// Assign n copies of object to list FXbool assign(FXObject* object,FXival n); /// Assign n objects to list FXbool assign(FXObject** objects,FXival n); /// Assign objects to list FXbool assign(const FXObjectList& objects); /// Insert object at certain position FXbool insert(FXival pos,FXObject* object); /// Insert n copies of object at specified position FXbool insert(FXival pos,FXObject* object,FXival n); /// Insert n objects at specified position FXbool insert(FXival pos,FXObject** objects,FXival n); /// Insert objects at specified position FXbool insert(FXival pos,const FXObjectList& objects); /// Prepend object FXbool prepend(FXObject* object); /// Prepend n copies of object FXbool prepend(FXObject* object,FXival n); /// Prepend n objects FXbool prepend(FXObject** objects,FXival n); /// Prepend objects FXbool prepend(const FXObjectList& objects); /// Append object FXbool append(FXObject* object); /// Append n copies of object FXbool append(FXObject* object,FXival n); /// Append n objects FXbool append(FXObject** objects,FXival n); /// Append objects FXbool append(const FXObjectList& objects); /// Replace object at position by given object FXbool replace(FXival pos,FXObject* object); /// Replaces the m objects at pos with n copies of object FXbool replace(FXival pos,FXival m,FXObject* object,FXival n); /// Replaces the m objects at pos with n objects FXbool replace(FXival pos,FXival m,FXObject** objects,FXival n); /// Replace the m objects at pos with objects FXbool replace(FXival pos,FXival m,const FXObjectList& objects); /// Remove object at pos FXbool erase(FXival pos); /// Remove n objects at pos FXbool erase(FXival pos,FXival n); /// Remove object FXbool remove(const FXObject* object); /// Push object to end FXbool push(FXObject* object); /// Pop object from end FXbool pop(); /// Remove all objects FXbool clear(); /// Save to a stream void save(FXStream& store) const; /// Load from a stream void load(FXStream& store); /// Destructor ~FXObjectList(); }; /// List to pointers to objects of TYPE template class FXObjectListOf : public FXObjectList { public: /// Default constructor FXObjectListOf(){} /// Copy constructor FXObjectListOf(const FXObjectListOf& src):FXObjectList(src){ } /// Construct and init with single object FXObjectListOf(TYPE* object):FXObjectList(object){ } /// Construct and init with n copies of object FXObjectListOf(TYPE* object,FXival n):FXObjectList(object,n){ } /// Construct and init with list of objects FXObjectListOf(TYPE** objects,FXival n):FXObjectList(objects,n){ } /// Assignment operator FXObjectListOf& operator=(const FXObjectListOf& orig){ return reinterpret_cast&>(FXObjectList::operator=(orig)); } /// Adopt objects from src, leaving src empty FXObjectListOf& adopt(FXObjectListOf& src){ return reinterpret_cast&>(FXObjectList::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 FXObjectList::find(object,pos); } /// Find object in list, searching backward; return position or -1 FXival rfind(TYPE* object,FXival pos=2147483647) const { return FXObjectList::rfind(object,pos); } /// Assign object to list FXbool assign(TYPE* object){ return FXObjectList::assign(object); } /// Assign n copies of object to list FXbool assign(TYPE* object,FXival n){ return FXObjectList::assign(object,n); } /// Assign n objects to list FXbool assign(TYPE** objects,FXival n){ return FXObjectList::assign(objects,n); } /// Assign objects to list FXbool assign(const FXObjectListOf& objects){ return FXObjectList::assign(objects); } /// Insert object at certain position FXbool insert(FXival pos,TYPE* object){ return FXObjectList::insert(pos,object); } /// Insert n copies of object at specified position FXbool insert(FXival pos,TYPE* object,FXival n){ return FXObjectList::insert(pos,object,n); } /// Insert n objects at specified position FXbool insert(FXival pos,TYPE** objects,FXival n){ return FXObjectList::insert(pos,objects,n); } /// Insert objects at specified position FXbool insert(FXival pos,const FXObjectListOf& objects){ return FXObjectList::insert(pos,objects); } /// Prepend object FXbool prepend(TYPE* object){ return FXObjectList::prepend(object); } /// Prepend n copies of object FXbool prepend(TYPE* object,FXival n){ return FXObjectList::prepend(object,n); } /// Prepend n objects FXbool prepend(TYPE** objects,FXival n){ return FXObjectList::prepend(objects,n); } /// Prepend objects FXbool prepend(const FXObjectListOf& objects){ return FXObjectList::prepend(objects); } /// Append object FXbool append(TYPE* object){ return FXObjectList::append(object); } /// Append n copies of object FXbool append(TYPE* object,FXival n){ return FXObjectList::append(object,n); } /// Append n objects FXbool append(TYPE** objects,FXival n){ return FXObjectList::append(objects,n); } /// Append objects FXbool append(const FXObjectListOf& objects){ return FXObjectList::append(objects); } /// Replace object at position by given object FXbool replace(FXival pos,TYPE* object){ return FXObjectList::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 FXObjectList::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 FXObjectList::replace(pos,m,objects,n); } /// Replace the m objects at pos with objects FXbool replace(FXival pos,FXival m,const FXObjectListOf& objects){ return FXObjectList::replace(pos,m,objects); } /// Remove object FXbool remove(TYPE* object){ return FXObjectList::remove(object); } /// Push object to end FXbool push(TYPE* object){ return FXObjectList::push(object); } }; } #endif