/* =========================================================================== Copyright (C) 2025 the OpenMoHAA team This file is part of OpenMoHAA source code. OpenMoHAA source code 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. OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // containerclass.h: C++ Class Container for use with SafePtr #pragma once #include "class.h" #include "container.h" template class ContainerClass : public Class { Container value; public: ContainerClass(); ContainerClass(const Container& container); ContainerClass& operator=(const Container& container); ContainerClass(Container&& container); ContainerClass& operator=(Container&& container); ~ContainerClass() override; void Archive(Archiver& arc) override; int AddObject(const Type& obj); int AddUniqueObject(const Type& obj); void AddObjectAt(int index, const Type& obj); Type *AddressOfObjectAt(int index); void ClearObjectList(void); void FreeObjectList(void); int IndexOfObject(const Type& obj); void InsertObjectAt(int index, const Type& obj); int NumObjects(void) const; Type& ObjectAt(const size_t index) const; bool ObjectInList(const Type& obj); void RemoveObjectAt(int index); void RemoveObject(const Type& obj); void Reset(void); void Resize(int maxelements); void SetObjectAt(int index, const Type& obj); void Sort(int (*compare)(const void *elem1, const void *elem2)); Type& operator[](const int index) const; }; template ContainerClass::ContainerClass() {} template ContainerClass::ContainerClass(const Container& container) : value(container) {} template ContainerClass& ContainerClass::operator=(const Container& container) { value = container; return *this; } template ContainerClass::ContainerClass(Container&& container) : value(std::move(container)) {} template ContainerClass& ContainerClass::operator=(Container&& container) { value = std::move(container); return *this; } template ContainerClass::~ContainerClass() { value.FreeObjectList(); } template int ContainerClass::AddObject(const Type& obj) { return value.AddObject(obj); } template int ContainerClass::AddUniqueObject(const Type& obj) { return value.AddUniqueObject(obj); } template void ContainerClass::AddObjectAt(int index, const Type& obj) { return value.AddObjectAt(index, obj); } template Type *ContainerClass::AddressOfObjectAt(int index) { return value.AddressOfObjectAt(index); } template void ContainerClass::ClearObjectList(void) { return value.ClearObjectList(); } template void ContainerClass::FreeObjectList(void) { return value.FreeObjectList(); } template int ContainerClass::IndexOfObject(const Type& obj) { return value.IndexOfObject(obj); } template void ContainerClass::InsertObjectAt(int index, const Type& obj) { return value.InsertObjectAt(index, obj); } template int ContainerClass::NumObjects(void) const { return value.NumObjects(); } template Type& ContainerClass::ObjectAt(const size_t index) const { return value.ObjectAt(index); } template bool ContainerClass::ObjectInList(const Type& obj) { return value.ObjectInList(obj); } template void ContainerClass::RemoveObjectAt(int index) { return value.RemoveObjectAt(index); } template void ContainerClass::RemoveObject(const Type& obj) { return value.RemoveObject(obj); } template void ContainerClass::Reset(void) { return value.Reset(); } template void ContainerClass::Resize(int maxelements) { return value.Resize(maxelements); } template void ContainerClass::SetObjectAt(int index, const Type& obj) { return value.SetObjectAt(index, obj); } template void ContainerClass::Sort(int (*compare)(const void *elem1, const void *elem2)) { return value.Sort(compare); } template Type& ContainerClass::operator[](const int index) const { return value[index]; }