Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/GNEHierarchicalElement.h
193874 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GNEHierarchicalElement.h
15
/// @author Pablo Alvarez Lopez
16
/// @date Jul 2020
17
///
18
// A abstract class for representation of hierarchical elements
19
/****************************************************************************/
20
#pragma once
21
#include <config.h>
22
23
#include "GNEHierarchicalStructureParents.h"
24
#include "GNEHierarchicalStructureChildren.h"
25
26
// ===========================================================================
27
// class definitions
28
// ===========================================================================
29
30
class GNEHierarchicalElement {
31
32
public:
33
/// @brief declare GNEChange_Children as friend class
34
friend class GNEChange_Children;
35
friend class GNEDemandElement;
36
37
/// @brief default Constructor
38
GNEHierarchicalElement();
39
40
/// @brief Destructor
41
~GNEHierarchicalElement();
42
43
/// @brief clear hierarchical structure parents (used in GNE_Change)
44
void clearParents();
45
46
/// @name get parent functions
47
/// @{
48
49
/// @brief get parents container
50
const GNEHierarchicalStructureParents& getParents() const;
51
52
/// @brief get parent junctions
53
const GNEHierarchicalContainerParents<GNEJunction*>& getParentJunctions() const;
54
55
/// @brief get parent edges
56
const GNEHierarchicalContainerParents<GNEEdge*>& getParentEdges() const;
57
58
/// @brief get parent lanes
59
const GNEHierarchicalContainerParents<GNELane*>& getParentLanes() const;
60
61
/// @brief get parent additionals
62
const GNEHierarchicalContainerParents<GNEAdditional*>& getParentAdditionals() const;
63
64
/// @brief get parent stoppingPlaces (used by plans)
65
const GNEHierarchicalContainerParents<GNEAdditional*> getParentStoppingPlaces() const;
66
67
/// @brief get parent TAZs (used by plans)
68
const GNEHierarchicalContainerParents<GNEAdditional*> getParentTAZs() const;
69
70
/// @brief get parent demand elements
71
const GNEHierarchicalContainerParents<GNEDemandElement*>& getParentDemandElements() const;
72
73
/// @brief get parent demand elements
74
const GNEHierarchicalContainerParents<GNEGenericData*>& getParentGenericDatas() const;
75
76
/// @}
77
78
/// @name get children functions
79
/// @{
80
81
/// @brief get child container
82
const GNEHierarchicalStructureChildren& getChildren() const;
83
84
/// @brief get child junctions
85
const GNEHierarchicalContainerChildren<GNEJunction*>& getChildJunctions() const;
86
87
/// @brief get child edges
88
const GNEHierarchicalContainerChildren<GNEEdge*>& getChildEdges() const;
89
90
/// @brief get child lanes
91
const GNEHierarchicalContainerChildren<GNELane*>& getChildLanes() const;
92
93
/// @brief return child additionals
94
const GNEHierarchicalContainerChildren<GNEAdditional*>& getChildAdditionals() const;
95
96
/// @brief return child demand elements
97
const GNEHierarchicalContainerChildren<GNEDemandElement*>& getChildDemandElements() const;
98
99
/// @brief return child generic data elements
100
const GNEHierarchicalContainerChildren<GNEGenericData*>& getChildGenericDatas() const;
101
102
/// @brief return child TAZSourceSinks (Set)
103
const GNEHierarchicalContainerChildrenSet<GNETAZSourceSink*>& getChildTAZSourceSinks() const;
104
105
/// @}
106
107
/// @brief edit parent and childrens without maintain integrity (use carefully)
108
/// @{
109
110
/// @brief set single parent element (ONLY use in constructors)
111
template<typename ParentType>
112
void setParent(ParentType parent) {
113
GNEHierarchicalContainerParents<ParentType> parents;
114
parents.push_back(parent);
115
myHierarchicalStructureParents.replaceAll(parents);
116
}
117
118
/// @brief set multiple parent element (ONLY use in constructors)
119
template<typename ParentType>
120
void setParents(const GNEHierarchicalContainerParents<ParentType>& parents) {
121
myHierarchicalStructureParents.replaceAll(parents);
122
}
123
124
/// @brief add child without updating parent (ONLY used if we're creating elements without undo-redo)
125
template<typename ChildType>
126
void addChildElement(ChildType* element) {
127
myHierarchicalStructureChildren.add(element);
128
}
129
130
/// @brief Sort childrens
131
template<typename ChildType>
132
void sortChildren(std::vector<ChildType*> sortedChildrens) {
133
// remove elements and add again
134
for (auto child : sortedChildrens) {
135
myHierarchicalStructureChildren.remove(child);
136
}
137
for (auto child : sortedChildrens) {
138
myHierarchicalStructureChildren.add(child);
139
}
140
}
141
142
/// @}
143
144
/// @name edit function maintain integrity
145
/// @{
146
147
/// @brief insert parent element
148
template<typename ElementType, typename ParentType>
149
static void insertParent(ElementType* element, ParentType* parent, const int index = -1) {
150
element->myHierarchicalStructureParents.add(parent, index);
151
parent->myHierarchicalStructureChildren.add(element);
152
}
153
154
/// @brief remove parent element
155
template<typename ElementType, typename ParentType>
156
static void removeParent(ElementType* element, ParentType* parent) {
157
element->myHierarchicalStructureParents.remove(parent);
158
parent->myHierarchicalStructureChildren.remove(element);
159
}
160
161
/// @brief update single parent element
162
template<typename ElementType, typename ParentType>
163
static void updateParent(ElementType element, const int index, ParentType newParent) {
164
// remove element from old parent
165
auto oldParent = element->myHierarchicalStructureParents.template at<ParentType>(index);
166
oldParent->myHierarchicalStructureChildren.remove(element);
167
// update parent
168
element->myHierarchicalStructureParents.replaceSingle(index, newParent);
169
// insert child in new parent
170
newParent->myHierarchicalStructureChildren.add(element);
171
}
172
173
/// @brief update all parent elements
174
template<typename ElementType, typename ParentType>
175
static void updateParents(ElementType element, GNEHierarchicalContainerParents<ParentType> newParents) {
176
// remove children
177
for (const auto parent : element->myHierarchicalStructureParents.template get<ParentType>()) {
178
parent->myHierarchicalStructureChildren.remove(element);
179
}
180
// update parents
181
element->myHierarchicalStructureParents.replaceAll(newParents);
182
// restore children
183
for (const auto parent : element->myHierarchicalStructureParents.template get<ParentType>()) {
184
parent->myHierarchicalStructureChildren.add(element);
185
}
186
}
187
188
/// @brief insert child element
189
template<typename ElementType, typename ChildType>
190
static void insertChild(ElementType element, ChildType child) {
191
element->myHierarchicalStructureChildren.add(child);
192
child->myHierarchicalStructureParents.add(element);
193
}
194
195
/// @brief remove child element
196
template<typename ElementType, typename ChildType>
197
static void removeChild(ElementType element, ChildType child) {
198
element->myHierarchicalStructureChildren.remove(child);
199
child->myHierarchicalStructureParents.remove(element);
200
}
201
202
/// @brief update all children elements
203
template<typename ElementType, typename ChildType>
204
static void updateChildren(ElementType element, GNEHierarchicalContainerChildren<ChildType> newChildren) {
205
// remove children
206
for (const auto children : element->myHierarchicalStructureChildren.template get<ChildType>()) {
207
children->myHierarchicalStructureParents.remove(element);
208
}
209
// update children
210
element->myHierarchicalStructureChildren.replaceAll(newChildren);
211
// restore children
212
for (const auto children : element->myHierarchicalStructureChildren.template get<ChildType>()) {
213
children->myHierarchicalStructureParents.add(element);
214
}
215
}
216
217
/// @}
218
219
/// @name specific get functions
220
/// @{
221
222
/// @brief if use edge/parent lanes as a list of consecutive elements, obtain a list of IDs of elements after insert a new element
223
std::string getNewListOfParents(const GNENetworkElement* currentElement, const GNENetworkElement* newNextElement) const;
224
225
/// @}
226
227
private:
228
/// @brief hierarchical structure with parents
229
GNEHierarchicalStructureParents myHierarchicalStructureParents;
230
231
/// @brief hierarchical structure with children
232
GNEHierarchicalStructureChildren myHierarchicalStructureChildren;
233
234
/// @brief Invalidated copy constructor.
235
GNEHierarchicalElement(const GNEHierarchicalElement&) = delete;
236
};
237
238