[ox/mc] Add def writer

This commit is contained in:
2019-02-11 05:59:33 +00:00
parent 96c56e2589
commit 75aeedb7b5
20 changed files with 468 additions and 17 deletions

View File

@@ -21,6 +21,7 @@ class MetalClawWriter {
private:
FieldPresenseMask m_fieldPresence;
const char *m_typeName = nullptr;
int m_fields = 0;
int m_field = 0;
std::size_t m_buffIt = 0;
@@ -30,6 +31,8 @@ class MetalClawWriter {
public:
MetalClawWriter(uint8_t *buff, std::size_t buffLen);
~MetalClawWriter() noexcept;
int op(const char*, int8_t *val);
int op(const char*, int16_t *val);
int op(const char*, int32_t *val);
@@ -54,7 +57,7 @@ class MetalClawWriter {
template<typename T>
int op(const char*, T *val);
void setFields(int fields);
void setTypeInfo(const char *name, int fields);
std::size_t size();
@@ -96,10 +99,12 @@ int MetalClawWriter::op(const char*, T *val) {
int err = 0;
bool fieldSet = false;
MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt);
err |= ioOp(&writer, val);
if (static_cast<std::size_t>(writer.m_fieldPresence.getMaxLen()) < writer.m_buffIt) {
m_buffIt += writer.m_buffIt;
fieldSet = true;
if (val) {
err |= ioOp(&writer, val);
if (static_cast<std::size_t>(writer.m_fieldPresence.getMaxLen()) < writer.m_buffIt) {
m_buffIt += writer.m_buffIt;
fieldSet = true;
}
}
err |= m_fieldPresence.set(m_field, fieldSet);
m_field++;
@@ -140,7 +145,7 @@ int MetalClawWriter::op(const char*, T *val, std::size_t len) {
}
MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt);
writer.setFields(len);
writer.setTypeInfo("List", len);
// write the array
for (std::size_t i = 0; i < len; i++) {