13
13
#include " ecflow/attribute/LateAttr.hpp"
14
14
#include " ecflow/core/Converter.hpp"
15
15
#include " ecflow/core/Ecf.hpp"
16
+ #include " ecflow/core/Stl.hpp"
16
17
#include " ecflow/core/Str.hpp"
17
18
#include " ecflow/node/ExprAst.hpp"
18
19
#include " ecflow/node/Limit.hpp"
@@ -22,15 +23,14 @@ using namespace ecf;
22
23
using namespace std ;
23
24
24
25
void Node::changeVariable (const std::string& name, const std::string& value) {
25
- size_t theSize = vars_.size ();
26
- for (size_t i = 0 ; i < theSize; i++) {
27
- if (vars_[i].name () == name) {
28
- vars_[i].set_value (value);
29
- variable_change_no_ = Ecf::incr_state_change_no ();
30
- return ;
31
- }
26
+ auto found = ecf::algorithm::find_by_name (vars_, name);
27
+
28
+ if (found == std::end (vars_)) {
29
+ throw std::runtime_error (" Node::changeVariable: Could not find variable " + name);
32
30
}
33
- throw std::runtime_error (" Node::changeVariable: Could not find variable " + name);
31
+
32
+ found->set_value (value);
33
+ variable_change_no_ = Ecf::incr_state_change_no ();
34
34
}
35
35
36
36
bool Node::set_event (const std::string& event_name_or_number, bool value) {
@@ -39,23 +39,22 @@ bool Node::set_event(const std::string& event_name_or_number, bool value) {
39
39
}
40
40
41
41
// find by name first
42
- size_t theSize = events_. size ();
43
- for ( size_t i = 0 ; i < theSize; i++) {
44
- if (events_[i]. name () == event_name_or_number ) {
45
- events_[i]. set_value (value);
42
+ {
43
+ auto found = ecf::algorithm::find_by_name (events_, event_name_or_number);
44
+ if (found != std::end (events_) ) {
45
+ found-> set_value (value);
46
46
return true ;
47
47
}
48
48
}
49
49
50
50
// Test for numeric, and then casting, is ****faster***** than relying on exception alone
51
51
if (event_name_or_number.find_first_of (Str::NUMERIC ()) == 0 ) {
52
52
try {
53
- auto eventNumber = ecf::convert_to<int >(event_name_or_number);
54
- for (size_t i = 0 ; i < theSize; i++) {
55
- if (events_[i].number () == eventNumber) {
56
- events_[i].set_value (value);
57
- return true ;
58
- }
53
+ auto number = ecf::convert_to<int >(event_name_or_number);
54
+ auto found = ecf::algorithm::find_by_number (events_, number);
55
+ if (found != std::end (events_)) {
56
+ found->set_value (value);
57
+ return true ;
59
58
}
60
59
}
61
60
catch (const ecf::bad_conversion&) {
@@ -70,29 +69,28 @@ bool Node::set_event_used_in_trigger(const std::string& event_name_or_number) {
70
69
}
71
70
72
71
// find by name first
73
- size_t theSize = events_. size ();
74
- for ( size_t i = 0 ; i < theSize; i++) {
75
- if (events_[i]. name () == event_name_or_number ) {
76
- events_[i]. usedInTrigger (true );
72
+ {
73
+ auto found = ecf::algorithm::find_by_name (events_, event_name_or_number);
74
+ if (found != std::end (events_) ) {
75
+ found-> usedInTrigger (true );
77
76
return true ;
78
77
}
79
78
}
80
79
81
80
// Test for numeric, and then casting, is ****faster***** than relying on exception alone
82
81
if (event_name_or_number.find_first_of (Str::NUMERIC ()) == 0 ) {
83
82
try {
84
- auto eventNumber = ecf::convert_to<int >(event_name_or_number);
85
- for (size_t i = 0 ; i < theSize; i++) {
86
- if (events_[i].number () == eventNumber) {
87
- events_[i].usedInTrigger (true );
88
- return true ;
89
- ;
90
- }
83
+ auto number = ecf::convert_to<int >(event_name_or_number);
84
+ auto found = ecf::algorithm::find_by_number (events_, number);
85
+ if (found != std::end (events_)) {
86
+ found->usedInTrigger (true );
87
+ return true ;
91
88
}
92
89
}
93
90
catch (const ecf::bad_conversion&) {
94
91
}
95
92
}
93
+
96
94
return false ;
97
95
}
98
96
void Node::changeEvent (const std::string& event_name_or_number, const std::string& setOrClear) {
@@ -116,25 +114,25 @@ void Node::changeEvent(const std::string& event_name_or_number, bool value) {
116
114
throw std::runtime_error (" Node::changeEvent: Could not find event " + event_name_or_number);
117
115
}
118
116
119
- bool Node::set_meter (const std::string& meter_name, int value) {
120
- size_t the_meter_size = meters_.size ();
121
- for (size_t i = 0 ; i < the_meter_size; ++i) {
122
- if (meters_[i].name () == meter_name) {
123
- meters_[i].set_value (value);
124
- return true ;
125
- }
117
+ bool Node::set_meter (const std::string& name, int value) {
118
+ auto found = ecf::algorithm::find_by_name (meters_, name);
119
+
120
+ if (found == std::end (meters_)) {
121
+ return false ;
126
122
}
127
- return false ;
123
+
124
+ found->set_value (value);
125
+ return true ;
128
126
}
129
- bool Node::set_meter_used_in_trigger (const std::string& meter_name) {
130
- size_t the_meter_size = meters_.size ();
131
- for (size_t i = 0 ; i < the_meter_size; ++i) {
132
- if (meters_[i].name () == meter_name) {
133
- meters_[i].usedInTrigger (true );
134
- return true ;
135
- }
127
+ bool Node::set_meter_used_in_trigger (const std::string& name) {
128
+ auto found = ecf::algorithm::find_by_name (meters_, name);
129
+
130
+ if (found == std::end (meters_)) {
131
+ return false ;
136
132
}
137
- return false ;
133
+
134
+ found->usedInTrigger (true );
135
+ return true ;
138
136
}
139
137
void Node::changeMeter (const std::string& meter_name, const std::string& value) {
140
138
int theValue = 0 ;
@@ -146,21 +144,21 @@ void Node::changeMeter(const std::string& meter_name, const std::string& value)
146
144
}
147
145
changeMeter (meter_name, theValue);
148
146
}
147
+
149
148
void Node::changeMeter (const std::string& meter_name, int value) {
150
149
if (set_meter (meter_name, value))
151
150
return ;
152
151
throw std::runtime_error (" Node::changeMeter: Could not find meter " + meter_name);
153
152
}
154
153
155
154
void Node::changeLabel (const std::string& name, const std::string& value) {
156
- size_t theSize = labels_.size ();
157
- for (size_t i = 0 ; i < theSize; i++) {
158
- if (labels_[i].name () == name) {
159
- labels_[i].set_new_value (value);
160
- return ;
161
- }
155
+ auto found = ecf::algorithm::find_by_name (labels_, name);
156
+
157
+ if (found == std::end (labels_)) {
158
+ throw std::runtime_error (" Node::changeLabel: Could not find label " + name);
162
159
}
163
- throw std::runtime_error (" Node::changeLabel: Could not find label " + name);
160
+
161
+ found->set_new_value (value);
164
162
}
165
163
166
164
void Node::changeTrigger (const std::string& expression) {
@@ -241,30 +239,28 @@ void Node::change_time(const std::string& old, const std::string& new_time) {
241
239
TimeAttr old_attr (TimeSeries::create (old)); // can throw if parse fails
242
240
TimeAttr new_attr (TimeSeries::create (new_time)); // can throw if parse fails
243
241
244
- size_t theSize = times_.size ();
245
- for (size_t i = 0 ; i < theSize; i++) {
246
- // Dont use '==' since that compares additional state like free_
247
- if (times_[i].structureEquals (old_attr)) {
248
- times_[i] = new_attr;
249
- state_change_no_ = Ecf::incr_state_change_no ();
250
- return ;
251
- }
242
+ // Don't use '==' since that compares additional state like free_
243
+ auto found = ecf::algorithm::find_by (times_, [&](const auto & item) { return item.structureEquals (old_attr); });
244
+
245
+ if (found == std::end (times_)) {
246
+ throw std::runtime_error (" Node::change_time : Cannot find time attribute: " );
252
247
}
253
- throw std::runtime_error (" Node::change_time : Cannot find time attribute: " );
248
+
249
+ *found = new_attr;
250
+ state_change_no_ = Ecf::incr_state_change_no ();
254
251
}
255
252
256
253
void Node::change_today (const std::string& old, const std::string& new_time) {
257
254
TodayAttr old_attr (TimeSeries::create (old)); // can throw if parse fails
258
255
TodayAttr new_attr (TimeSeries::create (new_time)); // can throw if parse fails
259
256
260
- size_t theSize = todays_.size ();
261
- for (size_t i = 0 ; i < theSize; i++) {
262
- // Dont use '==' since that compares additional state like free_
263
- if (todays_[i].structureEquals (old_attr)) {
264
- todays_[i] = new_attr;
265
- state_change_no_ = Ecf::incr_state_change_no ();
266
- return ;
267
- }
257
+ // Don't use '==' since that compares additional state like free_
258
+ auto found = ecf::algorithm::find_by (todays_, [&](const auto & item) { return item.structureEquals (old_attr); });
259
+
260
+ if (found == std::end (todays_)) {
261
+ throw std::runtime_error (" Node::change_today : Cannot find time attribute: " );
268
262
}
269
- throw std::runtime_error (" Node::change_today : Cannot find today attribute: " );
263
+
264
+ *found = new_attr;
265
+ state_change_no_ = Ecf::incr_state_change_no ();
270
266
}
0 commit comments