[ox] Correct bad bit_cast uses and improve constexpr-ness
(synced from 1f24912ddd)
This commit is contained in:
+21
-14
@@ -90,7 +90,9 @@ class MetalClawReader {
|
||||
StringLength stringLength(const char *name) noexcept;
|
||||
|
||||
template<typename T = std::nullptr_t>
|
||||
void setTypeInfo(const char *name = getModelTypeName<T>(), int fields = countFields<T>()) noexcept;
|
||||
constexpr void setTypeInfo() noexcept;
|
||||
|
||||
constexpr void setTypeInfo(const char *name, int fields) noexcept;
|
||||
|
||||
/**
|
||||
* Returns a MetalClawReader to parse a child object.
|
||||
@@ -128,7 +130,7 @@ 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
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
if (m_fieldPresence.get(static_cast<std::size_t>(m_field))) {
|
||||
oxRequire(len, arrayLength(name, false));
|
||||
val->resize(len);
|
||||
}
|
||||
@@ -148,7 +150,7 @@ Error MetalClawReader::field(const char *name, T *val) noexcept {
|
||||
|
||||
template<typename U>
|
||||
Error MetalClawReader::field(const char*, UnionView<U> val) noexcept {
|
||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && val.get() && m_fieldPresence.get(m_field)) {
|
||||
if ((m_unionIdx == -1 || m_unionIdx == m_field) && val.get() && m_fieldPresence.get(static_cast<std::size_t>(m_field))) {
|
||||
auto reader = child("", val.idx());
|
||||
oxReturnError(model(&reader, val.get()));
|
||||
}
|
||||
@@ -164,7 +166,7 @@ Error MetalClawReader::field(const char *name, BString<L> *val) noexcept {
|
||||
template<typename I>
|
||||
Error MetalClawReader::readInteger(I *val) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
if (m_fieldPresence.get(static_cast<std::size_t>(m_field))) {
|
||||
std::size_t bytesRead = 0;
|
||||
if (m_buffIt >= m_buffLen) {
|
||||
oxTrace("ox::MetalClaw::readInteger") << "Buffer ended";
|
||||
@@ -186,7 +188,7 @@ Error MetalClawReader::readInteger(I *val) noexcept {
|
||||
template<typename T>
|
||||
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)) {
|
||||
if (m_fieldPresence.get(static_cast<std::size_t>(m_field))) {
|
||||
// read the length
|
||||
if (m_buffIt >= m_buffLen) {
|
||||
return OxError(MC_BUFFENDED);
|
||||
@@ -198,7 +200,7 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) noexc
|
||||
// read the list
|
||||
if (valLen >= len) {
|
||||
auto reader = child("");
|
||||
reader.setTypeInfo("List", len);
|
||||
reader.setTypeInfo("List", static_cast<int>(len));
|
||||
for (std::size_t i = 0; i < len; i++) {
|
||||
oxReturnError(reader.field("", &val[i]));
|
||||
}
|
||||
@@ -215,7 +217,7 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) noexc
|
||||
template<typename T>
|
||||
Error MetalClawReader::field(const char*, HashMap<String, T> *val) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
if (m_fieldPresence.get(static_cast<std::size_t>(m_field))) {
|
||||
// read the length
|
||||
if (m_buffIt >= m_buffLen) {
|
||||
return OxError(MC_BUFFENDED);
|
||||
@@ -226,11 +228,12 @@ Error MetalClawReader::field(const char*, HashMap<String, T> *val) noexcept {
|
||||
|
||||
// read the list
|
||||
auto reader = child("");
|
||||
reader.setTypeInfo("List", len);
|
||||
reader.setTypeInfo("List", static_cast<int>(len));
|
||||
for (std::size_t i = 0; i < len; i++) {
|
||||
const auto keyLen = reader.stringLength(nullptr);
|
||||
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
||||
oxReturnError(reader.field("", SerStr(wkey.get(), keyLen)));
|
||||
auto wkeyPtr = wkey.get();
|
||||
oxReturnError(reader.field("", SerStr(&wkeyPtr, static_cast<int>(keyLen))));
|
||||
oxReturnError(reader.field("", &val->operator[](wkey.get())));
|
||||
}
|
||||
}
|
||||
@@ -242,7 +245,7 @@ Error MetalClawReader::field(const char*, HashMap<String, T> *val) noexcept {
|
||||
template<typename T, typename Handler>
|
||||
Error MetalClawReader::field(const char*, Handler handler) noexcept {
|
||||
if (m_unionIdx == -1 || m_unionIdx == m_field) {
|
||||
if (m_fieldPresence.get(m_field)) {
|
||||
if (m_fieldPresence.get(static_cast<std::size_t>(m_field))) {
|
||||
// read the length
|
||||
if (m_buffIt >= m_buffLen) {
|
||||
return OxError(MC_BUFFENDED);
|
||||
@@ -253,7 +256,7 @@ Error MetalClawReader::field(const char*, Handler handler) noexcept {
|
||||
|
||||
// read the list
|
||||
auto reader = child("");
|
||||
reader.setTypeInfo("List", len);
|
||||
reader.setTypeInfo("List", static_cast<int>(len));
|
||||
for (std::size_t i = 0; i < len; i++) {
|
||||
T val;
|
||||
oxReturnError(reader.field("", &val));
|
||||
@@ -266,16 +269,20 @@ Error MetalClawReader::field(const char*, Handler handler) noexcept {
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void MetalClawReader::setTypeInfo(const char*, int fields) noexcept {
|
||||
constexpr void MetalClawReader::setTypeInfo() noexcept {
|
||||
setTypeInfo(ModelTypeName_v<T>, countFields<T>());
|
||||
}
|
||||
|
||||
constexpr void MetalClawReader::setTypeInfo(const char*, int fields) noexcept {
|
||||
m_fields = fields;
|
||||
m_buffIt = (fields / 8 + 1) - (fields % 8 == 0);
|
||||
m_buffIt = static_cast<std::size_t>((fields / 8 + 1) - (fields % 8 == 0));
|
||||
m_fieldPresence.setFields(fields);
|
||||
m_fieldPresence.setMaxLen(static_cast<int>(m_buffIt));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Error readMC(const char *buff, std::size_t buffLen, T *val) noexcept {
|
||||
MetalClawReader reader(bit_cast<uint8_t*>(buff), buffLen);
|
||||
MetalClawReader reader(reinterpret_cast<const uint8_t*>(buff), buffLen);
|
||||
return model(&reader, val);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user