[ox/mc] Cleanup
This commit is contained in:
parent
ed598378ae
commit
a415e86ae5
15
deps/ox/src/ox/mc/intops.hpp
vendored
15
deps/ox/src/ox/mc/intops.hpp
vendored
@ -23,12 +23,13 @@ static constexpr auto Bits = sizeof(T) << 3;
|
|||||||
* Bit numbering starts at 0.
|
* Bit numbering starts at 0.
|
||||||
*/
|
*/
|
||||||
template<typename I>
|
template<typename I>
|
||||||
[[nodiscard]] constexpr std::size_t highestBit(I val) noexcept {
|
[[nodiscard]]
|
||||||
|
constexpr std::size_t highestBit(I val) noexcept {
|
||||||
int shiftStart = sizeof(I) * 8 - 1;
|
int shiftStart = sizeof(I) * 8 - 1;
|
||||||
// find most significant non-sign indicator bit
|
// find most significant non-sign indicator bit
|
||||||
std::size_t highestBit = 0;
|
std::size_t highestBit = 0;
|
||||||
// start at one bit lower if signed
|
// start at one bit lower if signed
|
||||||
if constexpr(ox::is_signed_v<I>) {
|
if constexpr(is_signed_v<I>) {
|
||||||
--shiftStart;
|
--shiftStart;
|
||||||
}
|
}
|
||||||
for (auto i = shiftStart; i > -1; --i) {
|
for (auto i = shiftStart; i > -1; --i) {
|
||||||
@ -56,7 +57,8 @@ struct McInt {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename I>
|
template<typename I>
|
||||||
[[nodiscard]] constexpr McInt encodeInteger(I input) noexcept {
|
[[nodiscard]]
|
||||||
|
constexpr McInt encodeInteger(I input) noexcept {
|
||||||
McInt out;
|
McInt out;
|
||||||
// move input to uint64_t to allow consistent bit manipulation, and to avoid
|
// move input to uint64_t to allow consistent bit manipulation, and to avoid
|
||||||
// overflow concerns
|
// overflow concerns
|
||||||
@ -65,7 +67,7 @@ template<typename I>
|
|||||||
if (val) {
|
if (val) {
|
||||||
// bits needed to represent number factoring in space possibly
|
// bits needed to represent number factoring in space possibly
|
||||||
// needed for signed bit
|
// needed for signed bit
|
||||||
const auto bits = highestBit(val) + 1 + (ox::is_signed_v<I> ? 1 : 0);
|
const auto bits = highestBit(val) + 1 + (is_signed_v<I> ? 1 : 0);
|
||||||
// bytes needed to store value
|
// bytes needed to store value
|
||||||
std::size_t bytes = bits / 8 + (bits % 8 != 0);
|
std::size_t bytes = bits / 8 + (bits % 8 != 0);
|
||||||
const auto bitsAvailable = bytes * 8; // bits available to integer value
|
const auto bitsAvailable = bytes * 8; // bits available to integer value
|
||||||
@ -97,7 +99,8 @@ template<typename I>
|
|||||||
* Returns the number of bytes indicated by the bytes indicator of a variable
|
* Returns the number of bytes indicated by the bytes indicator of a variable
|
||||||
* length integer.
|
* length integer.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] static constexpr std::size_t countBytes(uint8_t b) noexcept {
|
[[nodiscard]]
|
||||||
|
static constexpr std::size_t countBytes(uint8_t b) noexcept {
|
||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
for (; (b >> i) & 1; i++);
|
for (; (b >> i) & 1; i++);
|
||||||
return i + 1;
|
return i + 1;
|
||||||
@ -128,7 +131,7 @@ Result<I> decodeInteger(const uint8_t buff[9], std::size_t buffLen, std::size_t
|
|||||||
decoded >>= bytes;
|
decoded >>= bytes;
|
||||||
auto out = static_cast<I>(decoded);
|
auto out = static_cast<I>(decoded);
|
||||||
// move sign bit
|
// move sign bit
|
||||||
if constexpr(ox::is_signed_v<I>) {
|
if constexpr(is_signed_v<I>) {
|
||||||
const auto valBits = bytes << 3;
|
const auto valBits = bytes << 3;
|
||||||
// get sign
|
// get sign
|
||||||
uint64_t sign = decoded >> (valBits - 1);
|
uint64_t sign = decoded >> (valBits - 1);
|
||||||
|
1
deps/ox/src/ox/mc/presenceindicator.cpp
vendored
1
deps/ox/src/ox/mc/presenceindicator.cpp
vendored
@ -6,7 +6,6 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ox/std/byteswap.hpp>
|
|
||||||
#include "err.hpp"
|
#include "err.hpp"
|
||||||
#include "presenceindicator.hpp"
|
#include "presenceindicator.hpp"
|
||||||
|
|
||||||
|
25
deps/ox/src/ox/mc/read.hpp
vendored
25
deps/ox/src/ox/mc/read.hpp
vendored
@ -186,15 +186,14 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
|
|||||||
return OxError(MC_BUFFENDED);
|
return OxError(MC_BUFFENDED);
|
||||||
}
|
}
|
||||||
std::size_t bytesRead = 0;
|
std::size_t bytesRead = 0;
|
||||||
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
oxRequire(len, mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead));
|
||||||
m_buffIt += bytesRead;
|
m_buffIt += bytesRead;
|
||||||
oxReturnError(len.error);
|
|
||||||
|
|
||||||
// read the list
|
// read the list
|
||||||
if (valLen >= len.value) {
|
if (valLen >= len) {
|
||||||
auto reader = child("");
|
auto reader = child("");
|
||||||
reader.setTypeInfo("List", len.value);
|
reader.setTypeInfo("List", len);
|
||||||
for (std::size_t i = 0; i < len.value; i++) {
|
for (std::size_t i = 0; i < len; i++) {
|
||||||
oxReturnError(reader.field("", &val[i]));
|
oxReturnError(reader.field("", &val[i]));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -216,15 +215,14 @@ Error MetalClawReader::field(const char*, HashMap<String, T> *val) {
|
|||||||
return OxError(MC_BUFFENDED);
|
return OxError(MC_BUFFENDED);
|
||||||
}
|
}
|
||||||
std::size_t bytesRead = 0;
|
std::size_t bytesRead = 0;
|
||||||
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
oxRequire(len, mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead));
|
||||||
m_buffIt += bytesRead;
|
m_buffIt += bytesRead;
|
||||||
oxReturnError(len.error);
|
|
||||||
|
|
||||||
// read the list
|
// read the list
|
||||||
auto reader = child("");
|
auto reader = child("");
|
||||||
reader.setTypeInfo("List", len.value);
|
reader.setTypeInfo("List", len);
|
||||||
for (std::size_t i = 0; i < len.value; i++) {
|
for (std::size_t i = 0; i < len; i++) {
|
||||||
auto keyLen = reader.stringLength(nullptr);
|
const auto keyLen = reader.stringLength(nullptr);
|
||||||
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
||||||
oxReturnError(reader.field("", SerStr(wkey.get(), keyLen)));
|
oxReturnError(reader.field("", SerStr(wkey.get(), keyLen)));
|
||||||
oxReturnError(reader.field("", &val->operator[](wkey.get())));
|
oxReturnError(reader.field("", &val->operator[](wkey.get())));
|
||||||
@ -244,14 +242,13 @@ Error MetalClawReader::field(const char*, Handler handler) {
|
|||||||
return OxError(MC_BUFFENDED);
|
return OxError(MC_BUFFENDED);
|
||||||
}
|
}
|
||||||
std::size_t bytesRead = 0;
|
std::size_t bytesRead = 0;
|
||||||
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
|
oxRequire(len, mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead));
|
||||||
m_buffIt += bytesRead;
|
m_buffIt += bytesRead;
|
||||||
oxReturnError(len.error);
|
|
||||||
|
|
||||||
// read the list
|
// read the list
|
||||||
auto reader = child("");
|
auto reader = child("");
|
||||||
reader.setTypeInfo("List", len.value);
|
reader.setTypeInfo("List", len);
|
||||||
for (std::size_t i = 0; i < len.value; i++) {
|
for (std::size_t i = 0; i < len; i++) {
|
||||||
T val;
|
T val;
|
||||||
oxReturnError(reader.field("", &val));
|
oxReturnError(reader.field("", &val));
|
||||||
oxReturnError(handler(i, &val));
|
oxReturnError(handler(i, &val));
|
||||||
|
14
deps/ox/src/ox/mc/write.hpp
vendored
14
deps/ox/src/ox/mc/write.hpp
vendored
@ -13,13 +13,13 @@
|
|||||||
#include <ox/std/bit.hpp>
|
#include <ox/std/bit.hpp>
|
||||||
#include <ox/std/buffer.hpp>
|
#include <ox/std/buffer.hpp>
|
||||||
#include <ox/std/byteswap.hpp>
|
#include <ox/std/byteswap.hpp>
|
||||||
|
#include <ox/std/hashmap.hpp>
|
||||||
#include <ox/std/string.hpp>
|
#include <ox/std/string.hpp>
|
||||||
#include <ox/std/types.hpp>
|
#include <ox/std/types.hpp>
|
||||||
#include <ox/std/units.hpp>
|
#include <ox/std/units.hpp>
|
||||||
|
|
||||||
#include "intops.hpp"
|
#include "intops.hpp"
|
||||||
#include "err.hpp"
|
#include "err.hpp"
|
||||||
#include "ox/std/hashmap.hpp"
|
|
||||||
#include "presenceindicator.hpp"
|
#include "presenceindicator.hpp"
|
||||||
#include "types.hpp"
|
#include "types.hpp"
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ class MetalClawWriter {
|
|||||||
Error field(const char*, HashMap<String, T> *val);
|
Error field(const char*, HashMap<String, T> *val);
|
||||||
|
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
Error field(const char*, ox::BString<L> *val) noexcept;
|
Error field(const char*, BString<L> *val) noexcept;
|
||||||
|
|
||||||
Error field(const char*, SerStr val) noexcept;
|
Error field(const char*, SerStr val) noexcept;
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ class MetalClawWriter {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
Error MetalClawWriter::field(const char *name, ox::BString<L> *val) noexcept {
|
Error MetalClawWriter::field(const char *name, BString<L> *val) noexcept {
|
||||||
return field(name, SerStr(val->data(), val->cap()));
|
return field(name, SerStr(val->data(), val->cap()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,8 +159,8 @@ Error MetalClawWriter::field(const char*, T *val, std::size_t len) {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Error MetalClawWriter::field(const char*, HashMap<String, T> *val) {
|
Error MetalClawWriter::field(const char*, HashMap<String, T> *val) {
|
||||||
auto &keys = val->keys();
|
const auto &keys = val->keys();
|
||||||
auto len = keys.size();
|
const auto len = keys.size();
|
||||||
bool fieldSet = false;
|
bool fieldSet = false;
|
||||||
|
|
||||||
if (len && (m_unionIdx == -1 || m_unionIdx == m_field)) {
|
if (len && (m_unionIdx == -1 || m_unionIdx == m_field)) {
|
||||||
@ -179,7 +179,7 @@ Error MetalClawWriter::field(const char*, HashMap<String, T> *val) {
|
|||||||
|
|
||||||
// write the array
|
// write the array
|
||||||
for (std::size_t i = 0; i < len; i++) {
|
for (std::size_t i = 0; i < len; i++) {
|
||||||
auto &key = keys[i];
|
const auto &key = keys[i];
|
||||||
const auto keyLen = ox_strlen(key);
|
const auto keyLen = ox_strlen(key);
|
||||||
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
auto wkey = ox_malloca(keyLen + 1, char, 0);
|
||||||
memcpy(wkey, key.c_str(), keyLen + 1);
|
memcpy(wkey, key.c_str(), keyLen + 1);
|
||||||
@ -206,7 +206,7 @@ Error MetalClawWriter::appendInteger(I val) noexcept {
|
|||||||
ox_memcpy(&m_buff[m_buffIt], mi.data, mi.length);
|
ox_memcpy(&m_buff[m_buffIt], mi.data, mi.length);
|
||||||
m_buffIt += mi.length;
|
m_buffIt += mi.length;
|
||||||
} else {
|
} else {
|
||||||
oxReturnError(OxError(MC_BUFFENDED));
|
return OxError(MC_BUFFENDED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
oxReturnError(m_fieldPresence.set(m_field, fieldSet));
|
oxReturnError(m_fieldPresence.set(m_field, fieldSet));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user