dml: Add header files

This commit is contained in:
Joshua Scott 2018-03-26 21:39:10 +01:00
parent ddbeb492b6
commit 54c1e509f6
20 changed files with 205 additions and 1 deletions

View File

@ -8,10 +8,14 @@ set_target_properties(${PROJECT_NAME}
CXX_STANDARD 11 CXX_STANDARD 11
) )
target_include_directories(${PROJECT_NAME} target_include_directories(${PROJECT_NAME}
PUBLIC PRIVATE
${PROJECT_SOURCE_DIR}/include
INTERFACE
${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/include
) )
add_subdirectory("src/dml")
option(KI_BUILD_EXAMPLES "Determines whether to build examples." ON) option(KI_BUILD_EXAMPLES "Determines whether to build examples." ON)
if (KI_BUILD_EXAMPLES) if (KI_BUILD_EXAMPLES)
add_subdirectory("examples") add_subdirectory("examples")

45
include/ki/dml/Field.h Normal file
View File

@ -0,0 +1,45 @@
#pragma once
#include "FieldBase.h"
#include "types.h"
namespace ki
{
namespace dml
{
template <typename ValueT>
class Field : public FieldBase
{
friend Record;
public:
ValueT get_value() const;
void set_value(ValueT value);
Field<ValueT> *clone(const Record &record) const;
void write_to(std::ostream &ostream) const;
void read_from(std::istream &istream);
size_t get_size() const;
protected:
Field(std::string name, const Record &record)
: FieldBase(name, record)
{
m_type_hash = typeid(ValueT).hash_code();
m_value = ValueT();
}
private:
ValueT m_value;
};
typedef Field<BYT> BytField;
typedef Field<UBYT> UBytField;
typedef Field<SHRT> ShrtField;
typedef Field<USHRT> UShrtField;
typedef Field<INT> IntField;
typedef Field<UINT> UIntField;
typedef Field<STR> StrField;
typedef Field<WSTR> WStrField;
typedef Field<FLT> FltField;
typedef Field<DBL> DblField;
typedef Field<GID> GidField;
}
}

View File

@ -0,0 +1,44 @@
#pragma once
#include <string>
#include <vector>
#include <map>
#include "../util/Serializable.h"
namespace ki
{
namespace dml
{
class Record;
class FieldBase : public util::Serializable
{
friend Record;
public:
const Record &get_record() const;
std::string get_name() const;
bool is_transferable() const;
template <typename ValueT>
bool is_type() const
{
return (typeid(ValueT).hash_code() == m_type_hash);
}
protected:
size_t m_type_hash;
FieldBase(std::string name, const Record& record);
void set_name(std::string name);
void set_transferable(bool transferable);
virtual FieldBase *clone(const Record &record) const = 0;
private:
const Record &m_record;
std::string m_name;
bool m_transferable;
};
typedef std::vector<FieldBase *> FieldList;
typedef std::map<std::string, FieldBase *> FieldNameMap;
}
}

58
include/ki/dml/Record.h Normal file
View File

@ -0,0 +1,58 @@
#pragma once
#include "FieldBase.h"
#include "Field.h"
namespace ki
{
namespace dml
{
class Record : public util::Serializable
{
public:
Record();
Record(const Record &record);
bool has_field(std::string name) const;
template <typename ValueT>
bool has_field(std::string name) const
{
if (!has_field(name))
return false;
return m_field_map[name]->is_type<ValueT>();
}
template <typename ValueT>
Field<ValueT> &get_field(std::string name) const
{
if (has_field<ValueT>(name))
return dynamic_cast<Field<ValueT> *>(m_fields[name]);
return nullptr;
}
template <typename ValueT>
Field<ValueT> &add_field(std::string name, bool transferable = true)
{
if (has_field<ValueT>(name))
return nullptr;
Field<ValueT> *field = new Field<ValueT>(name, *this);
auto *base = static_cast<FieldBase *>(field);
m_fields.push_back(base);
m_field_map.insert({ base->get_name(), base });
return field;
}
size_t get_field_count() const;
FieldList::iterator fields_begin() const;
FieldList::iterator fields_end() const;
void write_to(std::ostream &ostream) const;
void read_from(std::istream &istream);
size_t get_size() const;
private:
FieldList m_fields;
FieldNameMap m_field_map;
};
}
}

21
include/ki/dml/types.h Normal file
View File

@ -0,0 +1,21 @@
#pragma once
#include <cstdint>
#include <string>
namespace ki
{
namespace dml
{
typedef int8_t BYT;
typedef uint8_t UBYT;
typedef int16_t SHRT;
typedef uint16_t USHRT;
typedef int32_t INT;
typedef uint32_t UINT;
typedef std::string STR;
typedef std::wstring WSTR;
typedef float FLT;
typedef double DBL;
typedef uint64_t GID;
}
}

View File

@ -0,0 +1,16 @@
#pragma once
#include <istream>
namespace ki
{
namespace util
{
class Serializable
{
public:
virtual void write_to(std::ostream &ostream) const = 0;
virtual void read_from(std::istream &istream) = 0;
virtual size_t get_size() const = 0;
};
}
}

16
src/dml/CMakeLists.txt Normal file
View File

@ -0,0 +1,16 @@
target_sources(${PROJECT_NAME}
PRIVATE
${PROJECT_SOURCE_DIR}/src/dml/FieldBase.cpp
${PROJECT_SOURCE_DIR}/src/dml/Record.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/BytField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/UBytField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/ShrtField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/UShrtField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/IntField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/UIntField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/StrField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/WStrField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/FltField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/DblField.cpp
${PROJECT_SOURCE_DIR}/src/dml/types/GidField.cpp
)

0
src/dml/FieldBase.cpp Normal file
View File

0
src/dml/Record.cpp Normal file
View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File