Added typeinfo.h which implements wxTypeId, using C++ RTTI if available. wxAny and Unbind<>() code are updated to use it. Added and updated related unit tests.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -426,6 +426,7 @@ ALL_BASE_HEADERS = \
|
|||||||
wx/tokenzr.h \
|
wx/tokenzr.h \
|
||||||
wx/tracker.h \
|
wx/tracker.h \
|
||||||
wx/txtstrm.h \
|
wx/txtstrm.h \
|
||||||
|
wx/typeinfo.h \
|
||||||
wx/types.h \
|
wx/types.h \
|
||||||
wx/unichar.h \
|
wx/unichar.h \
|
||||||
wx/uri.h \
|
wx/uri.h \
|
||||||
@@ -589,6 +590,7 @@ ALL_PORTS_BASE_HEADERS = \
|
|||||||
wx/tokenzr.h \
|
wx/tokenzr.h \
|
||||||
wx/tracker.h \
|
wx/tracker.h \
|
||||||
wx/txtstrm.h \
|
wx/txtstrm.h \
|
||||||
|
wx/typeinfo.h \
|
||||||
wx/types.h \
|
wx/types.h \
|
||||||
wx/unichar.h \
|
wx/unichar.h \
|
||||||
wx/uri.h \
|
wx/uri.h \
|
||||||
|
@@ -519,6 +519,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
wx/tokenzr.h
|
wx/tokenzr.h
|
||||||
wx/tracker.h
|
wx/tracker.h
|
||||||
wx/txtstrm.h
|
wx/txtstrm.h
|
||||||
|
wx/typeinfo.h
|
||||||
wx/types.h
|
wx/types.h
|
||||||
wx/unichar.h
|
wx/unichar.h
|
||||||
wx/uri.h
|
wx/uri.h
|
||||||
|
@@ -1539,6 +1539,10 @@ SOURCE=..\..\include\wx\txtstrm.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\include\wx\typeinfo.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\include\wx\types.h
|
SOURCE=..\..\include\wx\types.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@@ -1586,6 +1586,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath="..\..\include\wx\txtstrm.h">
|
RelativePath="..\..\include\wx\txtstrm.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\wx\typeinfo.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\include\wx\types.h">
|
RelativePath="..\..\include\wx\types.h">
|
||||||
</File>
|
</File>
|
||||||
|
@@ -2133,6 +2133,10 @@
|
|||||||
RelativePath="..\..\include\wx\txtstrm.h"
|
RelativePath="..\..\include\wx\txtstrm.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\wx\typeinfo.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\include\wx\types.h"
|
RelativePath="..\..\include\wx\types.h"
|
||||||
>
|
>
|
||||||
|
@@ -2129,6 +2129,10 @@
|
|||||||
RelativePath="..\..\include\wx\txtstrm.h"
|
RelativePath="..\..\include\wx\txtstrm.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\wx\typeinfo.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\include\wx\types.h"
|
RelativePath="..\..\include\wx\types.h"
|
||||||
>
|
>
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
#include "wx/string.h"
|
#include "wx/string.h"
|
||||||
#include "wx/meta/movable.h"
|
#include "wx/meta/movable.h"
|
||||||
#include "wx/meta/if.h"
|
#include "wx/meta/if.h"
|
||||||
|
#include "wx/typeinfo.h"
|
||||||
|
|
||||||
|
|
||||||
// Size of the wxAny value buffer.
|
// Size of the wxAny value buffer.
|
||||||
@@ -43,9 +44,6 @@ union wxAnyValueBuffer
|
|||||||
wxByte m_buffer[WX_ANY_VALUE_BUFFER_SIZE];
|
wxByte m_buffer[WX_ANY_VALUE_BUFFER_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*wxAnyClassInfo)();
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// wxAnyValueType is base class for value type functionality for C++ data
|
// wxAnyValueType is base class for value type functionality for C++ data
|
||||||
// types used with wxAny. Usually the default template (wxAnyValueTypeImpl<>)
|
// types used with wxAny. Usually the default template (wxAnyValueTypeImpl<>)
|
||||||
@@ -53,6 +51,7 @@ typedef void (*wxAnyClassInfo)();
|
|||||||
//
|
//
|
||||||
class WXDLLIMPEXP_BASE wxAnyValueType
|
class WXDLLIMPEXP_BASE wxAnyValueType
|
||||||
{
|
{
|
||||||
|
WX_DECLARE_ABSTRACT_TYPEINFO(wxAnyValueType)
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
Default constructor.
|
Default constructor.
|
||||||
@@ -66,11 +65,6 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
This function is used for internal type matching.
|
|
||||||
*/
|
|
||||||
virtual wxAnyClassInfo GetClassInfo() const = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function is used for internal type matching.
|
This function is used for internal type matching.
|
||||||
*/
|
*/
|
||||||
@@ -125,28 +119,22 @@ private:
|
|||||||
#define wxANY_VALUE_TYPE_CHECK_TYPE(valueTypePtr, T) \
|
#define wxANY_VALUE_TYPE_CHECK_TYPE(valueTypePtr, T) \
|
||||||
wxAnyValueTypeImpl<T>::IsSameClass(valueTypePtr)
|
wxAnyValueTypeImpl<T>::IsSameClass(valueTypePtr)
|
||||||
|
|
||||||
//valueTypePtr->CheckType(static_cast<T*>(NULL))
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Helper macro for defining user value types.
|
Helper macro for defining user value types.
|
||||||
|
|
||||||
NB: We really cannot compare sm_classInfo directly in IsSameClass(),
|
Even though C++ RTTI would be fully available to use, we'd have to to
|
||||||
but instead call sm_instance->GetClassInfo(). The former technique
|
facilitate sub-type system which allows, for instance, wxAny with
|
||||||
broke at least on GCC 4.2 (but worked on VC8 shared build).
|
signed short '15' to be treated equal to wxAny with signed long long '15'.
|
||||||
|
Having sm_instance is important here.
|
||||||
*/
|
*/
|
||||||
#define WX_DECLARE_ANY_VALUE_TYPE(CLS) \
|
#define WX_DECLARE_ANY_VALUE_TYPE(CLS) \
|
||||||
friend class wxAny; \
|
friend class wxAny; \
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(CLS) \
|
||||||
public: \
|
public: \
|
||||||
static void sm_classInfo() {} \
|
|
||||||
\
|
|
||||||
virtual wxAnyClassInfo GetClassInfo() const \
|
|
||||||
{ \
|
|
||||||
return sm_classInfo; \
|
|
||||||
} \
|
|
||||||
static bool IsSameClass(const wxAnyValueType* otherType) \
|
static bool IsSameClass(const wxAnyValueType* otherType) \
|
||||||
{ \
|
{ \
|
||||||
return sm_instance->GetClassInfo() == otherType->GetClassInfo(); \
|
return wxTypeId(*sm_instance) == wxTypeId(*otherType); \
|
||||||
} \
|
} \
|
||||||
virtual bool IsSameType(const wxAnyValueType* otherType) const \
|
virtual bool IsSameType(const wxAnyValueType* otherType) const \
|
||||||
{ \
|
{ \
|
||||||
|
@@ -153,6 +153,8 @@ extern WXDLLIMPEXP_BASE wxEventType wxNewEventType();
|
|||||||
|
|
||||||
#ifdef wxHAS_EVENT_BIND
|
#ifdef wxHAS_EVENT_BIND
|
||||||
|
|
||||||
|
#include "wx/typeinfo.h"
|
||||||
|
|
||||||
// The tag is a type associated to the event type (which is an integer itself,
|
// The tag is a type associated to the event type (which is an integer itself,
|
||||||
// in spite of its name) value. It exists in order to be used as a template
|
// in spite of its name) value. It exists in order to be used as a template
|
||||||
// parameter and provide a mapping between the event type values and their
|
// parameter and provide a mapping between the event type values and their
|
||||||
@@ -189,16 +191,6 @@ typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&);
|
|||||||
// compiler we can restore its old definition for it.
|
// compiler we can restore its old definition for it.
|
||||||
typedef wxEventFunction wxObjectEventFunction;
|
typedef wxEventFunction wxObjectEventFunction;
|
||||||
|
|
||||||
|
|
||||||
// wxEventFunctorClassInfo is used as a unique identifier for wxEventFunctor-
|
|
||||||
// derived classes; it is more light weight than wxClassInfo and can be used in
|
|
||||||
// template classes
|
|
||||||
typedef void (*wxEventFunctorClassInfo)();
|
|
||||||
|
|
||||||
// this macro must be used in wxEventFunctor-derived classes
|
|
||||||
#define wxDEFINE_EVENT_FUNCTOR_CLASS_INFO( classInfoName ) \
|
|
||||||
static void classInfoName() {}
|
|
||||||
|
|
||||||
// The event functor which is stored in the static and dynamic event tables:
|
// The event functor which is stored in the static and dynamic event tables:
|
||||||
class WXDLLIMPEXP_BASE wxEventFunctor
|
class WXDLLIMPEXP_BASE wxEventFunctor
|
||||||
{
|
{
|
||||||
@@ -212,11 +204,6 @@ public:
|
|||||||
// finding it in an event table in Unbind(), by the given functor:
|
// finding it in an event table in Unbind(), by the given functor:
|
||||||
virtual bool IsMatching(const wxEventFunctor& functor) const = 0;
|
virtual bool IsMatching(const wxEventFunctor& functor) const = 0;
|
||||||
|
|
||||||
// Test whether the given class info is the same as from this functor. This
|
|
||||||
// allows us in IsMatching to safely downcast the given wxEventFunctor without
|
|
||||||
// the usage of dynamic_cast<>().
|
|
||||||
virtual bool IsSameClass(wxEventFunctorClassInfo classInfo) const = 0;
|
|
||||||
|
|
||||||
// If the functor holds an wxEvtHandler, then get access to it and track
|
// If the functor holds an wxEvtHandler, then get access to it and track
|
||||||
// its lifetime with wxEventConnectionRef:
|
// its lifetime with wxEventConnectionRef:
|
||||||
virtual wxEvtHandler *GetEvtHandler() const
|
virtual wxEvtHandler *GetEvtHandler() const
|
||||||
@@ -228,6 +215,9 @@ public:
|
|||||||
// wxEventFunction:
|
// wxEventFunction:
|
||||||
virtual wxEventFunction GetEvtMethod() const
|
virtual wxEventFunction GetEvtMethod() const
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
WX_DECLARE_ABSTRACT_TYPEINFO(wxEventFunctor)
|
||||||
};
|
};
|
||||||
|
|
||||||
// A plain method functor for the untyped legacy event types:
|
// A plain method functor for the untyped legacy event types:
|
||||||
@@ -247,7 +237,7 @@ public:
|
|||||||
|
|
||||||
virtual bool IsMatching(const wxEventFunctor& functor) const
|
virtual bool IsMatching(const wxEventFunctor& functor) const
|
||||||
{
|
{
|
||||||
if ( functor.IsSameClass( sm_classInfo ))
|
if ( wxTypeId(functor) == wxTypeId(*this) )
|
||||||
{
|
{
|
||||||
const wxObjectEventFunctor &other =
|
const wxObjectEventFunctor &other =
|
||||||
static_cast< const wxObjectEventFunctor & >( functor );
|
static_cast< const wxObjectEventFunctor & >( functor );
|
||||||
@@ -262,9 +252,6 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsSameClass( wxEventFunctorClassInfo otherClassInfo ) const
|
|
||||||
{ return sm_classInfo == otherClassInfo; }
|
|
||||||
|
|
||||||
virtual wxEvtHandler *GetEvtHandler() const
|
virtual wxEvtHandler *GetEvtHandler() const
|
||||||
{ return m_handler; }
|
{ return m_handler; }
|
||||||
|
|
||||||
@@ -275,7 +262,10 @@ private:
|
|||||||
wxEvtHandler *m_handler;
|
wxEvtHandler *m_handler;
|
||||||
wxEventFunction m_method;
|
wxEventFunction m_method;
|
||||||
|
|
||||||
wxDEFINE_EVENT_FUNCTOR_CLASS_INFO( sm_classInfo );
|
// Provide a dummy default ctor for type info purposes
|
||||||
|
wxObjectEventFunctor() { }
|
||||||
|
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(wxObjectEventFunctor)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create a functor for the legacy events: used by Connect()
|
// Create a functor for the legacy events: used by Connect()
|
||||||
@@ -424,22 +414,19 @@ public:
|
|||||||
|
|
||||||
virtual bool IsMatching(const wxEventFunctor& functor) const
|
virtual bool IsMatching(const wxEventFunctor& functor) const
|
||||||
{
|
{
|
||||||
if ( !functor.IsSameClass(sm_classInfo) )
|
if ( wxTypeId(functor) != wxTypeId(*this) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
typedef wxEventFunctorMethod<EventTag, Class, EventArg, EventHandler>
|
typedef wxEventFunctorMethod<EventTag, Class, EventArg, EventHandler>
|
||||||
ThisFunctor;
|
ThisFunctor;
|
||||||
|
|
||||||
// the cast is valid because IsSameClass() returned true above
|
// the cast is valid because wxTypeId()s matched above
|
||||||
const ThisFunctor& other = static_cast<const ThisFunctor &>(functor);
|
const ThisFunctor& other = static_cast<const ThisFunctor &>(functor);
|
||||||
|
|
||||||
return (m_method == other.m_method || other.m_method == NULL) &&
|
return (m_method == other.m_method || other.m_method == NULL) &&
|
||||||
(m_handler == other.m_handler || other.m_handler == NULL);
|
(m_handler == other.m_handler || other.m_handler == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsSameClass( wxEventFunctorClassInfo otherClassInfo ) const
|
|
||||||
{ return sm_classInfo == otherClassInfo; }
|
|
||||||
|
|
||||||
virtual wxEvtHandler *GetEvtHandler() const
|
virtual wxEvtHandler *GetEvtHandler() const
|
||||||
{ return this->ConvertToEvtHandler(m_handler); }
|
{ return this->ConvertToEvtHandler(m_handler); }
|
||||||
|
|
||||||
@@ -450,7 +437,12 @@ private:
|
|||||||
EventHandler *m_handler;
|
EventHandler *m_handler;
|
||||||
void (Class::*m_method)(EventArg&);
|
void (Class::*m_method)(EventArg&);
|
||||||
|
|
||||||
wxDEFINE_EVENT_FUNCTOR_CLASS_INFO( sm_classInfo );
|
// Provide a dummy default ctor for type info purposes
|
||||||
|
wxEventFunctorMethod() { }
|
||||||
|
|
||||||
|
typedef wxEventFunctorMethod<EventTag, Class,
|
||||||
|
EventArg, EventHandler> thisClass;
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(thisClass)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -488,7 +480,7 @@ public:
|
|||||||
|
|
||||||
virtual bool IsMatching(const wxEventFunctor &functor) const
|
virtual bool IsMatching(const wxEventFunctor &functor) const
|
||||||
{
|
{
|
||||||
if ( !functor.IsSameClass(sm_classInfo) )
|
if ( wxTypeId(functor) != wxTypeId(*this) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
typedef wxEventFunctorFunction<EventTag, EventArg> ThisFunctor;
|
typedef wxEventFunctorFunction<EventTag, EventArg> ThisFunctor;
|
||||||
@@ -498,13 +490,14 @@ public:
|
|||||||
return m_handler == other.m_handler;
|
return m_handler == other.m_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsSameClass( wxEventFunctorClassInfo otherClassInfo ) const
|
|
||||||
{ return sm_classInfo == otherClassInfo; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void (*m_handler)(EventArg&);
|
void (*m_handler)(EventArg&);
|
||||||
|
|
||||||
wxDEFINE_EVENT_FUNCTOR_CLASS_INFO( sm_classInfo );
|
// Provide a dummy default ctor for type info purposes
|
||||||
|
wxEventFunctorFunction() { }
|
||||||
|
|
||||||
|
typedef wxEventFunctorFunction<EventTag, EventArg> thisClass;
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(thisClass)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -532,7 +525,7 @@ public:
|
|||||||
|
|
||||||
virtual bool IsMatching(const wxEventFunctor &functor) const
|
virtual bool IsMatching(const wxEventFunctor &functor) const
|
||||||
{
|
{
|
||||||
if ( !functor.IsSameClass(sm_classInfo) )
|
if ( wxTypeId(functor) != wxTypeId(*this) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
typedef wxEventFunctorFunctor<EventTag, Functor> FunctorThis;
|
typedef wxEventFunctorFunctor<EventTag, Functor> FunctorThis;
|
||||||
@@ -544,9 +537,6 @@ public:
|
|||||||
return m_handlerAddr == other.m_handlerAddr;
|
return m_handlerAddr == other.m_handlerAddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsSameClass( wxEventFunctorClassInfo otherClassInfo ) const
|
|
||||||
{ return sm_classInfo == otherClassInfo; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Store a copy of the functor to prevent using/calling an already
|
// Store a copy of the functor to prevent using/calling an already
|
||||||
// destroyed instance:
|
// destroyed instance:
|
||||||
@@ -555,7 +545,11 @@ private:
|
|||||||
// Use the address of the original functor for comparison in IsMatching:
|
// Use the address of the original functor for comparison in IsMatching:
|
||||||
const void *m_handlerAddr;
|
const void *m_handlerAddr;
|
||||||
|
|
||||||
wxDEFINE_EVENT_FUNCTOR_CLASS_INFO( sm_classInfo );
|
// Provide a dummy default ctor for type info purposes
|
||||||
|
wxEventFunctorFunctor() { }
|
||||||
|
|
||||||
|
typedef wxEventFunctorFunctor<EventTag, Functor> thisClass;
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(thisClass)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create functors for the templatized events, either allocated on the heap for
|
// Create functors for the templatized events, either allocated on the heap for
|
||||||
|
123
include/wx/typeinfo.h
Normal file
123
include/wx/typeinfo.h
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: wx/typeinfo.h
|
||||||
|
// Purpose: wxTypeId implementation
|
||||||
|
// Author: Jaakko Salli
|
||||||
|
// Created: 2009-11-19
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) wxWidgets Team
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_TYPEINFO_H_
|
||||||
|
#define _WX_TYPEINFO_H_
|
||||||
|
|
||||||
|
//
|
||||||
|
// This file defines wxTypeId macro that should be used internally in
|
||||||
|
// wxWidgets instead of typeid(), for compatibility with builds that do
|
||||||
|
// not implement C++ RTTI. Also, type defining macros in this file are also
|
||||||
|
// intended for internal use only at this time and may change in future
|
||||||
|
// versions.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#ifndef wxNO_RTTI
|
||||||
|
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define _WX_DECLARE_TYPEINFO_CUSTOM(CLS, IDENTFUNC)
|
||||||
|
#define WX_DECLARE_TYPEINFO_INLINE(CLS)
|
||||||
|
#define WX_DECLARE_TYPEINFO(CLS)
|
||||||
|
#define WX_DEFINE_TYPEINFO(CLS)
|
||||||
|
#define WX_DECLARE_ABSTRACT_TYPEINFO(CLS)
|
||||||
|
|
||||||
|
//
|
||||||
|
// For improved type-safety, let's make the check using class name
|
||||||
|
// comparison. Most modern compilers already do this, but we cannot
|
||||||
|
// rely on all supported compilers to work this well. However, in
|
||||||
|
// cases where we'd know that typeid() would be flawless (as such),
|
||||||
|
// wxTypeId could of course simply be defined as typeid.
|
||||||
|
//
|
||||||
|
|
||||||
|
class wxTypeInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxTypeInfo(const char* className)
|
||||||
|
{
|
||||||
|
m_className = className;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const wxTypeInfo& other)
|
||||||
|
{
|
||||||
|
return strcmp(m_className, other.m_className) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const wxTypeInfo& other)
|
||||||
|
{
|
||||||
|
return strcmp(m_className, other.m_className) != 0;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
const char* m_className;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define wxTypeId(OBJ) wxTypeInfo(typeid(OBJ).name())
|
||||||
|
|
||||||
|
#else // if !wxNO_RTTI
|
||||||
|
|
||||||
|
//
|
||||||
|
// When C++ RTTI is not available, we will have to make the type comparison
|
||||||
|
// using pointer to a dummy static member function. This will fail if
|
||||||
|
// declared type is used across DLL boundaries, although using
|
||||||
|
// WX_DECLARE_TYPEINFO() and WX_DEFINE_TYPEINFO() pair instead of
|
||||||
|
// WX_DECLARE_TYPEINFO_INLINE() should fix this. However, that approach is
|
||||||
|
// usually not possible when type info needs to be declared for a template
|
||||||
|
// class.
|
||||||
|
//
|
||||||
|
|
||||||
|
typedef void (*wxTypeIdentifier)();
|
||||||
|
|
||||||
|
// Use this macro to declare type info with specified static function
|
||||||
|
// IDENTFUNC used as type identifier. Usually you should only use
|
||||||
|
// WX_DECLARE_TYPEINFO() or WX_DECLARE_TYPEINFO_INLINE() however.
|
||||||
|
#define _WX_DECLARE_TYPEINFO_CUSTOM(CLS, IDENTFUNC) \
|
||||||
|
public: \
|
||||||
|
virtual wxTypeIdentifier GetWxTypeId() const \
|
||||||
|
{ \
|
||||||
|
return reinterpret_cast<wxTypeIdentifier> \
|
||||||
|
(&IDENTFUNC); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use this macro to declare type info with externally specified
|
||||||
|
// type identifier, defined with WX_DEFINE_TYPEINFO().
|
||||||
|
#define WX_DECLARE_TYPEINFO(CLS) \
|
||||||
|
private: \
|
||||||
|
static CLS sm_wxClassInfo(); \
|
||||||
|
_WX_DECLARE_TYPEINFO_CUSTOM(CLS, sm_wxClassInfo)
|
||||||
|
|
||||||
|
// Use this macro to implement type identifier function required by
|
||||||
|
// WX_DECLARE_TYPEINFO().
|
||||||
|
// NOTE: CLS is required to have default ctor. If it doesn't
|
||||||
|
// already, you should provide a private dummy one.
|
||||||
|
#define WX_DEFINE_TYPEINFO(CLS) \
|
||||||
|
CLS CLS::sm_wxClassInfo() { return CLS(); }
|
||||||
|
|
||||||
|
// Use this macro to declare type info fully inline in class.
|
||||||
|
// NOTE: CLS is required to have default ctor. If it doesn't
|
||||||
|
// already, you should provide a private dummy one.
|
||||||
|
#define WX_DECLARE_TYPEINFO_INLINE(CLS) \
|
||||||
|
private: \
|
||||||
|
static CLS sm_wxClassInfo() { return CLS(); } \
|
||||||
|
_WX_DECLARE_TYPEINFO_CUSTOM(CLS, sm_wxClassInfo)
|
||||||
|
|
||||||
|
#define wxTypeId(OBJ) (OBJ).GetWxTypeId()
|
||||||
|
|
||||||
|
// Because abstract classes cannot be instantiated, we use
|
||||||
|
// this macro to define pure virtual type interface for them.
|
||||||
|
#define WX_DECLARE_ABSTRACT_TYPEINFO(CLS) \
|
||||||
|
public: \
|
||||||
|
virtual wxTypeIdentifier GetWxTypeId() const = 0;
|
||||||
|
|
||||||
|
#endif // wxNO_RTTI/!wxNO_RTTI
|
||||||
|
|
||||||
|
#endif // _WX_TYPEINFO_H_
|
@@ -63,25 +63,6 @@
|
|||||||
Note that pointers to any and all classes are already automatically
|
Note that pointers to any and all classes are already automatically
|
||||||
declared as movable data.
|
declared as movable data.
|
||||||
|
|
||||||
@warning Caveat with shared libraries (DLLs): If you have a scenario where
|
|
||||||
you use wxAny across application's shared library and application
|
|
||||||
itself (or, with another of your shared libraries), then you must
|
|
||||||
use wxDECLARE_ANY_TYPE() macro in your shared library code to
|
|
||||||
correctly make sure that the wxAnyValueType implementation is
|
|
||||||
generated correctly. Failure to do this will result in breakage
|
|
||||||
of the wxAny type recognition with type in question. Below is an
|
|
||||||
example how to use the macro.
|
|
||||||
@code
|
|
||||||
// In your shared library/DLL-only
|
|
||||||
wxDECLARE_ANY_TYPE(MyClass, WXEXPORT)
|
|
||||||
|
|
||||||
// In your shared library/DLL source code
|
|
||||||
WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl<MyClass>)
|
|
||||||
|
|
||||||
// In code using said shared library/DLL
|
|
||||||
wxDECLARE_ANY_TYPE(MyClass, WXIMPORT)
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
@library{wxbase}
|
@library{wxbase}
|
||||||
@category{data}
|
@category{data}
|
||||||
|
|
||||||
@@ -433,11 +414,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void DeleteValue(wxAnyValueBuffer& buf) const = 0;
|
virtual void DeleteValue(wxAnyValueBuffer& buf) const = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
This function is used for internal type matching.
|
|
||||||
*/
|
|
||||||
virtual wxAnyClassInfo GetClassInfo() const = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function is used for internal type matching.
|
This function is used for internal type matching.
|
||||||
*/
|
*/
|
||||||
|
@@ -82,6 +82,7 @@ TEST_OBJECTS = \
|
|||||||
test_convautotest.o \
|
test_convautotest.o \
|
||||||
test_mbconvtest.o \
|
test_mbconvtest.o \
|
||||||
test_misctests.o \
|
test_misctests.o \
|
||||||
|
test_typeinfotest.o \
|
||||||
test_ipc.o \
|
test_ipc.o \
|
||||||
test_socket.o \
|
test_socket.o \
|
||||||
test_regextest.o \
|
test_regextest.o \
|
||||||
@@ -434,6 +435,9 @@ test_mbconvtest.o: $(srcdir)/mbconv/mbconvtest.cpp $(TEST_ODEP)
|
|||||||
test_misctests.o: $(srcdir)/misc/misctests.cpp $(TEST_ODEP)
|
test_misctests.o: $(srcdir)/misc/misctests.cpp $(TEST_ODEP)
|
||||||
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/misc/misctests.cpp
|
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/misc/misctests.cpp
|
||||||
|
|
||||||
|
test_typeinfotest.o: $(srcdir)/misc/typeinfotest.cpp $(TEST_ODEP)
|
||||||
|
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/misc/typeinfotest.cpp
|
||||||
|
|
||||||
test_ipc.o: $(srcdir)/net/ipc.cpp $(TEST_ODEP)
|
test_ipc.o: $(srcdir)/net/ipc.cpp $(TEST_ODEP)
|
||||||
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/net/ipc.cpp
|
$(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/net/ipc.cpp
|
||||||
|
|
||||||
|
@@ -200,6 +200,12 @@ void wxAnyTestCase::Equality()
|
|||||||
CPPUNIT_ASSERT(wxANY_AS(m_anyWxObjectPtr2, wxObject*)
|
CPPUNIT_ASSERT(wxANY_AS(m_anyWxObjectPtr2, wxObject*)
|
||||||
== dummyWxObjectPointer);
|
== dummyWxObjectPointer);
|
||||||
CPPUNIT_ASSERT(wxANY_AS(m_anyVoidPtr2, void*) == dummyVoidPointer);
|
CPPUNIT_ASSERT(wxANY_AS(m_anyVoidPtr2, void*) == dummyVoidPointer);
|
||||||
|
|
||||||
|
// Test sub-type system type compatibility
|
||||||
|
CPPUNIT_ASSERT(m_anySignedShort1.GetType()->
|
||||||
|
IsSameType(m_anySignedLongLong1.GetType()));
|
||||||
|
CPPUNIT_ASSERT(m_anyUnsignedShort1.GetType()->
|
||||||
|
IsSameType(m_anyUnsignedLongLong1.GetType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxAnyTestCase::As()
|
void wxAnyTestCase::As()
|
||||||
@@ -266,6 +272,7 @@ void wxAnyTestCase::GetAs()
|
|||||||
// Test dynamic conversion
|
// Test dynamic conversion
|
||||||
bool res;
|
bool res;
|
||||||
long l = 0;
|
long l = 0;
|
||||||
|
short int si = 0;
|
||||||
unsigned long ul = 0;
|
unsigned long ul = 0;
|
||||||
wxString s;
|
wxString s;
|
||||||
// Let's test against float instead of double, since the former
|
// Let's test against float instead of double, since the former
|
||||||
@@ -275,9 +282,14 @@ void wxAnyTestCase::GetAs()
|
|||||||
bool b = false;
|
bool b = false;
|
||||||
|
|
||||||
// Conversions from signed long type
|
// Conversions from signed long type
|
||||||
|
// The first check should be enough to make sure that the sub-type system
|
||||||
|
// has not failed.
|
||||||
|
res = m_anySignedLong1.GetAs(&si);
|
||||||
|
CPPUNIT_ASSERT(res);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(si, 15);
|
||||||
res = m_anySignedLong1.GetAs(&ul);
|
res = m_anySignedLong1.GetAs(&ul);
|
||||||
CPPUNIT_ASSERT(res);
|
CPPUNIT_ASSERT(res);
|
||||||
CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(15));
|
CPPUNIT_ASSERT_EQUAL(ul, 15UL);
|
||||||
res = m_anySignedLong1.GetAs(&s);
|
res = m_anySignedLong1.GetAs(&s);
|
||||||
CPPUNIT_ASSERT(res);
|
CPPUNIT_ASSERT(res);
|
||||||
CPPUNIT_ASSERT(s == "15");
|
CPPUNIT_ASSERT(s == "15");
|
||||||
|
@@ -66,6 +66,7 @@ TEST_OBJECTS = \
|
|||||||
$(OBJS)\test_convautotest.obj \
|
$(OBJS)\test_convautotest.obj \
|
||||||
$(OBJS)\test_mbconvtest.obj \
|
$(OBJS)\test_mbconvtest.obj \
|
||||||
$(OBJS)\test_misctests.obj \
|
$(OBJS)\test_misctests.obj \
|
||||||
|
$(OBJS)\test_typeinfotest.obj \
|
||||||
$(OBJS)\test_ipc.obj \
|
$(OBJS)\test_ipc.obj \
|
||||||
$(OBJS)\test_socket.obj \
|
$(OBJS)\test_socket.obj \
|
||||||
$(OBJS)\test_regextest.obj \
|
$(OBJS)\test_regextest.obj \
|
||||||
@@ -479,6 +480,9 @@ $(OBJS)\test_mbconvtest.obj: .\mbconv\mbconvtest.cpp
|
|||||||
$(OBJS)\test_misctests.obj: .\misc\misctests.cpp
|
$(OBJS)\test_misctests.obj: .\misc\misctests.cpp
|
||||||
$(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\misc\misctests.cpp
|
$(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\misc\misctests.cpp
|
||||||
|
|
||||||
|
$(OBJS)\test_typeinfotest.obj: .\misc\typeinfotest.cpp
|
||||||
|
$(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\misc\typeinfotest.cpp
|
||||||
|
|
||||||
$(OBJS)\test_ipc.obj: .\net\ipc.cpp
|
$(OBJS)\test_ipc.obj: .\net\ipc.cpp
|
||||||
$(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\net\ipc.cpp
|
$(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\net\ipc.cpp
|
||||||
|
|
||||||
|
@@ -58,6 +58,7 @@ TEST_OBJECTS = \
|
|||||||
$(OBJS)\test_convautotest.o \
|
$(OBJS)\test_convautotest.o \
|
||||||
$(OBJS)\test_mbconvtest.o \
|
$(OBJS)\test_mbconvtest.o \
|
||||||
$(OBJS)\test_misctests.o \
|
$(OBJS)\test_misctests.o \
|
||||||
|
$(OBJS)\test_typeinfotest.o \
|
||||||
$(OBJS)\test_ipc.o \
|
$(OBJS)\test_ipc.o \
|
||||||
$(OBJS)\test_socket.o \
|
$(OBJS)\test_socket.o \
|
||||||
$(OBJS)\test_regextest.o \
|
$(OBJS)\test_regextest.o \
|
||||||
@@ -460,6 +461,9 @@ $(OBJS)\test_mbconvtest.o: ./mbconv/mbconvtest.cpp
|
|||||||
$(OBJS)\test_misctests.o: ./misc/misctests.cpp
|
$(OBJS)\test_misctests.o: ./misc/misctests.cpp
|
||||||
$(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $<
|
$(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $<
|
||||||
|
|
||||||
|
$(OBJS)\test_typeinfotest.o: ./misc/typeinfotest.cpp
|
||||||
|
$(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $<
|
||||||
|
|
||||||
$(OBJS)\test_ipc.o: ./net/ipc.cpp
|
$(OBJS)\test_ipc.o: ./net/ipc.cpp
|
||||||
$(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $<
|
$(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $<
|
||||||
|
|
||||||
|
@@ -60,6 +60,7 @@ TEST_OBJECTS = \
|
|||||||
$(OBJS)\test_convautotest.obj \
|
$(OBJS)\test_convautotest.obj \
|
||||||
$(OBJS)\test_mbconvtest.obj \
|
$(OBJS)\test_mbconvtest.obj \
|
||||||
$(OBJS)\test_misctests.obj \
|
$(OBJS)\test_misctests.obj \
|
||||||
|
$(OBJS)\test_typeinfotest.obj \
|
||||||
$(OBJS)\test_ipc.obj \
|
$(OBJS)\test_ipc.obj \
|
||||||
$(OBJS)\test_socket.obj \
|
$(OBJS)\test_socket.obj \
|
||||||
$(OBJS)\test_regextest.obj \
|
$(OBJS)\test_regextest.obj \
|
||||||
@@ -599,6 +600,9 @@ $(OBJS)\test_mbconvtest.obj: .\mbconv\mbconvtest.cpp
|
|||||||
$(OBJS)\test_misctests.obj: .\misc\misctests.cpp
|
$(OBJS)\test_misctests.obj: .\misc\misctests.cpp
|
||||||
$(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\misc\misctests.cpp
|
$(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\misc\misctests.cpp
|
||||||
|
|
||||||
|
$(OBJS)\test_typeinfotest.obj: .\misc\typeinfotest.cpp
|
||||||
|
$(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\misc\typeinfotest.cpp
|
||||||
|
|
||||||
$(OBJS)\test_ipc.obj: .\net\ipc.cpp
|
$(OBJS)\test_ipc.obj: .\net\ipc.cpp
|
||||||
$(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\net\ipc.cpp
|
$(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\net\ipc.cpp
|
||||||
|
|
||||||
|
@@ -300,6 +300,7 @@ TEST_OBJECTS = &
|
|||||||
$(OBJS)\test_convautotest.obj &
|
$(OBJS)\test_convautotest.obj &
|
||||||
$(OBJS)\test_mbconvtest.obj &
|
$(OBJS)\test_mbconvtest.obj &
|
||||||
$(OBJS)\test_misctests.obj &
|
$(OBJS)\test_misctests.obj &
|
||||||
|
$(OBJS)\test_typeinfotest.obj &
|
||||||
$(OBJS)\test_ipc.obj &
|
$(OBJS)\test_ipc.obj &
|
||||||
$(OBJS)\test_socket.obj &
|
$(OBJS)\test_socket.obj &
|
||||||
$(OBJS)\test_regextest.obj &
|
$(OBJS)\test_regextest.obj &
|
||||||
@@ -518,6 +519,9 @@ $(OBJS)\test_mbconvtest.obj : .AUTODEPEND .\mbconv\mbconvtest.cpp
|
|||||||
$(OBJS)\test_misctests.obj : .AUTODEPEND .\misc\misctests.cpp
|
$(OBJS)\test_misctests.obj : .AUTODEPEND .\misc\misctests.cpp
|
||||||
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $<
|
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $<
|
||||||
|
|
||||||
|
$(OBJS)\test_typeinfotest.obj : .AUTODEPEND .\misc\typeinfotest.cpp
|
||||||
|
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $<
|
||||||
|
|
||||||
$(OBJS)\test_ipc.obj : .AUTODEPEND .\net\ipc.cpp
|
$(OBJS)\test_ipc.obj : .AUTODEPEND .\net\ipc.cpp
|
||||||
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $<
|
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $<
|
||||||
|
|
||||||
|
92
tests/misc/typeinfotest.cpp
Normal file
92
tests/misc/typeinfotest.cpp
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: tests/misc/typeinfotest.cpp
|
||||||
|
// Purpose: Test typeinfo.h
|
||||||
|
// Author: Jaakko Salli
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) the wxWidgets team
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "testprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
# pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/typeinfo.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// test class
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class TypeInfoTestCase : public CppUnit::TestCase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TypeInfoTestCase() { }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CPPUNIT_TEST_SUITE( TypeInfoTestCase );
|
||||||
|
CPPUNIT_TEST( Test );
|
||||||
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
void Test();
|
||||||
|
|
||||||
|
DECLARE_NO_COPY_CLASS(TypeInfoTestCase)
|
||||||
|
};
|
||||||
|
|
||||||
|
// register in the unnamed registry so that these tests are run by default
|
||||||
|
CPPUNIT_TEST_SUITE_REGISTRATION( TypeInfoTestCase );
|
||||||
|
|
||||||
|
// also include in it's own registry so that these tests can be run alone
|
||||||
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TypeInfoTestCase, "TypeInfoTestCase" );
|
||||||
|
|
||||||
|
|
||||||
|
namespace UserNameSpace {
|
||||||
|
class UserType1
|
||||||
|
{
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(UserType1)
|
||||||
|
public:
|
||||||
|
virtual ~UserType1() { }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserType1
|
||||||
|
{
|
||||||
|
WX_DECLARE_TYPEINFO_INLINE(UserType1)
|
||||||
|
public:
|
||||||
|
virtual ~UserType1() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
class UserType2
|
||||||
|
{
|
||||||
|
WX_DECLARE_TYPEINFO(UserType2)
|
||||||
|
public:
|
||||||
|
virtual ~UserType2() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
WX_DEFINE_TYPEINFO(UserType2)
|
||||||
|
|
||||||
|
void TypeInfoTestCase::Test()
|
||||||
|
{
|
||||||
|
UserNameSpace::UserType1 uns_ut1;
|
||||||
|
UserNameSpace::UserType1* uns_ut1_p = new UserNameSpace::UserType1();
|
||||||
|
UserType1 ut1;
|
||||||
|
UserType1* ut1_p = new UserType1();
|
||||||
|
UserType2 ut2;
|
||||||
|
UserType2* ut2_p = new UserType2();
|
||||||
|
|
||||||
|
// These type comparison should match
|
||||||
|
CPPUNIT_ASSERT(wxTypeId(uns_ut1) == wxTypeId(*uns_ut1_p));
|
||||||
|
CPPUNIT_ASSERT(wxTypeId(ut1) == wxTypeId(*ut1_p));
|
||||||
|
CPPUNIT_ASSERT(wxTypeId(ut2) == wxTypeId(*ut2_p));
|
||||||
|
|
||||||
|
// These type comparison should not match
|
||||||
|
CPPUNIT_ASSERT(wxTypeId(uns_ut1) != wxTypeId(ut1));
|
||||||
|
CPPUNIT_ASSERT(wxTypeId(uns_ut1) != wxTypeId(ut2));
|
||||||
|
CPPUNIT_ASSERT(wxTypeId(ut1) != wxTypeId(ut2));
|
||||||
|
|
||||||
|
delete uns_ut1_p;
|
||||||
|
delete ut1_p;
|
||||||
|
delete ut2_p;
|
||||||
|
}
|
||||||
|
|
@@ -57,6 +57,7 @@
|
|||||||
mbconv/convautotest.cpp
|
mbconv/convautotest.cpp
|
||||||
mbconv/mbconvtest.cpp
|
mbconv/mbconvtest.cpp
|
||||||
misc/misctests.cpp
|
misc/misctests.cpp
|
||||||
|
misc/typeinfotest.cpp
|
||||||
net/ipc.cpp
|
net/ipc.cpp
|
||||||
net/socket.cpp
|
net/socket.cpp
|
||||||
regex/regextest.cpp
|
regex/regextest.cpp
|
||||||
|
@@ -461,6 +461,10 @@ SOURCE=.\strings\tokenizer.cpp
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\misc\typeinfotest.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\strings\unichar.cpp
|
SOURCE=.\strings\unichar.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@@ -781,6 +781,9 @@
|
|||||||
<File
|
<File
|
||||||
RelativePath=".\strings\tokenizer.cpp">
|
RelativePath=".\strings\tokenizer.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\misc\typeinfotest.cpp">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\strings\unichar.cpp">
|
RelativePath=".\strings\unichar.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
@@ -1115,6 +1115,10 @@
|
|||||||
RelativePath=".\strings\tokenizer.cpp"
|
RelativePath=".\strings\tokenizer.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\misc\typeinfotest.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\strings\unichar.cpp"
|
RelativePath=".\strings\unichar.cpp"
|
||||||
>
|
>
|
||||||
|
@@ -1087,6 +1087,10 @@
|
|||||||
RelativePath=".\strings\tokenizer.cpp"
|
RelativePath=".\strings\tokenizer.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\misc\typeinfotest.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\strings\unichar.cpp"
|
RelativePath=".\strings\unichar.cpp"
|
||||||
>
|
>
|
||||||
|
@@ -322,6 +322,7 @@ wx/tls.h
|
|||||||
wx/tokenzr.h
|
wx/tokenzr.h
|
||||||
wx/tracker.h
|
wx/tracker.h
|
||||||
wx/txtstrm.h
|
wx/txtstrm.h
|
||||||
|
wx/typeinfo.h
|
||||||
wx/types.h
|
wx/types.h
|
||||||
wx/unichar.h
|
wx/unichar.h
|
||||||
wx/uri.h
|
wx/uri.h
|
||||||
|
@@ -227,6 +227,7 @@ wx/tls.h
|
|||||||
wx/tokenzr.h
|
wx/tokenzr.h
|
||||||
wx/tracker.h
|
wx/tracker.h
|
||||||
wx/txtstrm.h
|
wx/txtstrm.h
|
||||||
|
wx/typeinfo.h
|
||||||
wx/types.h
|
wx/types.h
|
||||||
wx/unichar.h
|
wx/unichar.h
|
||||||
wx/uri.h
|
wx/uri.h
|
||||||
|
@@ -251,6 +251,7 @@ wx/tls.h
|
|||||||
wx/tokenzr.h
|
wx/tokenzr.h
|
||||||
wx/tracker.h
|
wx/tracker.h
|
||||||
wx/txtstrm.h
|
wx/txtstrm.h
|
||||||
|
wx/typeinfo.h
|
||||||
wx/types.h
|
wx/types.h
|
||||||
wx/unichar.h
|
wx/unichar.h
|
||||||
wx/uri.h
|
wx/uri.h
|
||||||
|
Reference in New Issue
Block a user