- 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
- // Read lines until I reach something for me (which breaks in loop body) or end of file reached
- while (true) {
- std::string action_line;
- read_and_trim_line(action_fs, &action_line);
- if (action_fs->eof())
- break;
- /* 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;
- try {
- otherqueue = action_queues.at(evtname);
- } catch (std::out_of_range& unfound) { // 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;