Add UnpackFlatbuffer() method for quality-of-life

Change-Id: I211d3642b39f6183d5f1694931c03ac7f00dd0f0
Signed-off-by: James Kuszmaul <jabukuszmaul+collab@gmail.com>
diff --git a/aos/flatbuffers.h b/aos/flatbuffers.h
index ed9c8ac..a299fe9 100644
--- a/aos/flatbuffers.h
+++ b/aos/flatbuffers.h
@@ -529,6 +529,15 @@
   std::shared_ptr<absl::Span<uint8_t>> span_;
 };
 
+// The regular flatbuffer API makes it surprisingly irritating to unpack an
+// Object into an ObjectT without a bunch of extra lines.
+template <typename T>
+T::NativeTableType UnpackFlatbuffer(const T *fbs) {
+  typename T::NativeTableType object;
+  fbs->UnPackTo(&object);
+  return object;
+}
+
 }  // namespace aos
 
 #endif  // AOS_FLATBUFFERS_H_
diff --git a/aos/flatbuffers_test.cc b/aos/flatbuffers_test.cc
index dbbe817..333d5d7 100644
--- a/aos/flatbuffers_test.cc
+++ b/aos/flatbuffers_test.cc
@@ -23,6 +23,16 @@
   EXPECT_FALSE(empty.Verify());
 }
 
+// Test that the UnpackFlatbuffer builds & works.
+TEST(FlatbufferTest, UnpackFlatbuffer) {
+  const FlatbufferDetachedBuffer<Location> fb =
+      JsonToFlatbuffer<Location>("{\"name\": \"abc\", \"frequency\": 971}");
+
+  LocationT object = UnpackFlatbuffer(&fb.message());
+  EXPECT_EQ("abc", object.name);
+  EXPECT_EQ(971, object.frequency);
+}
+
 // Tests the ability to map a flatbuffer on disk to memory
 TEST(FlatbufferMMapTest, Verify) {
   FlatbufferDetachedBuffer<Configuration> fb =