Skip to content

Commit

Permalink
Added new functions in GNEHierarchicalElement and sorted GNEHierarchi…
Browse files Browse the repository at this point in the history
…calStructureParents. Refs #16067
  • Loading branch information
palvarezlopez committed Feb 7, 2025
1 parent fab5ca0 commit 1672a3d
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 104 deletions.
39 changes: 28 additions & 11 deletions src/netedit/elements/GNEHierarchicalElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,40 +130,57 @@ class GNEHierarchicalElement : public GNEAttributeCarrier {

/// @}

/// @brief add child (only used if we're creating elements without undo-redo)
template<typename T>
void addChildElement(T* element) {
myHierarchicalStructureChildren.addChildElement(element);
}
/// @name edit function maintain integrity
/// @{

/// @brief insert parent element and update their child
/// @brief insert parent element
template<typename T, typename U>
static void insertParent(T* element, U* parent) {
element->myHierarchicalStructureParents.addParentElement(parent);
static void insertParent(T* element, U* parent, const int index = -1) {
element->myHierarchicalStructureParents.addParentElement(parent, index);
parent->myHierarchicalStructureChildren.addChildElement(element);
}

/// @brief remove parent element and update their child
/// @brief remove parent element
template<typename T, typename U>
static void removeParent(T* element, U* parent) {
element->myHierarchicalStructureParents.removeParentElement(parent);
parent->myHierarchicalStructureChildren.removeChildElement(element);
}

/// @brief insert child element and update their parent
/// @brief update parent element
template<typename T, typename U>
static void updateParent(T* element, const int index, U* newParent) {
// remove element from old parent
auto oldParent = element->getParents().at(index);
oldParent->myHierarchicalStructureChildren.removeChildElement(element);
// update parent
element->myHierarchicalStructureParents.updateParentElement(index, newParent);
// insert child in new parent
newParent->myHierarchicalStructureChildren.addChildElement(element);
}

/// @brief insert child element
template<typename T, typename U>
static void insertChild(T* element, U* child) {
element->myHierarchicalStructureChildren.addChildElement(child);
child->myHierarchicalStructureParents.addParentElement(element);
}

/// @brief remove child element (and update their parent)
/// @brief remove child element
template<typename T, typename U>
static void removeChild(T* element, U* child) {
element->myHierarchicalStructureChildren.removeChildElement(child);
child->myHierarchicalStructureParents.removeParentElement(element);
}

/// @}

/// @brief add child without updating parent (ONLY used if we're creating elements without undo-redo)
template<typename T>
void addChildElement(T* element) {
myHierarchicalStructureChildren.addChildElement(element);
}

/// @name specific get functions
/// @{

Expand Down
168 changes: 84 additions & 84 deletions src/netedit/elements/GNEHierarchicalStructureParents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,48 @@ GNEHierarchicalStructureParents::clear() {
}


template<> const GNEHierarchicalContainerParents<GNEJunction*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentJunctions;
}


template<> const GNEHierarchicalContainerParents<GNEEdge*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentEdges;
}


template<> const GNEHierarchicalContainerParents<GNELane*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentLanes;
}


template<> const GNEHierarchicalContainerParents<GNEAdditional*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentAdditionals;
}


template<> const GNEHierarchicalContainerParents<GNETAZSourceSink*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentTAZSourceSinks;
}


template<> const GNEHierarchicalContainerParents<GNEDemandElement*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentDemandElements;
}


template<> const GNEHierarchicalContainerParents<GNEGenericData*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentGenericDatas;
}


