Browse Source

AK: Add helper type for serializing structures into buffer

Sahan Fernando 4 years ago
parent
commit
217415226e
1 changed files with 47 additions and 0 deletions
  1. 47 0
      AK/BinaryBufferWriter.h

+ 47 - 0
AK/BinaryBufferWriter.h

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2021, Sahan Fernando <sahan.h.fernando@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Span.h>
+#include <AK/StdLibExtraDetails.h>
+
+namespace AK {
+
+class BinaryBufferWriter {
+public:
+    BinaryBufferWriter(Bytes target)
+        : m_target(target)
+    {
+    }
+
+    template<typename T>
+    requires(AK::Detail::IsTriviallyConstructible<T>) T& append_structure()
+    {
+        VERIFY((reinterpret_cast<FlatPtr>(m_target.data()) + m_offset) % alignof(T) == 0);
+        VERIFY(m_offset + sizeof(T) <= m_target.size());
+        T* allocated = new (m_target.data() + m_offset) T;
+        m_offset += sizeof(T);
+        return *allocated;
+    }
+
+    void skip_bytes(size_t num_bytes)
+    {
+        VERIFY(m_offset + num_bytes <= m_target.size());
+        m_offset += num_bytes;
+    }
+
+    [[nodiscard]] size_t current_offset() const
+    {
+        return m_offset;
+    }
+
+private:
+    Bytes m_target;
+    size_t m_offset { 0 };
+};
+
+}