Add array support to MetalClaw

This commit is contained in:
2017-04-29 08:15:31 -05:00
parent 80ecd429c3
commit 99c3ca72f5
3 changed files with 20 additions and 7 deletions
+3 -2
View File
@@ -39,7 +39,7 @@ class MetalClawReader {
int op(const char*, bool *val);
template<typename T>
int op(const char*, T **val, size_t len);
int op(const char*, T *val, size_t len);
template<typename T>
int op(const char*, T *val);
@@ -111,7 +111,7 @@ int MetalClawReader::readInteger(I *val) {
};
template<typename T>
int MetalClawReader::op(const char*, T **val, size_t valLen) {
int MetalClawReader::op(const char*, T *val, size_t valLen) {
int err = 0;
if (m_fieldPresence.get(m_field)) {
// read the length
@@ -131,6 +131,7 @@ int MetalClawReader::op(const char*, T **val, size_t valLen) {
for (size_t i = 0; i < len; i++) {
err |= reader.op("", &val[i]);
}
m_buffIt += reader.m_buffIt;
} else {
err = MC_OUTBUFFENDED;
}
+10
View File
@@ -27,6 +27,7 @@ struct TestStruct {
bool Bool = false;
int32_t Int = 0;
bstring<32> String = "";
int List[4] = {0, 0, 0 , 0};
TestStructNest Struct;
};
@@ -47,6 +48,7 @@ int ioOp(T *io, TestStruct *obj) {
err |= io->op("Bool", &obj->Bool);
err |= io->op("Int", &obj->Int);
err |= io->op("String", &obj->String);
err |= io->op("List", obj->List, 4);
err |= io->op("Struct", &obj->Struct);
return err;
}
@@ -81,6 +83,10 @@ map<string, int(*)(string)> tests = {
testIn.Bool = true;
testIn.Int = 42;
testIn.String = "Test String 1";
testIn.List[0] = 1;
testIn.List[1] = 2;
testIn.List[2] = 3;
testIn.List[3] = 4;
testIn.Struct.Bool = false;
testIn.Struct.Int = 300;
testIn.Struct.String = "Test String 2";
@@ -91,6 +97,10 @@ map<string, int(*)(string)> tests = {
err |= !(testIn.Bool == testOut.Bool);
err |= !(testIn.Int == testOut.Int);
err |= !(testIn.String == testOut.String);
err |= !(testIn.List[0] == testOut.List[0]);
err |= !(testIn.List[1] == testOut.List[1]);
err |= !(testIn.List[2] == testOut.List[2]);
err |= !(testIn.List[3] == testOut.List[3]);
err |= !(testIn.Struct.Bool == testOut.Struct.Bool);
err |= !(testIn.Struct.Int == testOut.Struct.Int);
err |= !(testIn.Struct.String == testOut.Struct.String);
+7 -5
View File
@@ -39,7 +39,7 @@ class MetalClawWriter {
int op(const char*, bool *val);
template<typename T>
int op(const char*, T **val, size_t len);
int op(const char*, T *val, size_t len);
template<size_t L>
int op(const char*, ox::bstring<L> *val);
@@ -106,11 +106,9 @@ int MetalClawWriter::appendInteger(I val) {
};
template<typename T>
int MetalClawWriter::op(const char *fieldName, T **val, size_t len) {
int MetalClawWriter::op(const char*, T *val, size_t len) {
int err = 0;
bool fieldSet = false;
MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt);
writer.setFields(len);
// write the length
typedef uint32_t ArrayLength;
@@ -121,11 +119,15 @@ int MetalClawWriter::op(const char *fieldName, T **val, size_t len) {
err = MC_BUFFENDED;
}
MetalClawWriter writer(m_buff + m_buffIt, m_buffLen - m_buffIt);
writer.setFields(len);
// write the string
for (size_t i = 0; i < len; i++) {
err |= writer.op("", val[i]);
err |= writer.op("", &val[i]);
}
m_buffIt += writer.m_buffIt;
fieldSet = true;
err |= m_fieldPresence.set(m_field, fieldSet);