Move uuid to //aos:uuid
It is getting usage significantly further outside the logger. Time to
promote it somewhere better. I only see it getting used more.
Change-Id: I754739347212f5a3154f68c7b7fc84b9a9074d90
diff --git a/aos/uuid.h b/aos/uuid.h
new file mode 100644
index 0000000..d12bedf
--- /dev/null
+++ b/aos/uuid.h
@@ -0,0 +1,74 @@
+#ifndef AOS_EVENTS_LOGGING_UUID_H_
+#define AOS_EVENTS_LOGGING_UUID_H_
+
+#include <array>
+#include <ostream>
+#include <string>
+
+#include "absl/types/span.h"
+#include "flatbuffers/flatbuffers.h"
+
+namespace aos {
+
+// Class to generate and hold a UUID.
+class UUID {
+ public:
+ // Size of a UUID both as a string and the raw data.
+ static constexpr size_t kStringSize = 36;
+ static constexpr size_t kDataSize = 16;
+
+ // Returns a randomly generated UUID. This is known as a UUID4.
+ static UUID Random();
+
+ // Returns a uuid with all '0's.
+ static UUID Zero();
+
+ // Converts a string UUID of the form 00000000-0000-0000-0000-000000000000 to
+ // a UUID.
+ static UUID FromString(std::string_view string);
+ static UUID FromString(const flatbuffers::String *string);
+
+ // Converts a 16 byte vector (128 bits) to a UUID. This requires no
+ // transformation.
+ static UUID FromVector(const flatbuffers::Vector<uint8_t> *data);
+
+ // Returns the boot UUID for the current linux computer.
+ static UUID BootUUID();
+
+ // Default constructor which builds an uninitialized UUID. Use one of the
+ // static methods if you want something more useful.
+ UUID() {}
+
+ // Packs this UUID into a flatbuffer as a string.
+ flatbuffers::Offset<flatbuffers::String> PackString(
+ flatbuffers::FlatBufferBuilder *fbb) const;
+ // Copies this UUID as a string into the memory pointed by result. Result
+ // must be at least kStringSize long.
+ void CopyTo(char *result) const;
+ // Returns this UUID as a string.
+ std::string ToString() const;
+
+ // Packs the UUID bytes directly into a vector.
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> PackVector(
+ flatbuffers::FlatBufferBuilder *fbb) const;
+
+ // Returns the underlying UUID data.
+ absl::Span<const uint8_t> span() const {
+ return absl::Span<const uint8_t>(data_.data(), data_.size());
+ }
+
+ bool operator==(const UUID &other) const { return other.span() == span(); }
+ bool operator!=(const UUID &other) const { return other.span() != span(); }
+
+ private:
+ friend std::ostream &operator<<(std::ostream &os, const UUID &uuid);
+
+ // Encoded storage for the data.
+ std::array<uint8_t, kDataSize> data_;
+};
+
+std::ostream &operator<<(std::ostream &os, const UUID &uuid);
+
+} // namespace aos
+
+#endif // AOS_EVENTS_LOGGING_UUID_H_