xti.h
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C头文件 代码 · 共 1,688 行 · 第 1/5 页
H
1,688 行
//
// All data exposed by the RTTI is characterized using the following classes.
// The first characterization is done by wxTypeKind. All enums up to and including
// wxT_CUSTOM represent so called simple types. These cannot be divided any further.
// They can be converted to and from wxStrings, that's all.
enum wxTypeKind
{
wxT_VOID = 0, // unknown type
wxT_BOOL,
wxT_CHAR,
wxT_UCHAR,
wxT_INT,
wxT_UINT,
wxT_LONG,
wxT_ULONG,
wxT_FLOAT,
wxT_DOUBLE,
wxT_STRING, // must be wxString
wxT_SET, // must be wxBitset<> template
wxT_ENUM,
wxT_CUSTOM, // user defined type (e.g. wxPoint)
wxT_LAST_SIMPLE_TYPE_KIND = wxT_CUSTOM ,
wxT_OBJECT_PTR, // object reference
wxT_OBJECT , // embedded object
wxT_COLLECTION , // collection
wxT_DELEGATE , // for connecting against an event source
wxT_LAST_TYPE_KIND = wxT_DELEGATE // sentinel for bad data, asserts, debugging
};
class WXDLLIMPEXP_BASE wxxVariant ;
class WXDLLIMPEXP_BASE wxTypeInfo ;
WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxTypeInfo* , wxTypeInfoMap , class WXDLLIMPEXP_BASE ) ;
class WXDLLIMPEXP_BASE wxTypeInfo
{
public :
typedef void (*converterToString_t)( const wxxVariant& data , wxString &result ) ;
typedef void (*converterFromString_t)( const wxString& data , wxxVariant &result ) ;
wxTypeInfo(wxTypeKind kind,
converterToString_t to = NULL, converterFromString_t from = NULL,
const wxString &name = wxEmptyString):
m_toString(to), m_fromString(from), m_kind(kind), m_name(name)
{
Register();
}
#if wxUSE_UNICODE
wxTypeInfo(wxTypeKind kind,
converterToString_t to, converterFromString_t from,
const char *name):
m_toString(to), m_fromString(from), m_kind(kind), m_name(wxString::FromAscii(name))
{
Register();
}
#endif
virtual ~wxTypeInfo()
{
Unregister() ;
}
// return the kind of this type (wxT_... constants)
wxTypeKind GetKind() const { return m_kind ; }
// returns the unique name of this type
const wxString& GetTypeName() const { return m_name ; }
// is this type a delegate type
bool IsDelegateType() const { return m_kind == wxT_DELEGATE ; }
// is this type a custom type
bool IsCustomType() const { return m_kind == wxT_CUSTOM ; }
// is this type an object type
bool IsObjectType() const { return m_kind == wxT_OBJECT || m_kind == wxT_OBJECT_PTR ; }
// can the content of this type be converted to and from strings ?
bool HasStringConverters() const { return m_toString != NULL && m_fromString != NULL ; }
// convert a wxxVariant holding data of this type into a string
void ConvertToString( const wxxVariant& data , wxString &result ) const
{ if ( m_toString ) (*m_toString)( data , result ) ; else wxLogError( _("String conversions not supported") ) ; }
// convert a string into a wxxVariant holding the corresponding data in this type
void ConvertFromString( const wxString& data , wxxVariant &result ) const
{ if( m_fromString ) (*m_fromString)( data , result ) ; else wxLogError( _("String conversions not supported") ) ; }
#if wxUSE_UNICODE
static wxTypeInfo *FindType(const char *typeName) { return FindType( wxString::FromAscii(typeName) ) ; }
#endif
static wxTypeInfo *FindType(const wxChar *typeName);
private :
void Register();
void Unregister();
converterToString_t m_toString ;
converterFromString_t m_fromString ;
static wxTypeInfoMap* ms_typeTable ;
wxTypeKind m_kind;
wxString m_name;
};
class WXDLLIMPEXP_BASE wxBuiltInTypeInfo : public wxTypeInfo
{
public :
wxBuiltInTypeInfo( wxTypeKind kind , converterToString_t to = NULL , converterFromString_t from = NULL , const wxString &name = wxEmptyString ) :
wxTypeInfo( kind , to , from , name )
{ wxASSERT_MSG( GetKind() < wxT_SET , wxT("Illegal Kind for Base Type") ) ; }
#if wxUSE_UNICODE
wxBuiltInTypeInfo( wxTypeKind kind , converterToString_t to , converterFromString_t from , const char *name ) :
wxTypeInfo( kind , to , from , name )
{ wxASSERT_MSG( GetKind() < wxT_SET , wxT("Illegal Kind for Base Type") ) ; }
#endif
} ;
class WXDLLIMPEXP_BASE wxCustomTypeInfo : public wxTypeInfo
{
public :
wxCustomTypeInfo( const wxString &name , converterToString_t to , converterFromString_t from ) :
wxTypeInfo( wxT_CUSTOM , to , from , name )
{}
#if wxUSE_UNICODE
wxCustomTypeInfo( const char *name , converterToString_t to , converterFromString_t from ) :
wxTypeInfo( wxT_CUSTOM , to , from , name )
{}
#endif
} ;
class WXDLLIMPEXP_BASE wxEnumTypeInfo : public wxTypeInfo
{
public :
typedef void (*converterToLong_t)( const wxxVariant& data , long &result ) ;
typedef void (*converterFromLong_t)( long data , wxxVariant &result ) ;
wxEnumTypeInfo( wxTypeKind kind , wxEnumData* enumInfo , converterToString_t to , converterFromString_t from ,
converterToLong_t toLong , converterFromLong_t fromLong , const wxString &name ) :
wxTypeInfo( kind , to , from , name ) , m_toLong( toLong ) , m_fromLong( fromLong )
{ wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET , wxT("Illegal Kind for Enum Type")) ; m_enumInfo = enumInfo ;}
#if wxUSE_UNICODE
wxEnumTypeInfo( wxTypeKind kind , wxEnumData* enumInfo , converterToString_t to , converterFromString_t from ,
converterToLong_t toLong , converterFromLong_t fromLong , const char * name ) :
wxTypeInfo( kind , to , from , name ) , m_toLong( toLong ) , m_fromLong( fromLong )
{ wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET , wxT("Illegal Kind for Enum Type")) ; m_enumInfo = enumInfo ;}
#endif
const wxEnumData* GetEnumData() const { return m_enumInfo ; }
// convert a wxxVariant holding data of this type into a long
void ConvertToLong( const wxxVariant& data , long &result ) const
{ if( m_toLong ) (*m_toLong)( data , result ) ; else wxLogError( _("Long Conversions not supported") ) ; }
// convert a long into a wxxVariant holding the corresponding data in this type
void ConvertFromLong( long data , wxxVariant &result ) const
{ if( m_fromLong ) (*m_fromLong)( data , result ) ; else wxLogError( _("Long Conversions not supported") ) ;}
private :
converterToLong_t m_toLong ;
converterFromLong_t m_fromLong ;
wxEnumData *m_enumInfo; // Kind == wxT_ENUM or Kind == wxT_SET
} ;
class WXDLLIMPEXP_BASE wxClassTypeInfo : public wxTypeInfo
{
public :
wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to = NULL , converterFromString_t from = NULL , const wxString &name = wxEmptyString) ;
#if wxUSE_UNICODE
wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const char *name ) ;
#endif
const wxClassInfo *GetClassInfo() const { return m_classInfo ; }
private :
wxClassInfo *m_classInfo; // Kind == wxT_OBJECT - could be NULL
} ;
class WXDLLIMPEXP_BASE wxCollectionTypeInfo : public wxTypeInfo
{
public :
wxCollectionTypeInfo( const wxString &elementName , converterToString_t to , converterFromString_t from , const wxString &name) :
wxTypeInfo( wxT_COLLECTION , to , from , name )
{ m_elementTypeName = elementName ; m_elementType = NULL ;}
#if wxUSE_UNICODE
wxCollectionTypeInfo( const char *elementName , converterToString_t to , converterFromString_t from , const char *name ) :
wxTypeInfo( wxT_COLLECTION , to , from , name )
{ m_elementTypeName = wxString::FromAscii( elementName ) ; m_elementType = NULL ;}
#endif
const wxTypeInfo* GetElementType() const
{
if ( m_elementType == NULL )
m_elementType = wxTypeInfo::FindType( m_elementTypeName ) ;
return m_elementType ; }
private :
mutable wxTypeInfo * m_elementType ;
wxString m_elementTypeName ;
} ;
// a delegate is an exposed event source
class WXDLLIMPEXP_BASE wxDelegateTypeInfo : public wxTypeInfo
{
public :
wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to = NULL , converterFromString_t from = NULL ) ;
wxDelegateTypeInfo( int eventType , int lastEventType, wxClassInfo* eventClass , converterToString_t to = NULL , converterFromString_t from = NULL ) ;
int GetEventType() const { return m_eventType ; }
int GetLastEventType() const { return m_lastEventType ; }
const wxClassInfo* GetEventClass() const { return m_eventClass ; }
private :
const wxClassInfo *m_eventClass; // (extended will merge into classinfo)
int m_eventType ;
int m_lastEventType ;
} ;
template<typename T> const wxTypeInfo* wxGetTypeInfo( T * ) { return wxTypeInfo::FindType(typeid(T).name()) ; }
// this macro is for usage with custom, non-object derived classes and structs, wxPoint is such a custom type
#if wxUSE_FUNC_TEMPLATE_POINTER
#define wxCUSTOM_TYPE_INFO( e , toString , fromString ) \
wxCustomTypeInfo s_typeInfo##e(typeid(e).name() , &toString , &fromString) ;
#else
#define wxCUSTOM_TYPE_INFO( e , toString , fromString ) \
void ToString##e( const wxxVariant& data , wxString &result ) { toString(data, result); } \
void FromString##e( const wxString& data , wxxVariant &result ) { fromString(data, result); } \
wxCustomTypeInfo s_typeInfo##e(typeid(e).name() , &ToString##e , &FromString##e) ;
#endif
#define wxCOLLECTION_TYPE_INFO( element , collection ) \
wxCollectionTypeInfo s_typeInfo##collection( typeid(element).name() , NULL , NULL , typeid(collection).name() ) ;
// sometimes a compiler invents specializations that are nowhere called, use this macro to satisfy the refs, currently
// we don't have to play tricks, but if we will have to according to the compiler, we will use that macro for that
#define wxILLEGAL_TYPE_SPECIALIZATION( a )
// ----------------------------------------------------------------------------
// wxxVariant as typesafe data holder
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxxVariantData
{
public:
virtual ~wxxVariantData() {}
// return a heap allocated duplicate
virtual wxxVariantData* Clone() const = 0 ;
// returns the type info of the contentc
virtual const wxTypeInfo* GetTypeInfo() const = 0 ;
} ;
template<typename T> class wxxVariantDataT : public wxxVariantData
{
public:
wxxVariantDataT(const T& d) : m_data(d) {}
virtual ~wxxVariantDataT() {}
// get a ref to the stored data
T & Get() { return m_data; }
// get a const ref to the stored data
const T & Get() const { return m_data; }
// set the data
void Set(const T& d) { m_data = d; }
// return a heap allocated duplicate
virtual wxxVariantData* Clone() const { return new wxxVariantDataT<T>( Get() ) ; }
// returns the type info of the contentc
virtual const wxTypeInfo* GetTypeInfo() const { return wxGetTypeInfo( (T*) NULL ) ; }
private:
T m_data;
};
class WXDLLIMPEXP_BASE wxxVariant
{
public :
wxxVariant() { m_data = NULL ; }
wxxVariant( wxxVariantData* data , const wxString& name = wxEmptyString ) : m_data(data) , m_name(name) {}
wxxVariant( const wxxVariant &d ) { if ( d.m_data ) m_data = d.m_data->Clone() ; else m_data = NULL ; m_name = d.m_name ; }
template<typename T> wxxVariant( const T& data , const wxString& name = wxEmptyString ) :
m_data(new wxxVariantDataT<T>(data) ), m_name(name) {}
~wxxVariant() { delete m_data ; }
// get a ref to the stored data
template<typename T> T& Get(wxTEMPLATED_MEMBER_FIX(T))
{
wxxVariantDataT<T> *dataptr = dynamic_cast<wxxVariantDataT<T>*> (m_data) ;
wxASSERT_MSG( dataptr , wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) ) ;
return dataptr->Get() ;
}
// get a ref to the stored data
template<typename T> const T& Get(wxTEMPLATED_MEMBER_FIX(T)) const
{
const wxxVariantDataT<T> *dataptr = dynamic_cast<const wxxVariantDataT<T>*> (m_data) ;
wxASSERT_MSG( dataptr , wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) ) ;
return dataptr->Get() ;
}
bool IsEmpty() const { return m_data == NULL ; }
template<typename T> bool HasData(wxTEMPLATED_MEMBER_FIX(T)) const
{
const wxxVariantDataT<T> *dataptr = dynamic_cast<const wxxVariantDataT<T>*> (m_data) ;
return dataptr != NULL ;
}
// stores the data
template<typename T> void Set(const T& data) const
{
delete m_data ;
m_data = new wxxVariantDataT<T>(data) ;
}
wxxVariant& operator=(const wxxVariant &d)
{
delete m_data;
m_data = d.m_data ? d.m_data->Clone() : NULL ;
m_name = d.m_name ;
return *this ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?