template <> void
GNEHierarchicalStructureParents::addParentElement(GNEJunction* element, const int index) {
if (index == -1) {
Expand Down Expand Up @@ -144,66 +186,6 @@ GNEHierarchicalStructureParents::updateParentElement(const int index, GNEJunctio
}


template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEEdge* element) {
if (index >= 0 && index < (int)myParentEdges.size()) {
myParentEdges[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating edge parents");
}
}


template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNELane* element) {
if (index >= 0 && index < (int)myParentLanes.size()) {
myParentLanes[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating lane parents");
}
}


template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEAdditional* element) {
if (index >= 0 && index < (int)myParentAdditionals.size()) {
myParentAdditionals[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating additional parents");
}
}


template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNETAZSourceSink* element) {
if (index >= 0 && index < (int)myParentTAZSourceSinks.size()) {
myParentTAZSourceSinks[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating sourceSink parents");
}
}


template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEDemandElement* element) {
if (index >= 0 && index < (int)myParentDemandElements.size()) {
myParentDemandElements[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating demand element parents");
}
}


template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEGenericData* element) {
if (index >= 0 && index < (int)myParentGenericDatas.size()) {
myParentGenericDatas[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating generic data parents");
}
}


template <> void
GNEHierarchicalStructureParents::removeParentElement(GNEJunction* junction) {
auto it = std::find(myParentJunctions.begin(), myParentJunctions.end(), junction);
Expand Down Expand Up @@ -281,45 +263,63 @@ GNEHierarchicalStructureParents::removeParentElement(GNEGenericData* genericData
}


template<> const GNEHierarchicalContainerParents<GNEJunction*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentJunctions;
}


template<> const GNEHierarchicalContainerParents<GNEEdge*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentEdges;
template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEEdge* element) {
if (index >= 0 && index < (int)myParentEdges.size()) {
myParentEdges[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating edge parents");
}
}


template<> const GNEHierarchicalContainerParents<GNELane*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentLanes;
template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNELane* element) {
if (index >= 0 && index < (int)myParentLanes.size()) {
myParentLanes[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating lane parents");
}
}


template<> const GNEHierarchicalContainerParents<GNEAdditional*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentAdditionals;
template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEAdditional* element) {
if (index >= 0 && index < (int)myParentAdditionals.size()) {
myParentAdditionals[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating additional parents");
}
}


template<> const GNEHierarchicalContainerParents<GNETAZSourceSink*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentTAZSourceSinks;
template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNETAZSourceSink* element) {
if (index >= 0 && index < (int)myParentTAZSourceSinks.size()) {
myParentTAZSourceSinks[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating sourceSink parents");
}
}


template<> const GNEHierarchicalContainerParents<GNEDemandElement*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentDemandElements;
template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEDemandElement* element) {
if (index >= 0 && index < (int)myParentDemandElements.size()) {
myParentDemandElements[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating demand element parents");
}
}


template<> const GNEHierarchicalContainerParents<GNEGenericData*>&
GNEHierarchicalStructureParents::getParents() const {
return myParentGenericDatas;
template <> void
GNEHierarchicalStructureParents::updateParentElement(const int index, GNEGenericData* element) {
if (index >= 0 && index < (int)myParentGenericDatas.size()) {
myParentGenericDatas[index] = element;
} else {
throw ProcessError("Invalid index " + toString(element->getID()) + " updating generic data parents");
}
}

/****************************************************************************/
17 changes: 8 additions & 9 deletions src/netedit/elements/GNEHierarchicalStructureParents.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,29 +66,28 @@ class GNEHierarchicalStructureParents {
/// @brief clear container
void clear();

/// @brief get parents
template<typename T>
const GNEHierarchicalContainerParents<T>& getParents() const;

/**@brief add parent element
* @param element parent element to be inserted
* @param index position (-1 means push back)
*/
template<typename T>
void addParentElement(T* element, const int index = -1);

/// @brief remove parent element
template<typename T>
void removeParentElement(T* element);

/**@brief update parent element
* @param index position
* @param element parent element to be updated
*/
template<typename T>
void updateParentElement(const int index, T* element);

/// @brief remove parent element
template<typename T>
void removeParentElement(T* element);

/// @brief get parents
template<typename T>
const GNEHierarchicalContainerParents<T>& getParents() const;


private:
/// @brief parents junctions
GNEHierarchicalContainerParents<GNEJunction*> myParentJunctions;
Expand Down

0 comments on commit 1672a3d

Please sign in to comment.