Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2025 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 GUIGlObjectStorage.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Michael Behrisch
18 : /// @date Sept 2002
19 : ///
20 : // A storage for displayed objects via their numerical id
21 : /****************************************************************************/
22 : #include <config.h>
23 :
24 : #include <cassert>
25 : #include <utils/foxtools/fxheader.h>
26 : #include "GUIGlObject.h"
27 : #include "GUIGlObjectStorage.h"
28 :
29 :
30 : // ===========================================================================
31 : // static variables (instances in this case)
32 : // ===========================================================================
33 : GUIGlObjectStorage GUIGlObjectStorage::gIDStorage;
34 :
35 :
36 : // ===========================================================================
37 : // method definitions
38 : // ===========================================================================
39 8577 : GUIGlObjectStorage::GUIGlObjectStorage() :
40 8577 : myNextID(1),
41 8577 : myLock(true) {
42 8577 : myObjects.push_back(nullptr);
43 8577 : }
44 :
45 :
46 17154 : GUIGlObjectStorage::~GUIGlObjectStorage() {}
47 :
48 :
49 : GUIGlID
50 1671402 : GUIGlObjectStorage::registerObject(GUIGlObject* object) {
51 1671402 : FXMutexLock locker(myLock);
52 1671402 : const GUIGlID id = myNextID;
53 1671402 : if (id == myObjects.size()) {
54 1128340 : myObjects.push_back(object);
55 : } else {
56 543062 : myObjects[id] = object;
57 : }
58 36278060 : while (myNextID < myObjects.size() && myObjects[myNextID] != nullptr) {
59 34606658 : myNextID++;
60 : }
61 1671402 : return id;
62 : }
63 :
64 :
65 : void
66 1671402 : GUIGlObjectStorage::changeName(GUIGlObject* object, const std::string& fullName) {
67 1671402 : FXMutexLock locker(myLock);
68 : myFullNameMap.erase(object->getFullName());
69 1671402 : myFullNameMap[fullName] = object;
70 1671402 : }
71 :
72 :
73 : GUIGlObject*
74 133 : GUIGlObjectStorage::getObjectBlocking(GUIGlID id) const {
75 133 : FXMutexLock locker(myLock);
76 133 : if (id < myObjects.size() && myObjects[id] != nullptr) {
77 : GUIGlObject* const o = myObjects[id];
78 : o->setBlocked();
79 133 : return o;
80 : }
81 : return nullptr;
82 : }
83 :
84 :
85 : GUIGlObject*
86 63343 : GUIGlObjectStorage::getObjectBlocking(const std::string& fullName) const {
87 63343 : FXMutexLock locker(myLock);
88 : auto findIt = myFullNameMap.find(fullName);
89 63343 : if (findIt != myFullNameMap.end()) {
90 28874 : GUIGlObject* const o = findIt->second;
91 : o->setBlocked();
92 28874 : return o;
93 : }
94 : return nullptr;
95 : }
96 :
97 :
98 : bool
99 1669855 : GUIGlObjectStorage::remove(GUIGlID id) {
100 1669855 : FXMutexLock locker(myLock);
101 : assert(id < myObjects.size() && myObjects[id] != nullptr);
102 1669855 : myFullNameMap.erase(myObjects[id]->getFullName());
103 1669855 : const bool wasBlocked = myObjects[id]->isBlocked();
104 1669855 : myObjects[id] = nullptr;
105 1669855 : if (id < myNextID) {
106 324554 : myNextID = id;
107 : }
108 1669855 : return !wasBlocked;
109 : }
110 :
111 :
112 : void
113 39421 : GUIGlObjectStorage::clear() {
114 39421 : FXMutexLock locker(myLock);
115 : myObjects.clear();
116 39421 : myObjects.push_back(nullptr);
117 : myFullNameMap.clear();
118 39421 : myNextID = 1;
119 39421 : }
120 :
121 :
122 : void
123 29002 : GUIGlObjectStorage::unblockObject(GUIGlID id) {
124 29002 : FXMutexLock locker(myLock);
125 29002 : if (id < myObjects.size() && myObjects[id] != nullptr) {
126 : myObjects[id]->setBlocked(false);
127 : }
128 29002 : }
129 :
130 :
131 : const std::vector<GUIGlObject*>&
132 0 : GUIGlObjectStorage::getAllGLObjects() const {
133 0 : return myObjects;
134 : }
135 :
136 : /****************************************************************************/
|