mirror of https://github.com/SeanOMik/libki.git
dml: Specialize integer types
(BYT, UBYT, SHRT, USHRT, INT, UINT, and GID)
This commit is contained in:
parent
029acce2d0
commit
ade0822747
|
@ -0,0 +1,10 @@
|
|||
#pragma once
|
||||
|
||||
namespace ki
|
||||
{
|
||||
template <typename ValueT>
|
||||
union ValueBytes {
|
||||
ValueT value = 0;
|
||||
char buff[sizeof(ValueT)];
|
||||
};
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,23 @@ namespace dml
|
|||
template <>
|
||||
void BytField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<BYT> data;
|
||||
data.value = m_value;
|
||||
ostream.write(data.buff, sizeof(BYT));
|
||||
}
|
||||
|
||||
template <>
|
||||
void BytField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
ValueBytes<BYT> data;
|
||||
istream.read(data.buff, sizeof(BYT));
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t BytField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(BYT);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,27 @@ namespace dml
|
|||
template <>
|
||||
void GidField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<GID> data = { m_value };
|
||||
if (data.buff[0] == ((m_value & 0xFF00000000000000) >> 56))
|
||||
std::reverse(&data.buff[0], &data.buff[7]);
|
||||
ostream.write(data.buff, sizeof(GID));
|
||||
}
|
||||
|
||||
template <>
|
||||
void GidField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
const ValueBytes<USHRT> endianness_check = { 0x0102 };
|
||||
ValueBytes<GID> data;
|
||||
istream.read(data.buff, sizeof(GID));
|
||||
if (endianness_check.buff[0] == 0x01)
|
||||
std::reverse(&data.buff[0], &data.buff[7]);
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t GidField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(GID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,27 @@ namespace dml
|
|||
template <>
|
||||
void IntField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<INT> data = { m_value };
|
||||
if (data.buff[0] == ((m_value & 0xFF000000) >> 24))
|
||||
std::reverse(&data.buff[0], &data.buff[3]);
|
||||
ostream.write(data.buff, sizeof(INT));
|
||||
}
|
||||
|
||||
template <>
|
||||
void IntField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
const ValueBytes<USHRT> endianness_check = { 0x0102 };
|
||||
ValueBytes<INT> data;
|
||||
istream.read(data.buff, sizeof(INT));
|
||||
if (endianness_check.buff[0] == 0x01)
|
||||
std::reverse(&data.buff[0], &data.buff[3]);
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t IntField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(INT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,27 @@ namespace dml
|
|||
template <>
|
||||
void ShrtField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<SHRT> data = { m_value };
|
||||
if (data.buff[0] == ((m_value & 0xFF00) >> 8))
|
||||
std::reverse(&data.buff[0], &data.buff[1]);
|
||||
ostream.write(data.buff, sizeof(SHRT));
|
||||
}
|
||||
|
||||
template <>
|
||||
void ShrtField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
const ValueBytes<SHRT> endianness_check = { 0x0102 };
|
||||
ValueBytes<SHRT> data;
|
||||
istream.read(data.buff, sizeof(SHRT));
|
||||
if (endianness_check.buff[0] == 0x01)
|
||||
std::reverse(&data.buff[0], &data.buff[1]);
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t ShrtField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(USHRT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,23 @@ namespace dml
|
|||
template <>
|
||||
void UBytField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<UBYT> data;
|
||||
data.value = m_value;
|
||||
ostream.write(data.buff, sizeof(UBYT));
|
||||
}
|
||||
|
||||
template <>
|
||||
void UBytField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
ValueBytes<UBYT> data;
|
||||
istream.read(data.buff, sizeof(UBYT));
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t UBytField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(BYT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,27 @@ namespace dml
|
|||
template <>
|
||||
void UIntField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<UINT> data = { m_value };
|
||||
if (data.buff[0] == ((m_value & 0xFF000000) >> 24))
|
||||
std::reverse(&data.buff[0], &data.buff[3]);
|
||||
ostream.write(data.buff, sizeof(UINT));
|
||||
}
|
||||
|
||||
template <>
|
||||
void UIntField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
const ValueBytes<USHRT> endianness_check = { 0x0102 };
|
||||
ValueBytes<UINT> data;
|
||||
istream.read(data.buff, sizeof(UINT));
|
||||
if (endianness_check.buff[0] == 0x01)
|
||||
std::reverse(&data.buff[0], &data.buff[3]);
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t UIntField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(UINT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "ki/dml/Field.h"
|
||||
#include "ki/util/ValueBytes.h"
|
||||
|
||||
namespace ki
|
||||
{
|
||||
|
@ -7,19 +8,27 @@ namespace dml
|
|||
template <>
|
||||
void UShrtField::write_to(std::ostream &ostream) const
|
||||
{
|
||||
|
||||
ValueBytes<USHRT> data = { m_value };
|
||||
if (data.buff[0] == ((m_value & 0xFF00) >> 8))
|
||||
std::reverse(&data.buff[0], &data.buff[1]);
|
||||
ostream.write(data.buff, sizeof(USHRT));
|
||||
}
|
||||
|
||||
template <>
|
||||
void UShrtField::read_from(std::istream &istream)
|
||||
{
|
||||
|
||||
const ValueBytes<USHRT> endianness_check = { 0x0102 };
|
||||
ValueBytes<USHRT> data;
|
||||
istream.read(data.buff, sizeof(USHRT));
|
||||
if (endianness_check.buff[0] == 0x01)
|
||||
std::reverse(&data.buff[0], &data.buff[1]);
|
||||
m_value = data.value;
|
||||
}
|
||||
|
||||
template <>
|
||||
size_t UShrtField::get_size() const
|
||||
{
|
||||
return 0;
|
||||
return sizeof(USHRT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue