#define SIPLASPLAS_REFLECTION_DYNAMIC_TYPE_HPP 
#include <siplasplas/reflection/common/type_info.hpp>
#include <siplasplas/allocator/freelist_allocator.hpp>
#include <siplasplas/utility/exception.hpp>
#include <siplasplas/utility/lexical_cast.hpp>
#include <siplasplas/utility/meta.hpp>
#include <siplasplas/reflection/dynamic/export.hpp>
#include <unordered_map>
#include <vector>
#include <algorithm>
#define CPP_REFLECTION_CUSTOM_TYPENAME_FOR(type, name) \
    namespace cpp { namespace detail {                  \
    template<>                                          \
    struct CustomTypeName<type> {                       \
        static constexpr ::ctti::unnamed_type_id_t id() \
        {                                               \
            return ::ctti::id_from_name(name);          \
        }                                               \
    }; }}
#define CPP_REFLECTION_FORCE_TYPENAME(type) CPP_REFLECTION_CUSTOM_TYPENAME_FOR(type, #type)
namespace cpp
{
    namespace dynamic_reflection
    {
        namespace detail
        {
            template <typename T>
            struct CustomTypeName;
        }
        
        class Type;
    }
}