pclass: Fix CI build errors + small change to value_caster

This commit is contained in:
Joshua Scott 2018-12-15 22:03:08 +00:00
parent c512185115
commit f9ab6560d9
4 changed files with 72 additions and 81 deletions

View File

@ -2,8 +2,8 @@
#include <type_traits> #include <type_traits>
#include <sstream> #include <sstream>
#include <json.hpp> #include <json.hpp>
#include "ki/util/BitTypes.h"
#include "ki/pclass/Value.h" #include "ki/pclass/Value.h"
#include "ki/util/BitTypes.h"
#include "ki/pclass/types/EnumType.h" #include "ki/pclass/types/EnumType.h"
namespace ki namespace ki
@ -45,18 +45,17 @@ namespace detail
> >
: value_caster_impl<SrcT, nlohmann::json> : value_caster_impl<SrcT, nlohmann::json>
{ {
Value cast(const Value &value) const override nlohmann::json cast_value(const SrcT &value) const override
{ {
const nlohmann::json j = value.get<SrcT>(); return value;
return Value::make_value<nlohmann::json>(j);
} }
}; };
/** /**
* value_caster specialization for casting bi<N> and bui<N> * value_caster specialization for casting bit integers (bi<N> and bui<N>)
* to a json object. * to a json object.
*/ */
template <int N, bool Unsigned> template <uint8_t N, bool Unsigned>
struct value_caster< struct value_caster<
BitInteger<N, Unsigned>, nlohmann::json BitInteger<N, Unsigned>, nlohmann::json
> >
@ -68,12 +67,29 @@ namespace detail
typename bits<N>::int_type typename bits<N>::int_type
>::type; >::type;
Value cast(const Value &value) const override nlohmann::json cast_value(
const BitInteger<N, Unsigned> &value) const override
{ {
const nlohmann::json j = static_cast<type>( return static_cast<type>(value);
value.get<BitInteger<N, Unsigned>>() }
); };
return Value::make_value<nlohmann::json>(j);
/**
* value_caster specialization for casting enum to bit integer types
* (bi<N> and bui<N>).
*/
template <typename SrcT, uint8_t N, bool Unsigned>
struct value_caster<
SrcT, BitInteger<N, Unsigned>,
typename std::enable_if<std::is_enum<SrcT>::value>::type
>
: value_caster_impl<SrcT, BitInteger<N, Unsigned>>
{
using underlying_type = typename std::underlying_type<SrcT>::type;
BitInteger<N, Unsigned> cast_value(const SrcT &value) const override
{
return static_cast<underlying_type>(value);
} }
}; };
@ -89,36 +105,9 @@ namespace detail
{ {
using underlying_type = typename std::underlying_type<SrcT>::type; using underlying_type = typename std::underlying_type<SrcT>::type;
Value cast(const Value &value) const override nlohmann::json cast_value(const SrcT &value) const override
{ {
const auto underlying_value = return static_cast<underlying_type>(value);
static_cast<underlying_type>(value.get<SrcT>());
const nlohmann::json j = underlying_value;
return Value::make_value<nlohmann::json>(j);
}
};
/**
* value_caster specialization for casting enums to bit integer types.
*/
template <
typename SrcT,
int N, bool Unsigned
>
struct value_caster<
SrcT, BitInteger<N, Unsigned>,
typename std::enable_if<std::is_enum<SrcT>::value>::type
>
: value_caster_impl<SrcT, nlohmann::json>
{
using underlying_type = typename std::underlying_type<SrcT>::type;
Value cast(const Value &value) const override
{
const auto underlying_value =
static_cast<underlying_type>(value.get<SrcT>());
const auto bit_value = BitInteger<N, Unsigned>(underlying_value);
return Value::make_value<BitInteger<N, Unsigned>>(bit_value);
} }
}; };
@ -164,14 +153,13 @@ namespace detail
struct value_caster<SrcT, std::string> struct value_caster<SrcT, std::string>
: value_caster_impl<SrcT, std::string> : value_caster_impl<SrcT, std::string>
{ {
Value cast(const Value &value) const override std::string cast_value(const SrcT &value) const override
{ {
std::ostringstream oss; std::ostringstream oss;
auto casted_value = static_cast< auto casted_value = static_cast<
typename string_cast_t<SrcT>::type typename string_cast_t<SrcT>::type>(value);
>(value.get<SrcT>());
oss << casted_value; oss << casted_value;
return Value::make_value<std::string>(oss.str()); return oss.str();
} }
}; };

View File

