Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/gui/div/GLObjectValuePassConnector.h
169685 views
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 GLObjectValuePassConnector.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Sascha Krieg
18
/// @author Michael Behrisch
19
/// @date Fri, 29.04.2005
20
///
21
// Class passing values from a GUIGlObject to another object
22
/****************************************************************************/
23
#pragma once
24
#include <config.h>
25
26
#include <algorithm>
27
#include <vector>
28
#include <map>
29
#include <functional>
30
#include <utils/foxtools/fxheader.h>
31
#include <utils/common/ValueSource.h>
32
#include <utils/common/ValueRetriever.h>
33
#include <utils/gui/globjects/GUIGlObject.h>
34
35
36
// ===========================================================================
37
// class declarations
38
// ===========================================================================
39
class GUIGlObject;
40
41
42
// ===========================================================================
43
// class definitions
44
// ===========================================================================
45
/**
46
* @class GLObjectValuePassConnector
47
* @brief Class passing values from a GUIGlObject to another object
48
*
49
* A templated instance has some static member variables. They have to be defined
50
* in a cpp file. They may be found in GUINet.cpp. Two instances are used:
51
* - one passing double-values
52
* - one passing time tls phase definitions
53
*
54
* @see GUIGlObject
55
*/
56
template<typename T>
57
class GLObjectValuePassConnector {
58
public:
59
/** @brief Constructor
60
* @param[in] o The object to get the value from
61
* @param[in] source The method for obtaining the value
62
* @param[in] retriever The object to pass the value to
63
*/
64
GLObjectValuePassConnector(GUIGlObject& o, ValueSource<T>* source, ValueRetriever<T>* retriever)
65
: myObject(o), mySource(source), myRetriever(retriever) { /*, myIsInvalid(false) */
66
FXMutexLock locker(myLock);
67
myContainer.push_back(this);
68
}
69
70
71
/// @brief Destructor
72
virtual ~GLObjectValuePassConnector() {
73
myLock.lock();
74
typename std::vector< GLObjectValuePassConnector<T>* >::iterator i = std::find(myContainer.begin(), myContainer.end(), this);
75
if (i != myContainer.end()) {
76
myContainer.erase(i);
77
}
78
myLock.unlock();
79
delete mySource;
80
}
81
82
83
/// @name static methods for interactions
84
/// @{
85
86
/** @brief Updates all instances (passes values)
87
*/
88
static void updateAll() {
89
FXMutexLock locker(myLock);
90
for (GLObjectValuePassConnector<T>* const connector : myContainer) {
91
connector->passValue();
92
}
93
}
94
95
96
/** @brief Deletes all instances
97
*/
98
static void clear() {
99
FXMutexLock locker(myLock);
100
while (!myContainer.empty()) {
101
delete (*myContainer.begin());
102
}
103
myContainer.clear();
104
}
105
106
107
/** @brief Removes all instances that pass values from the object with the given id
108
*
109
* Used if for example a vehicle leaves the network
110
* @param[in] o The object which shall no longer be asked for values
111
*/
112
static void removeObject(GUIGlObject& o) {
113
FXMutexLock locker(myLock);
114
for (typename std::vector< GLObjectValuePassConnector<T>* >::iterator i = myContainer.begin(); i != myContainer.end();) {
115
if ((*i)->myObject.getGlID() == o.getGlID()) {
116
i = myContainer.erase(i);
117
} else {
118
++i;
119
}
120
}
121
}
122
/// @}
123
124
125
protected:
126
/** @brief Passes the value to the retriever
127
*
128
* Retrieves the value from the object, in the case the object is active.
129
* Passes the value to the retriever.
130
* @see GUIGlObject::active
131
*/
132
virtual bool passValue() {
133
myRetriever->addValue(mySource->getValue());
134
return true;
135
}
136
137
138
protected:
139
/// @brief The object to get the values of (the object that must be active)
140
GUIGlObject& myObject;
141
142
/// @brief The source for values
143
ValueSource<T>* mySource;
144
145
/// @brief The destination for values
146
ValueRetriever<T>* myRetriever;
147
148
/// @brief The mutex used to avoid concurrent updates of the connectors container
149
static FXMutex myLock;
150
151
/// @brief The container of items that shall be updated
152
static std::vector< GLObjectValuePassConnector<T>* > myContainer;
153
154
155
private:
156
/// @brief Invalidated copy constructor.
157
GLObjectValuePassConnector(const GLObjectValuePassConnector<T>&);
158
159
/// @brief Invalidated assignment operator.
160
GLObjectValuePassConnector<T>& operator=(const GLObjectValuePassConnector<T>&);
161
162
163
};
164
165
166
template<typename T>
167
std::vector< GLObjectValuePassConnector<T>* > GLObjectValuePassConnector<T>::myContainer;
168
template<typename T>
169
FXMutex GLObjectValuePassConnector<T>::myLock;
170
171