Path: blob/main/src/netedit/elements/GNEHierarchicalElement.h
193874 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GNEHierarchicalElement.h14/// @author Pablo Alvarez Lopez15/// @date Jul 202016///17// A abstract class for representation of hierarchical elements18/****************************************************************************/19#pragma once20#include <config.h>2122#include "GNEHierarchicalStructureParents.h"23#include "GNEHierarchicalStructureChildren.h"2425// ===========================================================================26// class definitions27// ===========================================================================2829class GNEHierarchicalElement {3031public:32/// @brief declare GNEChange_Children as friend class33friend class GNEChange_Children;34friend class GNEDemandElement;3536/// @brief default Constructor37GNEHierarchicalElement();3839/// @brief Destructor40~GNEHierarchicalElement();4142/// @brief clear hierarchical structure parents (used in GNE_Change)43void clearParents();4445/// @name get parent functions46/// @{4748/// @brief get parents container49const GNEHierarchicalStructureParents& getParents() const;5051/// @brief get parent junctions52const GNEHierarchicalContainerParents<GNEJunction*>& getParentJunctions() const;5354/// @brief get parent edges55const GNEHierarchicalContainerParents<GNEEdge*>& getParentEdges() const;5657/// @brief get parent lanes58const GNEHierarchicalContainerParents<GNELane*>& getParentLanes() const;5960/// @brief get parent additionals61const GNEHierarchicalContainerParents<GNEAdditional*>& getParentAdditionals() const;6263/// @brief get parent stoppingPlaces (used by plans)64const GNEHierarchicalContainerParents<GNEAdditional*> getParentStoppingPlaces() const;6566/// @brief get parent TAZs (used by plans)67const GNEHierarchicalContainerParents<GNEAdditional*> getParentTAZs() const;6869/// @brief get parent demand elements70const GNEHierarchicalContainerParents<GNEDemandElement*>& getParentDemandElements() const;7172/// @brief get parent demand elements73const GNEHierarchicalContainerParents<GNEGenericData*>& getParentGenericDatas() const;7475/// @}7677/// @name get children functions78/// @{7980/// @brief get child container81const GNEHierarchicalStructureChildren& getChildren() const;8283/// @brief get child junctions84const GNEHierarchicalContainerChildren<GNEJunction*>& getChildJunctions() const;8586/// @brief get child edges87const GNEHierarchicalContainerChildren<GNEEdge*>& getChildEdges() const;8889/// @brief get child lanes90const GNEHierarchicalContainerChildren<GNELane*>& getChildLanes() const;9192/// @brief return child additionals93const GNEHierarchicalContainerChildren<GNEAdditional*>& getChildAdditionals() const;9495/// @brief return child demand elements96const GNEHierarchicalContainerChildren<GNEDemandElement*>& getChildDemandElements() const;9798/// @brief return child generic data elements99const GNEHierarchicalContainerChildren<GNEGenericData*>& getChildGenericDatas() const;100101/// @brief return child TAZSourceSinks (Set)102const GNEHierarchicalContainerChildrenSet<GNETAZSourceSink*>& getChildTAZSourceSinks() const;103104/// @}105106/// @brief edit parent and childrens without maintain integrity (use carefully)107/// @{108109/// @brief set single parent element (ONLY use in constructors)110template<typename ParentType>111void setParent(ParentType parent) {112GNEHierarchicalContainerParents<ParentType> parents;113parents.push_back(parent);114myHierarchicalStructureParents.replaceAll(parents);115}116117/// @brief set multiple parent element (ONLY use in constructors)118template<typename ParentType>119void setParents(const GNEHierarchicalContainerParents<ParentType>& parents) {120myHierarchicalStructureParents.replaceAll(parents);121}122123/// @brief add child without updating parent (ONLY used if we're creating elements without undo-redo)124template<typename ChildType>125void addChildElement(ChildType* element) {126myHierarchicalStructureChildren.add(element);127}128129/// @brief Sort childrens130template<typename ChildType>131void sortChildren(std::vector<ChildType*> sortedChildrens) {132// remove elements and add again133for (auto child : sortedChildrens) {134myHierarchicalStructureChildren.remove(child);135}136for (auto child : sortedChildrens) {137myHierarchicalStructureChildren.add(child);138}139}140141/// @}142143/// @name edit function maintain integrity144/// @{145146/// @brief insert parent element147template<typename ElementType, typename ParentType>148static void insertParent(ElementType* element, ParentType* parent, const int index = -1) {149element->myHierarchicalStructureParents.add(parent, index);150parent->myHierarchicalStructureChildren.add(element);151}152153/// @brief remove parent element154template<typename ElementType, typename ParentType>155static void removeParent(ElementType* element, ParentType* parent) {156element->myHierarchicalStructureParents.remove(parent);157parent->myHierarchicalStructureChildren.remove(element);158}159160/// @brief update single parent element161template<typename ElementType, typename ParentType>162static void updateParent(ElementType element, const int index, ParentType newParent) {163// remove element from old parent164auto oldParent = element->myHierarchicalStructureParents.template at<ParentType>(index);165oldParent->myHierarchicalStructureChildren.remove(element);166// update parent167element->myHierarchicalStructureParents.replaceSingle(index, newParent);168// insert child in new parent169newParent->myHierarchicalStructureChildren.add(element);170}171172/// @brief update all parent elements173template<typename ElementType, typename ParentType>174static void updateParents(ElementType element, GNEHierarchicalContainerParents<ParentType> newParents) {175// remove children176for (const auto parent : element->myHierarchicalStructureParents.template get<ParentType>()) {177parent->myHierarchicalStructureChildren.remove(element);178}179// update parents180element->myHierarchicalStructureParents.replaceAll(newParents);181// restore children182for (const auto parent : element->myHierarchicalStructureParents.template get<ParentType>()) {183parent->myHierarchicalStructureChildren.add(element);184}185}186187/// @brief insert child element188template<typename ElementType, typename ChildType>189static void insertChild(ElementType element, ChildType child) {190element->myHierarchicalStructureChildren.add(child);191child->myHierarchicalStructureParents.add(element);192}193194/// @brief remove child element195template<typename ElementType, typename ChildType>196static void removeChild(ElementType element, ChildType child) {197element->myHierarchicalStructureChildren.remove(child);198child->myHierarchicalStructureParents.remove(element);199}200201/// @brief update all children elements202template<typename ElementType, typename ChildType>203static void updateChildren(ElementType element, GNEHierarchicalContainerChildren<ChildType> newChildren) {204// remove children205for (const auto children : element->myHierarchicalStructureChildren.template get<ChildType>()) {206children->myHierarchicalStructureParents.remove(element);207}208// update children209element->myHierarchicalStructureChildren.replaceAll(newChildren);210// restore children211for (const auto children : element->myHierarchicalStructureChildren.template get<ChildType>()) {212children->myHierarchicalStructureParents.add(element);213}214}215216/// @}217218/// @name specific get functions219/// @{220221/// @brief if use edge/parent lanes as a list of consecutive elements, obtain a list of IDs of elements after insert a new element222std::string getNewListOfParents(const GNENetworkElement* currentElement, const GNENetworkElement* newNextElement) const;223224/// @}225226private:227/// @brief hierarchical structure with parents228GNEHierarchicalStructureParents myHierarchicalStructureParents;229230/// @brief hierarchical structure with children231GNEHierarchicalStructureChildren myHierarchicalStructureChildren;232233/// @brief Invalidated copy constructor.234GNEHierarchicalElement(const GNEHierarchicalElement&) = delete;235};236237238