/* * This file is a part of morm * and is distributed under the 2-Clause BSD licence. * Author: Tomasz Sowa */ /* * Copyright (c) 2021, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #ifndef headerfile_morm_src_modelcontainerwrapper #define headerfile_morm_src_modelcontainerwrapper #include #include #include #include "baseobjectwrapper.h" namespace morm { class Model; class ModelContainerWrapper : public BaseObjectWrapper { public: virtual Model * get_model() { return nullptr; } virtual bool is_container_empty() { return true; } virtual void increment_iterator() { } virtual bool is_iterator_correct() { return false; } virtual void set_iterator_at_first_model() { } }; template class ModelWrapperBaseContainer : public ModelContainerWrapper { public: ModelWrapperBaseContainer(ContainerType * container) { this->container = container; iterator = container->end(); } bool is_container_empty() { return container->empty(); } void increment_iterator() { if( iterator == container->end() ) { iterator = container->begin(); } else { ++iterator; } } bool is_iterator_correct() { return iterator != container->end(); } void set_iterator_at_first_model() { iterator = container->begin(); } protected: ContainerType * container; typename ContainerType::iterator iterator; }; template class ModelWrapperVector : public ModelWrapperBaseContainer> { public: using ModelWrapperBaseContainer>::container; using ModelWrapperBaseContainer>::iterator; ModelWrapperVector(std::vector * container) : ModelWrapperBaseContainer>(container) { } Model * get_model() { if( iterator != container->end() ) { return &(*iterator); } return nullptr; } }; template class ModelWrapperVectorPointer : public ModelWrapperBaseContainer> { public: using ModelWrapperBaseContainer>::container; using ModelWrapperBaseContainer>::iterator; ModelWrapperVectorPointer(std::vector * container) : ModelWrapperBaseContainer>(container) { } Model * get_model() { if( iterator != container->end() ) { return (*iterator); } return nullptr; } }; template class ModelWrapperList : public ModelWrapperBaseContainer> { public: using ModelWrapperBaseContainer>::container; using ModelWrapperBaseContainer>::iterator; ModelWrapperList(std::list * container): ModelWrapperBaseContainer>(container) { } Model * get_model() { if( iterator != container->end() ) { return &(*iterator); } return nullptr; } }; template class ModelWrapperListPointer : public ModelWrapperBaseContainer> { public: using ModelWrapperBaseContainer>::container; using ModelWrapperBaseContainer>::iterator; ModelWrapperListPointer(std::list * container): ModelWrapperBaseContainer>(container) { } Model * get_model() { if( iterator != container->end() ) { return (*iterator); } return nullptr; } }; } #endif