+42
-37
@@ -10,7 +10,9 @@
|
||||
|
||||
#include <ox/model/fieldcounter.hpp>
|
||||
#include <ox/model/optype.hpp>
|
||||
#include <ox/model/typenamecatcher.hpp>
|
||||
#include <ox/model/types.hpp>
|
||||
#include <ox/std/buffer.hpp>
|
||||
#include <ox/std/byteswap.hpp>
|
||||
#include <ox/std/string.hpp>
|
||||
#include <ox/std/trace.hpp>
|
||||
@@ -40,86 +42,89 @@ class MetalClawReader {
|
||||
|
||||
~MetalClawReader() noexcept;
|
||||
|
||||
Error field(const char*, int8_t *val);
|
||||
Error field(const char*, int16_t *val);
|
||||
Error field(const char*, int32_t *val);
|
||||
Error field(const char*, int64_t *val);
|
||||
Error field(const char*, int8_t *val) noexcept;
|
||||
Error field(const char*, int16_t *val) noexcept;
|
||||
Error field(const char*, int32_t *val) noexcept;
|
||||
Error field(const char*, int64_t *val) noexcept;
|
||||
|
||||
Error field(const char*, uint8_t *val);
|
||||
Error field(const char*, uint16_t *val);
|
||||
Error field(const char*, uint32_t *val);
|
||||
Error field(const char*, uint64_t *val);
|
||||
Error field(const char*, uint8_t *val) noexcept;
|
||||
Error field(const char*, uint16_t *val) noexcept;
|
||||
Error field(const char*, uint32_t *val) noexcept;
|
||||
Error field(const char*, uint64_t *val) noexcept;
|
||||
|
||||
Error field(const char*, bool *val);
|
||||
Error field(const char*, bool *val) noexcept;
|
||||
|
||||
// array handler
|
||||
template<typename T>
|
||||
Error field(const char*, T *val, std::size_t len);
|
||||
Error field(const char*, T *val, std::size_t len) noexcept;
|
||||
|
||||
// map handler
|
||||
template<typename T>
|
||||
Error field(const char*, HashMap<String, T> *val);
|
||||
Error field(const char*, HashMap<String, T> *val) noexcept;
|
||||
|
||||
// array handler, with callback to allow handling individual elements
|
||||
template<typename T, typename Handler>
|
||||
Error field(const char*, Handler handler);
|
||||
Error field(const char*, Handler handler) noexcept;
|
||||
|
||||
template<typename T>
|
||||
Error field(const char*, T *val);
|
||||
Error field(const char*, T *val) noexcept;
|
||||
|
||||
template<typename U>
|
||||
Error field(const char*, UnionView<U> val);
|
||||
Error field(const char*, UnionView<U> val) noexcept;
|
||||
|
||||
template<std::size_t L>
|
||||
Error field(const char*, BString<L> *val);
|
||||
Error field(const char*, const BString<L> *val) noexcept;
|
||||
|
||||
Error field(const char*, SerStr val);
|
||||
Error field(const char*, SerStr val) noexcept;
|
||||
|
||||
/**
|
||||
* Reads an array length from the current location in the buffer.
|
||||
* @param pass indicates that the parsing should iterate past the array length
|
||||
*/
|
||||
Result<ArrayLength> arrayLength(const char *name, bool pass = true);
|
||||
Result<ArrayLength> arrayLength(const char *name, bool pass = true) noexcept;
|
||||
|
||||
/**
|
||||
* Reads an string length from the current location in the buffer.
|
||||
*/
|
||||
[[nodiscard]]
|
||||
StringLength stringLength(const char *name);
|
||||
StringLength stringLength(const char *name) noexcept;
|
||||
|
||||
template<typename T = std::nullptr_t>
|
||||
void setTypeInfo(const char *name = T::TypeName, int fields = countFields<T>());
|
||||
void setTypeInfo(const char *name = getModelTypeName<T>(), int fields = countFields<T>()) noexcept;
|
||||
|
||||
/**
|
||||
* Returns a MetalClawReader to parse a child object.
|
||||
*/
|
||||
[[nodiscard]]
|
||||
MetalClawReader child(const char *name, int unionIdx = -1);
|
||||
MetalClawReader child(const char *name, int unionIdx = -1) noexcept;
|
||||
|
||||
/**
|
||||
* Indicates whether or not the next field to be read is present.
|
||||
*/
|
||||
bool fieldPresent(const char *name) const;
|
||||
[[nodiscard]]
|
||||
bool fieldPresent(const char *name) const noexcept;
|
||||
|
||||
/**
|
||||
* Indicates whether or not the given field is present.
|
||||
*/
|
||||
bool fieldPresent(int fieldNo) const;
|
||||
[[nodiscard]]
|
||||
bool fieldPresent(int fieldNo) const noexcept;
|
||||
|
||||
void nextField() noexcept;
|
||||
|
||||
static constexpr auto opType() {
|
||||
[[nodiscard]]
|
||||
static constexpr auto opType() noexcept {
|
||||
return OpType::Read;
|
||||
}
|
||||
|
||||
private:
|
||||
template<typename I>
|
||||
Error readInteger(I *val);
|
||||
Error readInteger(I *val) noexcept;
|
||||
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
Error MetalClawReader::field(const char *name, T *val) {
|
||||
Error MetalClawReader::field(const char *name, T *val) noexcept {
|
||||
if constexpr(isVector_v<T>) {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
// set size of val if the field is present, don't worry about it if not
|
||||
@@ -142,7 +147,7 @@ Error MetalClawReader::field(const char *name, T *val) {
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
Error MetalClawReader::field(const char*, UnionView<U> val) {
|
||||
Error MetalClawReader::field(const char*, UnionView<U> val) noexcept {
|
||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && val.get() && m_fieldPresence.get(m_field)) {
|
||||
auto reader = child("", val.idx());
|
||||
oxReturnError(model(&reader, val.get()));
|
||||
@@ -152,12 +157,12 @@ Error MetalClawReader::field(const char*, UnionView<U> val) {
|
||||
}
|
||||
|
||||
template<std::size_t L>
|
||||
Error MetalClawReader::field(const char *name, BString<L> *val) {
|
||||
Error MetalClawReader::field(const char *name, const BString<L> *val) noexcept {
|
||||
return field(name, SerStr(val->data(), val->cap()));
|
||||
}
|
||||
|
||||
template<typename I>
|
||||
Error MetalClawReader::readInteger(I *val) {
|
||||
Error MetalClawReader::readInteger(I *val) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
std::size_t bytesRead = 0;
|
||||
@@ -179,7 +184,7 @@ Error MetalClawReader::readInteger(I *val) {
|
||||
|
||||
// array handler
|
||||
template<typename T>
|
||||
Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
|
||||
Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
// read the length
|
||||
@@ -208,7 +213,7 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Error MetalClawReader::field(const char*, HashMap<String, T> *val) {
|
||||
Error MetalClawReader::field(const char*, HashMap<String, T> *val) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
// read the length
|
||||
@@ -235,7 +240,7 @@ Error MetalClawReader::field(const char*, HashMap<String, T> *val) {
|
||||
}
|
||||
|
||||
template<typename T, typename Handler>
|
||||
Error MetalClawReader::field(const char*, Handler handler) {
|
||||
Error MetalClawReader::field(const char*, Handler handler) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
// read the length
|
||||
@@ -261,28 +266,28 @@ Error MetalClawReader::field(const char*, Handler handler) {
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void MetalClawReader::setTypeInfo(const char*, int fields) {
|
||||
void MetalClawReader::setTypeInfo(const char*, int fields) noexcept {
|
||||
m_fields = fields;
|
||||
m_buffIt = (fields / 8 + 1) - (fields % 8 == 0);
|
||||
m_fieldPresence.setFields(fields);
|
||||
m_fieldPresence.setMaxLen(m_buffIt);
|
||||
m_fieldPresence.setMaxLen(static_cast<int>(m_buffIt));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Error readMC(const char *buff, std::size_t buffLen, T *val) {
|
||||
Error readMC(const char *buff, std::size_t buffLen, T *val) noexcept {
|
||||
MetalClawReader reader(bit_cast<uint8_t*>(buff), buffLen);
|
||||
return model(&reader, val);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Result<T> readMC(const char *buff, std::size_t buffLen) {
|
||||
Result<T> readMC(const char *buff, std::size_t buffLen) noexcept {
|
||||
T val;
|
||||
oxReturnError(readMC(buff, buffLen, &val));
|
||||
return move(val);
|
||||
return val;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Result<T> readMC(const Vector<char> &buff) {
|
||||
Result<T> readMC(const Buffer &buff) noexcept {
|
||||
return readMC<T>(buff.data(), buff.size());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user