Add FromFlatbuffer() overload taking a const reference

Takign a const reference better represents the input types that we can
actually accept.

Continue to accept a const pointer to ease implementation of things that
need to interact with existing flatbuffers code.

Change-Id: I7809777fb8584f16edddf41f4cd844776f3e2eba
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/flatbuffers/static_flatbuffers.cc b/aos/flatbuffers/static_flatbuffers.cc
index 70228e5..760d92c 100644
--- a/aos/flatbuffers/static_flatbuffers.cc
+++ b/aos/flatbuffers/static_flatbuffers.cc
@@ -518,22 +518,22 @@
   for (const FieldData &field : fields) {
     if (field.is_struct) {
       copiers.emplace_back(absl::StrFormat(R"code(
-      if (other->has_%s()) {
-        set_%s(*other->%s());
+      if (other.has_%s()) {
+        set_%s(*other.%s());
       }
       )code",
                                            field.name, field.name, field.name));
     } else if (field.is_inline) {
       copiers.emplace_back(absl::StrFormat(R"code(
-      if (other->has_%s()) {
-        set_%s(other->%s());
+      if (other.has_%s()) {
+        set_%s(other.%s());
       }
       )code",
                                            field.name, field.name, field.name));
     } else {
       copiers.emplace_back(absl::StrFormat(R"code(
-      if (other->has_%s()) {
-        if (!CHECK_NOTNULL(add_%s())->FromFlatbuffer(other->%s())) {
+      if (other.has_%s()) {
+        if (!CHECK_NOTNULL(add_%s())->FromFlatbuffer(other.%s())) {
           // Fail if we were unable to copy (e.g., if we tried to copy in a long
           // vector and do not have the space for it).
           return false;
@@ -549,11 +549,16 @@
   // returning true on success.
   // This is a deep copy, and will call FromFlatbuffer on any constituent
   // objects.
-  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer &other) {
     Clear();
     %s
     return true;
   }
+  // Equivalent to FromFlatbuffer(const Flatbuffer&); this overload is provided
+  // to ease implementation of the aos::fbs::Vector internals.
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+    return FromFlatbuffer(*CHECK_NOTNULL(other));
+  }
 )code",
       absl::StrJoin(copiers, "\n"));
 }
diff --git a/aos/flatbuffers/static_vector.h b/aos/flatbuffers/static_vector.h
index bf40ce5..6133075 100644
--- a/aos/flatbuffers/static_vector.h
+++ b/aos/flatbuffers/static_vector.h
@@ -334,7 +334,10 @@
   // we can allocate through reserve()).
   // This is a deep copy, and will call FromFlatbuffer on any constituent
   // objects.
-  [[nodiscard]] bool FromFlatbuffer(ConstFlatbuffer *vector);
+  [[nodiscard]] bool FromFlatbuffer(ConstFlatbuffer *vector) {
+    return FromFlatbuffer(*CHECK_NOTNULL(vector));
+  }
+  [[nodiscard]] bool FromFlatbuffer(ConstFlatbuffer &vector);
   // The remaining FromFlatbuffer() overloads are for when using the flatbuffer
   // "object" API, which uses std::vector's for representing vectors.
   [[nodiscard]] bool FromFlatbuffer(const std::vector<InlineType> &vector) {
@@ -634,10 +637,9 @@
   }
   // Implementation that handles copying from a flatbuffers::Vector of an inline
   // data type.
-  [[nodiscard]] bool FromInlineFlatbuffer(ConstFlatbuffer *vector) {
-    return FromData(
-        reinterpret_cast<const InlineType *>(CHECK_NOTNULL(vector)->Data()),
-        vector->size());
+  [[nodiscard]] bool FromInlineFlatbuffer(ConstFlatbuffer &vector) {
+    return FromData(reinterpret_cast<const InlineType *>(vector.Data()),
+                    vector.size());
   }
 
   // Implementation that handles copying from a flatbuffers::Vector of a
@@ -658,8 +660,8 @@
     return true;
   }
 
-  [[nodiscard]] bool FromNotInlineFlatbuffer(const Flatbuffer *vector) {
-    return FromNotInlineIterable(*vector);
+  [[nodiscard]] bool FromNotInlineFlatbuffer(const Flatbuffer &vector) {
+    return FromNotInlineIterable(vector);
   }
 
   // In order to allow for easy partial template specialization, we use a
@@ -764,7 +766,7 @@
   static constexpr size_t kDataSize = T::kSize;
   template <typename StaticVector>
   static bool FromFlatbuffer(
-      StaticVector *to, const typename StaticVector::ConstFlatbuffer *from) {
+      StaticVector *to, const typename StaticVector::ConstFlatbuffer &from) {
     return to->FromNotInlineFlatbuffer(from);
   }
   template <typename StaticVector>
@@ -786,7 +788,7 @@
   static constexpr size_t kDataSize = sizeof(T);
   template <typename StaticVector>
   static bool FromFlatbuffer(
-      StaticVector *to, const typename StaticVector::ConstFlatbuffer *from) {
+      StaticVector *to, const typename StaticVector::ConstFlatbuffer &from) {
     return to->FromInlineFlatbuffer(from);
   }
   template <typename StaticVector>
@@ -806,7 +808,7 @@
   static constexpr size_t kDataSize = 1u;
   template <typename StaticVector>
   static bool FromFlatbuffer(
-      StaticVector *to, const typename StaticVector::ConstFlatbuffer *from) {
+      StaticVector *to, const typename StaticVector::ConstFlatbuffer &from) {
     return to->FromInlineFlatbuffer(from);
   }
   template <typename StaticVector>
@@ -829,7 +831,7 @@
   static constexpr size_t kDataSize = sizeof(T);
   template <typename StaticVector>
   static bool FromFlatbuffer(
-      StaticVector *to, const typename StaticVector::ConstFlatbuffer *from) {
+      StaticVector *to, const typename StaticVector::ConstFlatbuffer &from) {
     return to->FromInlineFlatbuffer(from);
   }
   template <typename StaticVector>
@@ -842,7 +844,7 @@
 template <typename T, size_t kStaticLength, bool kInline, size_t kForceAlign,
           bool kNullTerminate>
 bool Vector<T, kStaticLength, kInline, kForceAlign,
-            kNullTerminate>::FromFlatbuffer(ConstFlatbuffer *vector) {
+            kNullTerminate>::FromFlatbuffer(ConstFlatbuffer &vector) {
   return internal::InlineWrapper<T, kInline>::FromFlatbuffer(this, vector);
 }
 
diff --git a/aos/flatbuffers/test_dir/sample_test_static.h b/aos/flatbuffers/test_dir/sample_test_static.h
index 8fc97da..57ac57a 100644
--- a/aos/flatbuffers/test_dir/sample_test_static.h
+++ b/aos/flatbuffers/test_dir/sample_test_static.h
@@ -137,15 +137,20 @@
   // returning true on success.
   // This is a deep copy, and will call FromFlatbuffer on any constituent
   // objects.
-  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer &other) {
     Clear();
 
-    if (other->has_field()) {
-      set_field(other->field());
+    if (other.has_field()) {
+      set_field(other.field());
     }
 
     return true;
   }
+  // Equivalent to FromFlatbuffer(const Flatbuffer&); this overload is provided
+  // to ease implementation of the aos::fbs::Vector internals.
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+    return FromFlatbuffer(*CHECK_NOTNULL(other));
+  }
 
   // Copies the contents of the provided flatbuffer into this flatbuffer,
   // returning true on success.
@@ -337,19 +342,24 @@
   // returning true on success.
   // This is a deep copy, and will call FromFlatbuffer on any constituent
   // objects.
-  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer &other) {
     Clear();
 
-    if (other->has_baz()) {
-      set_baz(other->baz());
+    if (other.has_baz()) {
+      set_baz(other.baz());
     }
 
-    if (other->has_foo()) {
-      set_foo(other->foo());
+    if (other.has_foo()) {
+      set_foo(other.foo());
     }
 
     return true;
   }
+  // Equivalent to FromFlatbuffer(const Flatbuffer&); this overload is provided
+  // to ease implementation of the aos::fbs::Vector internals.
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+    return FromFlatbuffer(*CHECK_NOTNULL(other));
+  }
 
   // Copies the contents of the provided flatbuffer into this flatbuffer,
   // returning true on success.
@@ -1106,109 +1116,108 @@
   // returning true on success.
   // This is a deep copy, and will call FromFlatbuffer on any constituent
   // objects.
-  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer &other) {
     Clear();
 
-    if (other->has_included_table()) {
+    if (other.has_included_table()) {
       if (!CHECK_NOTNULL(add_included_table())
-               ->FromFlatbuffer(other->included_table())) {
+               ->FromFlatbuffer(other.included_table())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_scalar()) {
-      set_scalar(other->scalar());
+    if (other.has_scalar()) {
+      set_scalar(other.scalar());
     }
 
-    if (other->has_string()) {
-      if (!CHECK_NOTNULL(add_string())->FromFlatbuffer(other->string())) {
+    if (other.has_string()) {
+      if (!CHECK_NOTNULL(add_string())->FromFlatbuffer(other.string())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_substruct()) {
-      set_substruct(*other->substruct());
+    if (other.has_substruct()) {
+      set_substruct(*other.substruct());
     }
 
-    if (other->has_subtable()) {
-      if (!CHECK_NOTNULL(add_subtable())->FromFlatbuffer(other->subtable())) {
+    if (other.has_subtable()) {
+      if (!CHECK_NOTNULL(add_subtable())->FromFlatbuffer(other.subtable())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_unspecified_length_string()) {
+    if (other.has_unspecified_length_string()) {
       if (!CHECK_NOTNULL(add_unspecified_length_string())
-               ->FromFlatbuffer(other->unspecified_length_string())) {
+               ->FromFlatbuffer(other.unspecified_length_string())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_unspecified_length_vector()) {
+    if (other.has_unspecified_length_vector()) {
       if (!CHECK_NOTNULL(add_unspecified_length_vector())
-               ->FromFlatbuffer(other->unspecified_length_vector())) {
+               ->FromFlatbuffer(other.unspecified_length_vector())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_unspecified_length_vector_of_strings()) {
+    if (other.has_unspecified_length_vector_of_strings()) {
       if (!CHECK_NOTNULL(add_unspecified_length_vector_of_strings())
-               ->FromFlatbuffer(
-                   other->unspecified_length_vector_of_strings())) {
+               ->FromFlatbuffer(other.unspecified_length_vector_of_strings())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_vector_aligned()) {
+    if (other.has_vector_aligned()) {
       if (!CHECK_NOTNULL(add_vector_aligned())
-               ->FromFlatbuffer(other->vector_aligned())) {
+               ->FromFlatbuffer(other.vector_aligned())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_vector_of_scalars()) {
+    if (other.has_vector_of_scalars()) {
       if (!CHECK_NOTNULL(add_vector_of_scalars())
-               ->FromFlatbuffer(other->vector_of_scalars())) {
+               ->FromFlatbuffer(other.vector_of_scalars())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_vector_of_strings()) {
+    if (other.has_vector_of_strings()) {
       if (!CHECK_NOTNULL(add_vector_of_strings())
-               ->FromFlatbuffer(other->vector_of_strings())) {
+               ->FromFlatbuffer(other.vector_of_strings())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_vector_of_structs()) {
+    if (other.has_vector_of_structs()) {
       if (!CHECK_NOTNULL(add_vector_of_structs())
-               ->FromFlatbuffer(other->vector_of_structs())) {
+               ->FromFlatbuffer(other.vector_of_structs())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
       }
     }
 
-    if (other->has_vector_of_tables()) {
+    if (other.has_vector_of_tables()) {
       if (!CHECK_NOTNULL(add_vector_of_tables())
-               ->FromFlatbuffer(other->vector_of_tables())) {
+               ->FromFlatbuffer(other.vector_of_tables())) {
         // Fail if we were unable to copy (e.g., if we tried to copy in a long
         // vector and do not have the space for it).
         return false;
@@ -1217,6 +1226,11 @@
 
     return true;
   }
+  // Equivalent to FromFlatbuffer(const Flatbuffer&); this overload is provided
+  // to ease implementation of the aos::fbs::Vector internals.
+  [[nodiscard]] bool FromFlatbuffer(const Flatbuffer *other) {
+    return FromFlatbuffer(*CHECK_NOTNULL(other));
+  }
 
   // Copies the contents of the provided flatbuffer into this flatbuffer,
   // returning true on success.
diff --git a/documentation/aos/docs/flatbuffers.md b/documentation/aos/docs/flatbuffers.md
index 4ff6520..a57e465 100644
--- a/documentation/aos/docs/flatbuffers.md
+++ b/documentation/aos/docs/flatbuffers.md
@@ -454,7 +454,7 @@
   space allocated for the vector; returns false on failure (e.g., if you are in
   a fixed-size allocator that does not support increasing the size past a
   certain point).
-* `bool FromFlatbuffer(const flatbuffers::Vector<>*)`: Attempts to copy an
+* `bool FromFlatbuffer(const flatbuffers::Vector<>&)`: Attempts to copy an
   existing vector into this `Vector`. This may attempt to call `reserve()`
   if the new vector is longer than `capacity()`. If the copy fails for
   any reason, returns `false`.