- ReplayAction* action;
-
- std::queue<ReplayAction*>* myqueue = nullptr;
- if (action_queues.find(std::string(name)) != action_queues.end())
- myqueue = action_queues.at(std::string(name));
- if (myqueue == nullptr || myqueue->empty()) { // Nothing stored for me. Read the file further
- if (action_fs == nullptr) { // File closed now. There's nothing more to read. I'm out of here
- goto todo_done;
- }
- // Read lines until I reach something for me (which breaks in loop body) or end of file reached
- while (!action_fs->eof()) {
- std::string action_line;
- read_and_trim_line(action_fs, &action_line);
- if (action_line.length() > 0 && action_line.find("#") == std::string::npos) {
- /* we cannot split in place here because we parse&store several lines for the colleagues... */
- action = new ReplayAction();
- boost::split(*action, action_line, boost::is_any_of(" \t"), boost::token_compress_on);
-
- // if it's for me, I'm done
- std::string evtname = action->front();
- if (evtname.compare(name) == 0) {
- return action;
- } else {
- // Else, I have to store it for the relevant colleague
- std::queue<ReplayAction*>* otherqueue = nullptr;
- if (action_queues.find(evtname) != action_queues.end())
- otherqueue = action_queues.at(evtname);
- if (otherqueue == nullptr) { // Damn. Create the queue of that guy
- otherqueue = new std::queue<ReplayAction*>();
- action_queues.insert({evtname, otherqueue});
- }
- otherqueue->push(action);
- }
- }
+ if (auto queue_elt = action_queues.find(name); queue_elt != action_queues.end()) {
+ if (auto& my_queue = queue_elt->second; not my_queue.empty()) {
+ // Get something from my queue and return it
+ auto action = std::move(my_queue.front());
+ my_queue.pop();
+ return action;