@ -2,11 +2,11 @@
#include <vector> #include <vector>
#include <unordered_map> #include <unordered_map>
#include "ki/pclass/HashCalculator.h" #include "ki/pclass/HashCalculator.h"
#include "ki/pclass/Casters.h"
#include "ki/pclass/types/Type.h" #include "ki/pclass/types/Type.h"
#include "ki/pclass/types/PrimitiveType.h" #include "ki/pclass/types/PrimitiveType.h"
#include "ki/pclass/types/ClassType.h" #include "ki/pclass/types/ClassType.h"
#include "ki/pclass/types/EnumType.h" #include "ki/pclass/types/EnumType.h"
#include "ki/pclass/Casters.h"
namespace ki namespace ki
{ {

View File

@ -1,7 +1,6 @@
#pragma once #pragma once
#include <utility> #include <utility>
#include <typeinfo> #include <typeinfo>
#include <sstream>
#include <unordered_map> #include <unordered_map>
#include "ki/util/exception.h" #include "ki/util/exception.h"
@ -44,8 +43,27 @@ namespace pclass
template <typename SrcT, typename DestT> template <typename SrcT, typename DestT>
struct value_caster_impl : value_caster_base struct value_caster_impl : value_caster_base
{ {
Value cast(const Value& value) const override;
virtual DestT cast_value(const SrcT &value) const = 0;
protected: protected:
static Value bad_cast(); static DestT bad_cast();
};
/**
* TODO: Documentation
*/
template <
typename SrcT, typename DestT,
typename SrcEnable, typename DestEnable
>
struct value_caster : value_caster_impl<SrcT, DestT>
{
DestT cast_value(const SrcT &value) const override
{
// By default, just attempt to static_cast from SrcT to DestT.
return static_cast<DestT>(value);
}
}; };
/** /**
@ -386,28 +404,18 @@ namespace pclass
namespace detail namespace detail
{ {
template <typename SrcT, typename DestT> template <typename SrcT, typename DestT>
Value value_caster_impl<SrcT, DestT>::bad_cast() DestT value_caster_impl<SrcT, DestT>::bad_cast()
{ {
throw cast_error(typeid(SrcT), typeid(DestT)); throw cast_error(typeid(SrcT), typeid(DestT));
} }
/** template <typename SrcT, typename DestT>
* TODO: Documentation Value value_caster_impl<SrcT, DestT>::cast(const Value& value) const
*/
template <
typename SrcT, typename DestT,
typename SrcEnable, typename DestEnable
>
struct value_caster : value_caster_impl<SrcT, DestT>
{ {
Value cast(const Value &value) const override return Value::make_value<DestT>(
{ cast_value(value.get<SrcT>())
// By default, just attempt to static_cast from SrcT to DestT. );
return Value::make_value<DestT>( }
static_cast<DestT>(value.get<SrcT>())
);
}
};
} }
} }
} }

View File

@ -3,13 +3,13 @@
#include <cstdint> #include <cstdint>
#include <string> #include <string>
#include <catch.hpp> #include <catch.hpp>
#include <ki/util/unique.h>
#include <ki/pclass/TypeSystem.h> #include <ki/pclass/TypeSystem.h>
#include <ki/pclass/PropertyClass.h> #include <ki/pclass/PropertyClass.h>
#include <ki/pclass/StaticProperty.h> #include <ki/pclass/StaticProperty.h>
#include <ki/pclass/VectorProperty.h> #include <ki/pclass/VectorProperty.h>
#include <ki/serialization/BinarySerializer.h> #include <ki/serialization/BinarySerializer.h>
#include "ki/util/unique.h" #include <ki/serialization/JsonSerializer.h>
#include "ki/serialization/JsonSerializer.h"
using namespace ki; using namespace ki;
@ -108,15 +108,13 @@ namespace detail
struct value_caster<Vector3D, nlohmann::json> struct value_caster<Vector3D, nlohmann::json>
: value_caster_impl<Vector3D, nlohmann::json> : value_caster_impl<Vector3D, nlohmann::json>
{ {
Value cast(const Value &value) const override nlohmann::json cast_value(const Vector3D &value) const
{ {
auto &vector = value.get<Vector3D>(); return {
const nlohmann::json j = { { "x", value.m_x },
{ "x", vector.m_x }, { "y", value.m_y },
{ "y", vector.m_y }, { "z", value.m_z }
{ "z", vector.m_z }
}; };
return Value::make_value<nlohmann::json>(j);
} }
}; };
@ -127,15 +125,12 @@ namespace detail
struct value_caster<nlohmann::json, Vector3D> struct value_caster<nlohmann::json, Vector3D>
: value_caster_impl<nlohmann::json, Vector3D> : value_caster_impl<nlohmann::json, Vector3D>
{ {
Value cast(const Value &value) const override Vector3D cast_value(const nlohmann::json &value) const
{ {
auto &j = value.get<nlohmann::json>(); return Vector3D(
return Value::make_value<Vector3D>( value["x"].get<float>(),
Vector3D( value["y"].get<float>(),
j["x"].get<float>(), value["z"].get<float>()
j["y"].get<float>(),
j["z"].get<float>()
)
); );
} }
}; };