Path: blob/main/src/netedit/elements/GNEHierarchicalElement.h
169678 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 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/// @}130131/// @name edit function maintain integrity132/// @{133134/// @brief insert parent element135template<typename ElementType, typename ParentType>136static void insertParent(ElementType* element, ParentType* parent, const int index = -1) {137element->myHierarchicalStructureParents.add(parent, index);138parent->myHierarchicalStructureChildren.add(element);139}140141/// @brief remove parent element142template<typename ElementType, typename ParentType>143static void removeParent(ElementType* element, ParentType* parent) {144element->myHierarchicalStructureParents.remove(parent);145parent->myHierarchicalStructureChildren.remove(element);146}147148/// @brief update single parent element149template<typename ElementType, typename ParentType>150static void updateParent(ElementType element, const int index, ParentType newParent) {151// remove element from old parent152auto oldParent = element->myHierarchicalStructureParents.template at<ParentType>(index);153oldParent->myHierarchicalStructureChildren.remove(element);154// update parent155element->myHierarchicalStructureParents.replaceSingle(index, newParent);156// insert child in new parent157newParent->myHierarchicalStructureChildren.add(element);158}159160/// @brief update all parent elements161template<typename ElementType, typename ParentType>162static void updateParents(ElementType element, GNEHierarchicalContainerParents<ParentType> newParents) {163// remove children164for (const auto parent : element->myHierarchicalStructureParents.template get<ParentType>()) {165parent->myHierarchicalStructureChildren.remove(element);166}167// update parents168element->myHierarchicalStructureParents.replaceAll(newParents);169// restore children170for (const auto parent : element->myHierarchicalStructureParents.template get<ParentType>()) {171parent->myHierarchicalStructureChildren.add(element);172}173}174175/// @brief insert child element176template<typename ElementType, typename ChildType>177static void insertChild(ElementType element, ChildType child) {178element->myHierarchicalStructureChildren.add(child);179child->myHierarchicalStructureParents.add(element);180}181182/// @brief remove child element183template<typename ElementType, typename ChildType>184static void removeChild(ElementType element, ChildType child) {185element->myHierarchicalStructureChildren.remove(child);186child->myHierarchicalStructureParents.remove(element);187}188189/// @brief update all children elements190template<typename ElementType, typename ChildType>191static void updateChildren(ElementType element, GNEHierarchicalContainerChildren<ChildType> newChildren) {192// remove children193for (const auto children : element->myHierarchicalStructureChildren.template get<ChildType>()) {194children->myHierarchicalStructureParents.remove(element);195}196// update children197element->myHierarchicalStructureChildren.replaceAll(newChildren);198// restore children199for (const auto children : element->myHierarchicalStructureChildren.template get<ChildType>()) {200children->myHierarchicalStructureParents.add(element);201}202}203204/// @}205206/// @name specific get functions207/// @{208209/// @brief if use edge/parent lanes as a list of consecutive elements, obtain a list of IDs of elements after insert a new element210std::string getNewListOfParents(const GNENetworkElement* currentElement, const GNENetworkElement* newNextElement) const;211212/// @}213214private:215/// @brief hierarchical structure with parents216GNEHierarchicalStructureParents myHierarchicalStructureParents;217218/// @brief hierarchical structure with children219GNEHierarchicalStructureChildren myHierarchicalStructureChildren;220221/// @brief Invalidated copy constructor.222GNEHierarchicalElement(const GNEHierarchicalElement&) = delete;223};224225226