[ox/oc] Fix OC not dealing with certain int types properly
All checks were successful
Build / build (push) Successful in 2m33s
All checks were successful
Build / build (push) Successful in 2m33s
This commit is contained in:
parent
7d8a8e0e52
commit
c021e5e7fb
129
deps/ox/src/ox/oc/read.cpp
vendored
129
deps/ox/src/ox/oc/read.cpp
vendored
@ -36,135 +36,6 @@ OrganicClawReader::OrganicClawReader(Json::Value json, int unionIdx) noexcept:
|
|||||||
m_unionIdx(unionIdx) {
|
m_unionIdx(unionIdx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, int8_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isInt()) {
|
|
||||||
*val = static_cast<int8_t>(jv.asInt());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, int16_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isInt()) {
|
|
||||||
*val = static_cast<int16_t>(jv.asInt());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, int32_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isInt()) {
|
|
||||||
*val = static_cast<int32_t>(jv.asInt());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, int64_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isInt() || jv.isInt64()) {
|
|
||||||
*val = static_cast<int64_t>(jv.asInt64());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, uint8_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isUInt()) {
|
|
||||||
*val = static_cast<uint8_t>(jv.asUInt());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, uint16_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isUInt()) {
|
|
||||||
*val = static_cast<uint16_t>(jv.asUInt());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, uint32_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isUInt()) {
|
|
||||||
*val = static_cast<uint32_t>(jv.asUInt());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, uint64_t *val) noexcept {
|
|
||||||
auto err = OxError(0);
|
|
||||||
if (targetValid()) {
|
|
||||||
const auto &jv = value(key);
|
|
||||||
if (jv.empty()) {
|
|
||||||
*val = 0;
|
|
||||||
} else if (jv.isUInt() || jv.isUInt64()) {
|
|
||||||
*val = static_cast<uint64_t>(jv.asUInt64());
|
|
||||||
} else {
|
|
||||||
err = OxError(1, "Type mismatch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++m_fieldIt;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, bool *val) noexcept {
|
Error OrganicClawReader::field(const char *key, bool *val) noexcept {
|
||||||
auto err = OxError(0);
|
auto err = OxError(0);
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
|
30
deps/ox/src/ox/oc/read.hpp
vendored
30
deps/ox/src/ox/oc/read.hpp
vendored
@ -41,16 +41,6 @@ class OrganicClawReader {
|
|||||||
|
|
||||||
explicit OrganicClawReader(Json::Value json, int unionIdx = -1) noexcept;
|
explicit OrganicClawReader(Json::Value json, int unionIdx = -1) noexcept;
|
||||||
|
|
||||||
Error field(const char *key, int8_t *val) noexcept;
|
|
||||||
Error field(const char *key, int16_t *val) noexcept;
|
|
||||||
Error field(const char *key, int32_t *val) noexcept;
|
|
||||||
Error field(const char *key, int64_t *val) noexcept;
|
|
||||||
|
|
||||||
Error field(const char *key, uint8_t *val) noexcept;
|
|
||||||
Error field(const char *key, uint16_t *val) noexcept;
|
|
||||||
Error field(const char *key, uint32_t *val) noexcept;
|
|
||||||
Error field(const char *key, uint64_t *val) noexcept;
|
|
||||||
|
|
||||||
Error field(const char *key, bool *val) noexcept;
|
Error field(const char *key, bool *val) noexcept;
|
||||||
|
|
||||||
// array handler
|
// array handler
|
||||||
@ -144,7 +134,22 @@ class OrganicClawReader {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
||||||
auto err = OxError(0);
|
auto err = OxError(0);
|
||||||
if constexpr(isVector_v<T>) {
|
try {
|
||||||
|
if constexpr (is_integer_v<T>) {
|
||||||
|
if (targetValid()) {
|
||||||
|
auto const&jv = value(key);
|
||||||
|
auto const rightType = sizeof(T) == 8 ?
|
||||||
|
(ox::is_signed_v<T> ? jv.isInt64() : jv.isUInt64()) :
|
||||||
|
(ox::is_signed_v<T> ? jv.isInt() : jv.isUInt());
|
||||||
|
if (jv.empty()) {
|
||||||
|
*val = 0;
|
||||||
|
} else if (rightType) {
|
||||||
|
*val = static_cast<T>(jv.asUInt());
|
||||||
|
} else {
|
||||||
|
err = OxError(1, "Type mismatch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if constexpr (isVector_v<T>) {
|
||||||
const auto&srcVal = value(key);
|
const auto&srcVal = value(key);
|
||||||
const auto srcSize = srcVal.size();
|
const auto srcSize = srcVal.size();
|
||||||
oxReturnError(ox::resizeVector(*val, srcSize));
|
oxReturnError(ox::resizeVector(*val, srcSize));
|
||||||
@ -167,6 +172,9 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
|||||||
err = OxError(1, "Type mismatch");
|
err = OxError(1, "Type mismatch");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Json::LogicError const&) {
|
||||||
|
err = OxError(1, "error reading JSON data");
|
||||||
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
12
deps/ox/src/ox/oc/write.hpp
vendored
12
deps/ox/src/ox/oc/write.hpp
vendored
@ -209,7 +209,17 @@ Error OrganicClawWriter::field(const char *key, const T *val, std::size_t len) n
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Error OrganicClawWriter::field(const char *key, const T *val) noexcept {
|
Error OrganicClawWriter::field(const char *key, const T *val) noexcept {
|
||||||
if constexpr(isVector_v<T> || isArray_v<T>) {
|
if constexpr(is_integer_v<T>) {
|
||||||
|
if (targetValid() && (*val || m_json.isArray())) {
|
||||||
|
// the int type needs to be normalized because jsoncpp doesn't
|
||||||
|
// factor in every permutation unsigned long, etc.
|
||||||
|
if constexpr(ox::is_signed_v<T>) {
|
||||||
|
value(key) = static_cast<ox::Int<8 * sizeof(*val)>>(*val);
|
||||||
|
} else {
|
||||||
|
value(key) = static_cast<ox::Uint<8 * sizeof(*val)>>(*val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if constexpr(isVector_v<T> || isArray_v<T>) {
|
||||||
return field(key, val->data(), val->size());
|
return field(key, val->data(), val->size());
|
||||||
} else if (val && targetValid()) {
|
} else if (val && targetValid()) {
|
||||||
OrganicClawWriter w;
|
OrganicClawWriter w;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user