Improve flatbuffer reflection performance
Change-Id: I86b4ce21e8fe4ac2913dcd2c9e3c466c3f66a227
diff --git a/aos/fast_string_builder.cc b/aos/fast_string_builder.cc
new file mode 100644
index 0000000..97d2fea
--- /dev/null
+++ b/aos/fast_string_builder.cc
@@ -0,0 +1,67 @@
+#include "fast_string_builder.h"
+
+namespace aos {
+
+FastStringBuilder::FastStringBuilder(std::size_t initial_size) {
+ str_.reserve(initial_size);
+}
+
+void FastStringBuilder::Reset() { str_.resize(0); }
+
+std::string_view FastStringBuilder::Result() const {
+ return std::string_view(str_);
+}
+
+std::string FastStringBuilder::MoveResult() {
+ std::string result;
+ result.swap(str_);
+ return result;
+}
+
+void FastStringBuilder::Resize(std::size_t chars_needed) {
+ str_.resize(str_.size() + chars_needed);
+}
+
+void FastStringBuilder::Append(std::string_view str) {
+ std::size_t index = str_.size();
+ Resize(str.size());
+ str_.replace(index, str.size(), str, 0);
+}
+
+void FastStringBuilder::Append(float val) {
+ std::size_t index = str_.size();
+ Resize(17);
+ int result = absl::SNPrintF(str_.data() + index, 17, "%.6g", val);
+ PCHECK(result != -1);
+ CHECK(result < 17);
+ str_.resize(index + result);
+}
+
+void FastStringBuilder::Append(double val) {
+ std::size_t index = str_.size();
+ Resize(25);
+ int result = absl::SNPrintF(str_.data() + index, 25, "%.15g", val);
+ PCHECK(result != -1);
+ CHECK(result < 25);
+ str_.resize(index + result);
+}
+
+void FastStringBuilder::AppendChar(char val) {
+ Resize(1);
+ str_[str_.size() - 1] = val;
+}
+
+void FastStringBuilder::AppendBool(bool val) {
+ if (bool_to_str_) {
+ Append(val ? kTrue : kFalse);
+ } else {
+ AppendChar(val ? '1' : '0');
+ }
+}
+
+std::ostream &operator<<(std::ostream &os, const FastStringBuilder &builder) {
+ os.write(builder.str_.data(), builder.str_.size());
+ return os;
+}
+
+} // namespace aos