Add PartsMessageReader to read part files

This abstracts the multi-part reading logic out to simplify the new log
sorting code.

Change-Id: I83f673fea9f3b9b584eec58bd111da76b2fc2d85
diff --git a/aos/events/logging/logfile_utils.cc b/aos/events/logging/logfile_utils.cc
index 908e5e1..6b7a598 100644
--- a/aos/events/logging/logfile_utils.cc
+++ b/aos/events/logging/logfile_utils.cc
@@ -431,6 +431,32 @@
   return std::move(result);
 }
 
+PartsMessageReader::PartsMessageReader(LogParts log_parts)
+    : parts_(std::move(log_parts)), message_reader_(parts_.parts[0]) {}
+
+std::optional<FlatbufferVector<MessageHeader>>
+PartsMessageReader::ReadMessage() {
+  while (!done_) {
+    std::optional<FlatbufferVector<MessageHeader>> message =
+        message_reader_.ReadMessage();
+    if (message) {
+      newest_timestamp_ = message_reader_.newest_timestamp();
+      return message;
+    }
+    NextLog();
+  }
+  return std::nullopt;
+}
+
+void PartsMessageReader::NextLog() {
+  if (next_part_index_ == parts_.parts.size()) {
+    done_ = true;
+    return;
+  }
+  message_reader_ = MessageReader(parts_.parts[next_part_index_]);
+  ++next_part_index_;
+}
+
 SplitMessageReader::SplitMessageReader(
     const std::vector<std::string> &filenames)
     : filenames_(filenames),