Path: blob/main/src/netedit/elements/GNEHierarchicalStructureParents.cpp
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 GNEHierarchicalStructureParents.cpp14/// @author Pablo Alvarez Lopez15/// @date Feb 202516///17// Structure for GNEHierarchicalElements centered in parents18/****************************************************************************/1920#include <netedit/elements/network/GNEJunction.h>21#include <netedit/elements/network/GNEEdge.h>22#include <netedit/elements/network/GNELane.h>23#include <netedit/elements/demand/GNEDemandElement.h>24#include <netedit/elements/additional/GNEAdditional.h>25#include <netedit/elements/additional/GNETAZSourceSink.h>26#include <netedit/elements/data/GNEGenericData.h>27#include <utils/common/UtilExceptions.h>2829#include "GNEHierarchicalStructureParents.h"3031// ===========================================================================32// member method definitions33// ===========================================================================3435GNEHierarchicalStructureParents::GNEHierarchicalStructureParents() {}363738void39GNEHierarchicalStructureParents::clear() {40myParentJunctions.clear();41myParentEdges.clear();42myParentLanes.clear();43myParentAdditionals.clear();44myParentTAZSourceSinks.clear();45myParentDemandElements.clear();46myParentGenericDatas.clear();47}4849// get functions5051template<> const GNEHierarchicalContainerParents<GNEJunction*>&52GNEHierarchicalStructureParents::get() const {53return myParentJunctions;54}555657template<> const GNEHierarchicalContainerParents<GNEEdge*>&58GNEHierarchicalStructureParents::get() const {59return myParentEdges;60}616263template<> const GNEHierarchicalContainerParents<GNELane*>&64GNEHierarchicalStructureParents::get() const {65return myParentLanes;66}676869template<> const GNEHierarchicalContainerParents<GNEAdditional*>&70GNEHierarchicalStructureParents::get() const {71return myParentAdditionals;72}737475template<> const GNEHierarchicalContainerParents<GNETAZSourceSink*>&76GNEHierarchicalStructureParents::get() const {77return myParentTAZSourceSinks;78}798081template<> const GNEHierarchicalContainerParents<GNEDemandElement*>&82GNEHierarchicalStructureParents::get() const {83return myParentDemandElements;84}858687template<> const GNEHierarchicalContainerParents<GNEGenericData*>&88GNEHierarchicalStructureParents::get() const {89return myParentGenericDatas;90}9192// at functions9394template<> GNEJunction*95GNEHierarchicalStructureParents::at(const int index) const {96return myParentJunctions.at(index);97}9899100template<> GNEEdge*101GNEHierarchicalStructureParents::at(const int index) const {102return myParentEdges.at(index);103}104105106template<> GNELane*107GNEHierarchicalStructureParents::at(const int index) const {108return myParentLanes.at(index);109}110111112template<> GNEAdditional*113GNEHierarchicalStructureParents::at(const int index) const {114return myParentAdditionals.at(index);115}116117118template<> GNETAZSourceSink*119GNEHierarchicalStructureParents::at(const int index) const {120return myParentTAZSourceSinks.at(index);121}122123124template<> GNEDemandElement*125GNEHierarchicalStructureParents::at(const int index) const {126return myParentDemandElements.at(index);127}128129130template<> GNEGenericData*131GNEHierarchicalStructureParents::at(const int index) const {132return myParentGenericDatas.at(index);133}134135// add functions136137template <> void138GNEHierarchicalStructureParents::add(GNEJunction* parent, const int index) {139if (index == -1) {140myParentJunctions.push_back(parent);141} else if ((index < 0) || (index > (int)myParentJunctions.size())) {142myParentJunctions.insert(myParentJunctions.begin() + index, parent);143} else {144throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");145}146}147148149template <> void150GNEHierarchicalStructureParents::add(GNEEdge* parent, const int index) {151if (index == -1) {152myParentEdges.push_back(parent);153} else if ((index < 0) || (index > (int)myParentEdges.size())) {154myParentEdges.insert(myParentEdges.begin() + index, parent);155} else {156throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");157}158}159160161template <> void162GNEHierarchicalStructureParents::add(GNELane* parent, const int index) {163if (index == -1) {164myParentLanes.push_back(parent);165} else if ((index < 0) || (index > (int)myParentLanes.size())) {166myParentLanes.insert(myParentLanes.begin() + index, parent);167} else {168throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");169}170}171172173template <> void174GNEHierarchicalStructureParents::add(GNEAdditional* parent, const int index) {175if (index == -1) {176myParentAdditionals.push_back(parent);177} else if ((index < 0) || (index > (int)myParentAdditionals.size())) {178myParentAdditionals.insert(myParentAdditionals.begin() + index, parent);179} else {180throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");181}182}183184185template <> void186GNEHierarchicalStructureParents::add(GNETAZSourceSink* parent, const int index) {187if (index == -1) {188myParentTAZSourceSinks.push_back(parent);189} else if ((index < 0) || (index > (int)myParentTAZSourceSinks.size())) {190myParentTAZSourceSinks.insert(myParentTAZSourceSinks.begin() + index, parent);191} else {192throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");193}194}195196197template <> void198GNEHierarchicalStructureParents::add(GNEDemandElement* parent, const int index) {199if (index == -1) {200myParentDemandElements.push_back(parent);201} else if ((index < 0) || (index > (int)myParentDemandElements.size())) {202myParentDemandElements.insert(myParentDemandElements.begin() + index, parent);203} else {204throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");205}206}207208209template <> void210GNEHierarchicalStructureParents::add(GNEGenericData* parent, const int index) {211if (index == -1) {212myParentGenericDatas.push_back(parent);213} else if ((index < 0) || (index > (int)myParentGenericDatas.size())) {214myParentGenericDatas.insert(myParentGenericDatas.begin() + index, parent);215} else {216throw ProcessError("invalid index in GNEHierarchicalStructureParents::add");217}218}219220// remove functions221222template <> void223GNEHierarchicalStructureParents::remove(GNEJunction* junction) {224auto it = std::find(myParentJunctions.begin(), myParentJunctions.end(), junction);225if (it != myParentJunctions.end()) {226myParentJunctions.erase(it);227} else {228throw ProcessError(junction->getTagStr() + " with ID='" + junction->getID() + "' is not a parent parent");229}230}231232233template <> void234GNEHierarchicalStructureParents::remove(GNEEdge* edge) {235auto it = std::find(myParentEdges.begin(), myParentEdges.end(), edge);236if (it != myParentEdges.end()) {237myParentEdges.erase(it);238} else {239throw ProcessError(edge->getTagStr() + " with ID='" + edge->getID() + "' is not a parent parent");240}241}242243244template <> void245GNEHierarchicalStructureParents::remove(GNELane* lane) {246auto it = std::find(myParentLanes.begin(), myParentLanes.end(), lane);247if (it != myParentLanes.end()) {248myParentLanes.erase(it);249} else {250throw ProcessError(lane->getTagStr() + " with ID='" + lane->getID() + "' is not a parent parent");251}252}253254255template <> void256GNEHierarchicalStructureParents::remove(GNEAdditional* additional) {257auto it = std::find(myParentAdditionals.begin(), myParentAdditionals.end(), additional);258if (it != myParentAdditionals.end()) {259myParentAdditionals.erase(it);260} else {261throw ProcessError(additional->getTagStr() + " with ID='" + additional->getID() + "' is not a parent parent");262}263}264265266template <> void267GNEHierarchicalStructureParents::remove(GNETAZSourceSink* TAZSourceSink) {268auto it = std::find(myParentTAZSourceSinks.begin(), myParentTAZSourceSinks.end(), TAZSourceSink);269if (it != myParentTAZSourceSinks.end()) {270myParentTAZSourceSinks.erase(it);271} else {272throw ProcessError(TAZSourceSink->getTagStr() + " with ID='" + TAZSourceSink->getID() + "' is not a parent parent");273}274}275276277template <> void278GNEHierarchicalStructureParents::remove(GNEDemandElement* demandElement) {279auto it = std::find(myParentDemandElements.begin(), myParentDemandElements.end(), demandElement);280if (it != myParentDemandElements.end()) {281myParentDemandElements.erase(it);282} else {283throw ProcessError(demandElement->getTagStr() + " is not a parent parent");284}285}286287288template <> void289GNEHierarchicalStructureParents::remove(GNEGenericData* genericData) {290auto it = std::find(myParentGenericDatas.begin(), myParentGenericDatas.end(), genericData);291if (it != myParentGenericDatas.end()) {292myParentGenericDatas.erase(it);293} else {294throw ProcessError(genericData->getTagStr() + " is not a parent parent");295}296}297298// updateParentElement functions299300template <> void301GNEHierarchicalStructureParents::replaceSingle(const int index, GNEJunction* newParent) {302if ((index >= 0) && (index < (int)myParentJunctions.size())) {303myParentJunctions[index] = newParent;304} else {305throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating junction parents");306}307}308309310template <> void311GNEHierarchicalStructureParents::replaceSingle(const int index, GNEEdge* newParent) {312if ((index >= 0) && (index < (int)myParentEdges.size())) {313myParentEdges[index] = newParent;314} else {315throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating edge parents");316}317}318319320template <> void321GNEHierarchicalStructureParents::replaceSingle(const int index, GNELane* newParent) {322if ((index >= 0) && (index < (int)myParentLanes.size())) {323myParentLanes[index] = newParent;324} else {325throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating lane parents");326}327}328329330template <> void331GNEHierarchicalStructureParents::replaceSingle(const int index, GNEAdditional* newParent) {332if ((index >= 0) && (index < (int)myParentAdditionals.size())) {333myParentAdditionals[index] = newParent;334} else {335throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating additional parents");336}337}338339340template <> void341GNEHierarchicalStructureParents::replaceSingle(const int index, GNETAZSourceSink* newParent) {342if ((index >= 0) && (index < (int)myParentTAZSourceSinks.size())) {343myParentTAZSourceSinks[index] = newParent;344} else {345throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating sourceSink parents");346}347}348349350template <> void351GNEHierarchicalStructureParents::replaceSingle(const int index, GNEDemandElement* newParent) {352if ((index >= 0) && (index < (int)myParentDemandElements.size())) {353myParentDemandElements[index] = newParent;354} else {355throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating demand parent parents");356}357}358359360template <> void361GNEHierarchicalStructureParents::replaceSingle(const int index, GNEGenericData* newParent) {362if ((index >= 0) && (index < (int)myParentGenericDatas.size())) {363myParentGenericDatas[index] = newParent;364} else {365throw ProcessError("Invalid index " + toString(newParent->getID()) + " updating generic data parents");366}367}368369// updateParents functions370371template <> void372GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNEJunction*>& newParents) {373myParentJunctions = newParents;374}375376377template <> void378GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNEEdge*>& newParents) {379myParentEdges = newParents;380}381382383template <> void384GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNELane*>& newParents) {385myParentLanes = newParents;386}387388389template <> void390GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNEAdditional*>& newParents) {391myParentAdditionals = newParents;392}393394395template <> void396GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNETAZSourceSink*>& newParents) {397myParentTAZSourceSinks = newParents;398}399400401template <> void402GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNEDemandElement*>& newParents) {403myParentDemandElements = newParents;404}405406407template <> void408GNEHierarchicalStructureParents::replaceAll(const GNEHierarchicalContainerParents<GNEGenericData*>& newParents) {409myParentGenericDatas = newParents;410}411412/****************************************************************************/413414415