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 + -
显示快捷键?