Sie sind auf Seite 1von 4

/*-----------------------------------------------------------------------------Filename: MetaData.hpp Author : Jeffrey Morgan Purpose : Stores basic type (available at runtime) information about a types.

Date : 2012/05/23 All content (C) 2012 DigiPen (USA) Corporation, all rights reserved. ------------------------------------------------------------------------------*/ #pragma once #include #include #include #include "Utilities/StandardTypedefs.hpp" "Utilities/HashString.hpp" "Utilities/HashMap.hpp" "MetaMemberInfo.hpp"

namespace SqueakyClean { namespace Meta { //forward declarations of MetaTypes class PropertyHolder; struct AllocatorBase; struct CopierBase; struct NumberConverterBase; struct HandleConverterBase; struct StringConverterBase; namespace PythonType { //used by meta to know how to convert types to Python enum Enum { Int, Float, Bool, String, Vector3, Normal3, Point3, Ray3, Transform, AABB, Object, //Everything is an object by default Function, Delegate, PyObjectWrapper, PyScriptEventWrapper, ScriptComponent, Undefined //Used to signal error }; } //namespace PythonType } //namespace Meta // Stores runtime available type information, like how to copy or delete a type. // MetaData can store how to serialize a type, its size and members, and more. class MetaData { friend class MetaFinalizer; friend HashString MetaToString( const MetaData* meta ); public: MetaData( cstr name ); // basic type information cstr GetName( void ) const; u32 GetSize( void ) const;

// extra type information bool IsComponent( void ) const; bool IsSubSystem( void ) const; bool IsBasicType( void ) const; bool IsSpace ( void ) const; bool IsGameObjectComposition( void ) const; Meta::PythonType::Enum GetPythonType( void ) const; const MetaData *GetHandleForType( void ) const; // super type information bool HasSuperClass( void ) const; const MetaData *GetSuperClass( void ) const; // property holder functions // Check to see if the MetaType has a property holder before getting it bool HasPropertyHolder( void ) const; TODO( "consider taking this out" ); const Meta::PropertyHolder *GetPropertyHolder( void ) const; const Meta::MemberPropArray &GetMemberProperties( void ) const; const Meta::MemberFuncArray &GetMemberFunctions( void ) const; const Meta::MemberDataArray &GetDataMembers( void ) const; const Meta::MemberInfo &GetMemberInfo( cstr name ) const; Variant GetMemberFromInstance( MemPtr instance, cstr name ) const; void SetMemberOfInstance( MemPtr data, cstr name, const VariantRef &var ) cons t; void SetMemberOfInstance( MemPtr data, const Meta::MemberInfo &info, const VariantRef &var ) const; Variant InvokeMemberFunction( MemPtr instance, cstr func, VariantRef *args, i32 argc ) const; Variant InvokeMemberFunction( MemPtr instance, cstr func ) const; // allocator functions // Check to see if the MetaType has an allocator before getting it bool HasAllocator( void ) const; MemPtr CreateNewInstance( void ) const; void DeleteInstance( MemPtr &src ) const; void ConstructInPlace( MemPtr mem ) const; void DeleteInPlace( MemPtr mem ) const; // copier functions // Check to see if the MetaType has a copier before getting it bool HasCopier( void ) const; MemPtr CloneNewInstance( MemPtr from ) const; void CopyInPlace( MemPtr into, MemPtr &from ) const; void AssignToInstance( MemPtr to, MemPtr &from ) const; // number converter function // Check to see if the MetaType has a number converter before getting it bool HasNumberConverter( void ) const; double ConvertToDouble( const MemPtr src ) const; void ConvertFromDouble( double src, MemPtr dest ) const; // string converter function // check to see if the metatype has a string converter before getting it bool HasStringConverter( void ) const; HashString ConvertToString( const MemPtr src ) const;

void ConvertFromString( StringRef src, MemPtr dest ) const; // Non-numeric conversions MemPtr ConvertInstanceTo( MemPtr obj, const MetaData *toTypeMeta ) const; // Handle conversion // Check to see if the MetaType has a handle converter before getting it bool HasHandleConverter( void ) const; const u64 &ConvertToHandle( const MemPtr src ) const; MemPtr ConvertFromHandle( u64 src ) const; protected: void InternInit( u32 size ); protected: const MetaData *m_superClass; const MetaData *m_isHandleFor; //enums for different meta data properties bool m_isComponent; bool m_isSubSystem; bool m_isSpace; bool m_isGameObjectComposition; bool m_isBasicType; bool m_hasPropertyHolder; bool m_hasAllocator; bool m_hasCopier; bool m_hasNumberConverter; bool m_hasHandleConverter; bool m_hasStringConverter; Meta::PythonType::Enum Meta::PropertyHolder Meta::AllocatorBase Meta::CopierBase Meta::NumberConverterBase Meta::HandleConverterBase Meta::StringConverterBase m_pythonType; *m_propertyHolder; *m_allocator; *m_copier; *m_numberConverter; *m_handleConverter; *m_stringConverter;

typedef MemPtr (*ConversionFn)( MemPtr ); typedef HashMap<const MetaData *, ConversionFn> ConversionMap; ConversionMap m_conversionFns; private: bool PropertyHolderNotInitialized( void ) const; bool AllocatorNotInitialized( void ) const; bool CopierNotInitialized( void ) const; Meta::NumberConverterBase *GetNumberConverter( void ) const; Meta::HandleConverterBase *GetHandleConverter( void ) const; Meta::StringConverterBase *GetStringConverter( void ) const; cstr m_name; u32 m_size; }; } //namespace SqueakyClean // helper macros for making new metatypes for testing #define TEST_DEFINE_META( type ) { MetaCreator<type> *mc = SQ_NEW( MetaCreator<type>, g_RootArena )( #type ); MetaHolder<type>::s_meta = mc; } \ \ \ \ \

#define TEST_REGISTER_META( type ) \ RegisterMeta( (MetaCreator<type>*)MetaHolder<type>::s_meta ) #define TEST_CLEAN_META( type ) g_metaMap->erase( #type ); SQ_DELETE( MetaHolder<type>::s_meta, g_RootArena ) \ \

Das könnte Ihnen auch gefallen