@@ -104,10 +104,12 @@ size_t AnalyserModel::stateCount() const
104104 return mPimpl ->mStates .size ();
105105}
106106
107- std::vector<AnalyserVariablePtr> AnalyserModel::states () const
107+ const std::vector<AnalyserVariablePtr> & AnalyserModel::states () const
108108{
109+ static const std::vector<AnalyserVariablePtr> empty;
110+
109111 if (!isValid ()) {
110- return {} ;
112+ return empty ;
111113 }
112114
113115 return mPimpl ->mStates ;
@@ -132,10 +134,12 @@ size_t AnalyserModel::constantCount() const
132134 return mPimpl ->mConstants .size ();
133135}
134136
135- std::vector<AnalyserVariablePtr> AnalyserModel::constants () const
137+ const std::vector<AnalyserVariablePtr> & AnalyserModel::constants () const
136138{
139+ static const std::vector<AnalyserVariablePtr> empty;
140+
137141 if (!isValid ()) {
138- return {} ;
142+ return empty ;
139143 }
140144
141145 return mPimpl ->mConstants ;
@@ -159,10 +163,12 @@ size_t AnalyserModel::computedConstantCount() const
159163 return mPimpl ->mComputedConstants .size ();
160164}
161165
162- std::vector<AnalyserVariablePtr> AnalyserModel::computedConstants () const
166+ const std::vector<AnalyserVariablePtr> & AnalyserModel::computedConstants () const
163167{
168+ static const std::vector<AnalyserVariablePtr> empty;
169+
164170 if (!isValid ()) {
165- return {} ;
171+ return empty ;
166172 }
167173
168174 return mPimpl ->mComputedConstants ;
@@ -186,10 +192,12 @@ size_t AnalyserModel::algebraicVariableCount() const
186192 return mPimpl ->mAlgebraicVariables .size ();
187193}
188194
189- std::vector<AnalyserVariablePtr> AnalyserModel::algebraicVariables () const
195+ const std::vector<AnalyserVariablePtr> & AnalyserModel::algebraicVariables () const
190196{
197+ static const std::vector<AnalyserVariablePtr> empty;
198+
191199 if (!isValid ()) {
192- return {} ;
200+ return empty ;
193201 }
194202
195203 return mPimpl ->mAlgebraicVariables ;
@@ -213,10 +221,12 @@ size_t AnalyserModel::externalVariableCount() const
213221 return mPimpl ->mExternalVariables .size ();
214222}
215223
216- std::vector<AnalyserVariablePtr> AnalyserModel::externalVariables () const
224+ const std::vector<AnalyserVariablePtr> & AnalyserModel::externalVariables () const
217225{
226+ static const std::vector<AnalyserVariablePtr> empty;
227+
218228 if (!isValid ()) {
219- return {} ;
229+ return empty ;
220230 }
221231
222232 return mPimpl ->mExternalVariables ;
@@ -237,8 +247,20 @@ AnalyserVariablePtr AnalyserModel::analyserVariable(const VariablePtr &variable)
237247 return {};
238248 }
239249
250+ // Check the cache first.
251+
252+ auto analyserVariableIt = mPimpl ->mAnalyserVariables .find (variable.get ());
253+
254+ if (analyserVariableIt != mPimpl ->mAnalyserVariables .end ()) {
255+ return analyserVariableIt->second ;
256+ }
257+
258+ // Not in the cache, so do the equivalence-based search.
259+
240260 for (const auto &analyserVariable : analyserVariables (shared_from_this ())) {
241261 if (areEquivalentVariables (variable, analyserVariable->variable ())) {
262+ mPimpl ->mAnalyserVariables .emplace (variable.get (), analyserVariable);
263+
242264 return analyserVariable;
243265 }
244266 }
@@ -255,10 +277,12 @@ size_t AnalyserModel::analyserEquationCount() const
255277 return mPimpl ->mAnalyserEquations .size ();
256278}
257279
258- std::vector<AnalyserEquationPtr> AnalyserModel::analyserEquations () const
280+ const std::vector<AnalyserEquationPtr> & AnalyserModel::analyserEquations () const
259281{
282+ static const std::vector<AnalyserEquationPtr> empty;
283+
260284 if (!isValid ()) {
261- return {} ;
285+ return empty ;
262286 }
263287
264288 return mPimpl ->mAnalyserEquations ;
0 commit comments