[ox] Correct bad bit_cast uses and improve constexpr-ness

This commit is contained in:
2021-11-28 21:03:29 -06:00
parent 22f08f83c5
commit 1f24912ddd
35 changed files with 247 additions and 214 deletions

View File

@@ -18,29 +18,29 @@ class FieldBitmapReader {
protected:
T m_map = nullptr;
std::size_t m_mapLen = 0;
std::size_t m_fields = 0;
public:
FieldBitmapReader(T map, std::size_t maxLen) noexcept;
constexpr FieldBitmapReader(T map, std::size_t maxLen) noexcept;
Result<bool> get(std::size_t i) const noexcept;
constexpr Result<bool> get(std::size_t i) const noexcept;
void setFields(int) noexcept;
constexpr void setFields(int) noexcept;
void setMaxLen(int) noexcept;
constexpr void setMaxLen(int) noexcept;
int getMaxLen() const noexcept;
[[nodiscard]]
constexpr int64_t getMaxLen() const noexcept;
};
template<typename T>
FieldBitmapReader<T>::FieldBitmapReader(T map, std::size_t maxLen) noexcept {
constexpr FieldBitmapReader<T>::FieldBitmapReader(T map, std::size_t maxLen) noexcept {
m_map = map;
m_mapLen = maxLen;
}
template<typename T>
Result<bool> FieldBitmapReader<T>::get(std::size_t i) const noexcept {
constexpr Result<bool> FieldBitmapReader<T>::get(std::size_t i) const noexcept {
if (i / 8 < m_mapLen) {
return (m_map[i / 8] >> (i % 8)) & 1;
} else {
@@ -49,19 +49,18 @@ Result<bool> FieldBitmapReader<T>::get(std::size_t i) const noexcept {
}
template<typename T>
void FieldBitmapReader<T>::setFields(int fields) noexcept {
m_fields = fields;
m_mapLen = (fields / 8 + 1) - (fields % 8 == 0);
constexpr void FieldBitmapReader<T>::setFields(int fields) noexcept {
m_mapLen = static_cast<std::size_t>((fields / 8 + 1) - (fields % 8 == 0));
}
template<typename T>
void FieldBitmapReader<T>::setMaxLen(int maxLen) noexcept {
m_mapLen = maxLen;
constexpr void FieldBitmapReader<T>::setMaxLen(int maxLen) noexcept {
m_mapLen = static_cast<std::size_t>(maxLen);
}
template<typename T>
int FieldBitmapReader<T>::getMaxLen() const noexcept {
return m_mapLen;
constexpr int64_t FieldBitmapReader<T>::getMaxLen() const noexcept {
return static_cast<int64_t>(m_mapLen);
}
extern template class FieldBitmapReader<uint8_t*>;
@@ -70,10 +69,26 @@ extern template class FieldBitmapReader<const uint8_t*>;
class FieldBitmap: public FieldBitmapReader<uint8_t*> {
public:
FieldBitmap(uint8_t *map, std::size_t maxLen) noexcept;
constexpr FieldBitmap(uint8_t *map, std::size_t maxLen) noexcept;
Error set(std::size_t i, bool on) noexcept;
constexpr Error set(std::size_t i, bool on) noexcept;
};
constexpr FieldBitmap::FieldBitmap(uint8_t *map, std::size_t maxLen) noexcept: FieldBitmapReader<uint8_t*>(map, maxLen) {
}
constexpr Error FieldBitmap::set(std::size_t i, bool on) noexcept {
if (i / 8 < m_mapLen) {
if (on) {
m_map[i / 8] |= 1 << (i % 8);
} else {
m_map[i / 8] &= ~(1 << (i % 8));
}
return OxError(0);
} else {
return OxError(MC_PRESENCEMASKOUTBOUNDS);
}
}
}