]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/any.h
Don't define __STRICT_ANSI__, we should build both with and without it.
[wxWidgets.git] / include / wx / any.h
index 614cb09db75eeccb832363d05923e31b37426eca..c2cd7a79f437ff9d32bbcda832dc1153c0178814 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     07/05/2009
-// RCS-ID:      $Id$
 // Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -113,6 +112,10 @@ public:
     // FIXME-VC6: remove this hack when VC6 is no longer supported
     template <typename T>
     bool CheckType(T* reserved = NULL) const;
+
+#if wxUSE_EXTENDED_RTTI
+    virtual const wxTypeInfo* GetTypeInfo() const = 0;
+#endif
 private:
 };
 
@@ -314,6 +317,12 @@ public:
     {
         return Ops::GetValue(buf);
     }
+#if wxUSE_EXTENDED_RTTI
+    virtual const wxTypeInfo* GetTypeInfo() const 
+    {
+        return wxGetTypeInfo((T*)NULL);
+    }
+#endif
 };
 
 
@@ -348,7 +357,7 @@ wxAnyValueTypeScopedPtr wxAnyValueTypeImpl<T>::sm_instance = new wxAnyValueTypeI
 // Helper macro for using same base value type implementation for multiple
 // actual C++ data types.
 //
-#define WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \
+#define _WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \
 template<> \
 class wxAnyValueTypeImpl<T> : public wxAnyValueTypeImpl##CLSTYPE \
 { \
@@ -369,9 +378,21 @@ public: \
         const UseDataType* sptr = \
             reinterpret_cast<const UseDataType*>(voidPtr); \
         return static_cast<T>(*sptr); \
+    } 
+
+#if wxUSE_EXTENDED_RTTI
+#define WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \
+_WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE)\
+    virtual const wxTypeInfo* GetTypeInfo() const  \
+    { \
+        return wxGetTypeInfo((T*)NULL); \
     } \
 };
-
+#else
+#define WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE) \
+_WX_ANY_DEFINE_SUB_TYPE(T, CLSTYPE)\
+};
+#endif
 
 //
 //  Integer value types
@@ -890,6 +911,8 @@ public:
     WXANY_IMPLEMENT_INT_EQ_OP(wxLongLong_t, wxULongLong_t)
 #endif
 
+    wxGCC_WARNING_SUPPRESS(float-equal)
+
     bool operator==(float value) const
     {
         if ( !wxAnyValueTypeImpl<float>::IsSameClass(m_type) )
@@ -910,6 +933,8 @@ public:
                 (wxAnyValueTypeImpl<double>::GetValue(m_buffer));
     }
 
+    wxGCC_WARNING_RESTORE(float-equal)
+
     bool operator==(bool value) const
     {
         if ( !wxAnyValueTypeImpl<bool>::IsSameClass(m_type) )
@@ -967,6 +992,12 @@ public:
         return value;
     }
 
+#if wxUSE_EXTENDED_RTTI
+    const wxTypeInfo* GetTypeInfo() const
+    {
+        return m_type->GetTypeInfo();
+    }
+#endif
     /**
         Template function that retrieves and converts the value of this
         variant to the type that T* value is.
@@ -1007,15 +1038,12 @@ private:
     // Assignment functions
     void AssignAny(const wxAny& any)
     {
-        if ( m_type != wxAnyNullValueType )
-        {
-            // Must delete value - CopyBuffer() never does that
-            m_type->DeleteValue(m_buffer);
-        }
+        // Must delete value - CopyBuffer() never does that
+        m_type->DeleteValue(m_buffer);
 
         wxAnyValueType* newType = any.m_type;
 
-        if ( m_type == wxAnyNullValueType || !newType->IsSameType(m_type) )
+        if ( !newType->IsSameType(m_type) )
             m_type = newType;
 
         newType->CopyBuffer(any.m_buffer, m_buffer);