No real changes, just clean up sources by removing trailing spaces from all the non-generated files. This should hopefully avoid future commits mixing significant changes with insignificant whitespace ones.
		
			
				
	
	
		
			279 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        wx/variantbase.h
 | |
| // Purpose:     wxVariantBase class, a minimal version of wxVariant used by XTI
 | |
| // Author:      Julian Smart
 | |
| // Modified by: Francesco Montorsi
 | |
| // Created:     10/09/98
 | |
| // Copyright:   (c) Julian Smart
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef _WX_VARIANTBASE_H_
 | |
| #define _WX_VARIANTBASE_H_
 | |
| 
 | |
| #include "wx/defs.h"
 | |
| 
 | |
| #if wxUSE_VARIANT
 | |
| 
 | |
| #include "wx/string.h"
 | |
| #include "wx/arrstr.h"
 | |
| #include "wx/cpp.h"
 | |
| #include <typeinfo>
 | |
| 
 | |
| #if wxUSE_DATETIME
 | |
|     #include "wx/datetime.h"
 | |
| #endif // wxUSE_DATETIME
 | |
| 
 | |
| #include "wx/iosfwrap.h"
 | |
| 
 | |
| class wxTypeInfo;
 | |
| class wxObject;
 | |
| class wxClassInfo;
 | |
| 
 | |
| /*
 | |
|  * wxVariantData stores the actual data in a wxVariant object,
 | |
|  * to allow it to store any type of data.
 | |
|  * Derive from this to provide custom data handling.
 | |
|  *
 | |
|  * NB: To prevent addition of extra vtbl pointer to wxVariantData,
 | |
|  *     we don't multiple-inherit from wxObjectRefData. Instead,
 | |
|  *     we simply replicate the wxObject ref-counting scheme.
 | |
|  *
 | |
|  * NB: When you construct a wxVariantData, it will have refcount
 | |
|  *     of one. Refcount will not be further increased when
 | |
|  *     it is passed to wxVariant. This simulates old common
 | |
|  *     scenario where wxVariant took ownership of wxVariantData
 | |
|  *     passed to it.
 | |
|  *     If you create wxVariantData for other reasons than passing
 | |
|  *     it to wxVariant, technically you are not required to call
 | |
|  *     DecRef() before deleting it.
 | |
|  *
 | |
|  * TODO: in order to replace wxPropertyValue, we would need
 | |
|  * to consider adding constructors that take pointers to C++ variables,
 | |
|  * or removing that functionality from the wxProperty library.
 | |
|  * Essentially wxPropertyValue takes on some of the wxValidator functionality
 | |
|  * by storing pointers and not just actual values, allowing update of C++ data
 | |
|  * to be handled automatically. Perhaps there's another way of doing this without
 | |
|  * overloading wxVariant with unnecessary functionality.
 | |
|  */
 | |
| 
 | |
| class WXDLLIMPEXP_BASE wxVariantData
 | |
| {
 | |
|     friend class wxVariantBase;
 | |
| 
 | |
| public:
 | |
|     wxVariantData()
 | |
|         : m_count(1)
 | |
|     { }
 | |
| 
 | |
| #if wxUSE_STD_IOSTREAM
 | |
|     virtual bool Write(wxSTD ostream& WXUNUSED(str)) const { return false; }
 | |
|     virtual bool Read(wxSTD istream& WXUNUSED(str)) { return false; }
 | |
| #endif
 | |
|     virtual bool Write(wxString& WXUNUSED(str)) const { return false; }
 | |
|     virtual bool Read(wxString& WXUNUSED(str)) { return false; }
 | |
| 
 | |
|     // Override these to provide common functionality
 | |
|     virtual bool Eq(wxVariantData& data) const = 0;
 | |
| 
 | |
|     // What type is it? Return a string name.
 | |
|     virtual wxString GetType() const = 0;
 | |
| 
 | |
|     // returns the type info of the content
 | |
|     virtual const wxTypeInfo* GetTypeInfo() const = 0;
 | |
| 
 | |
|     // If it based on wxObject return the ClassInfo.
 | |
|     virtual wxClassInfo* GetValueClassInfo() { return NULL; }
 | |
| 
 | |
|     int GetRefCount() const
 | |
|         { return m_count; }
 | |
|     void IncRef()
 | |
|         { m_count++; }
 | |
|     void DecRef()
 | |
|     {
 | |
|         if ( --m_count == 0 )
 | |
|             delete this;
 | |
|     }
 | |
| 
 | |
| protected:
 | |
|     // Protected dtor should make some incompatible code
 | |
|     // break more louder. That is, they should do data->DecRef()
 | |
|     // instead of delete data.
 | |
|     virtual ~wxVariantData() {}
 | |
| 
 | |
| private:
 | |
|     int m_count;
 | |
| };
 | |
| 
 | |
| template<typename T> class wxVariantDataT : public wxVariantData
 | |
| {
 | |
| public:
 | |
|     wxVariantDataT(const T& d) : m_data(d) {}
 | |
|     virtual ~wxVariantDataT() {}
 | |
| 
 | |
|     // 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; }
 | |
| 
 | |
|     // Override these to provide common functionality
 | |
|     virtual bool Eq(wxVariantData& WXUNUSED(data)) const
 | |
|         { return false; /* FIXME!! */    }
 | |
| 
 | |
|     // What type is it? Return a string name.
 | |
|     virtual wxString GetType() const
 | |
|         { return GetTypeInfo()->GetTypeName(); }
 | |
| 
 | |
|     // return a heap allocated duplicate
 | |
|     //virtual wxVariantData* Clone() const { return new wxVariantDataT<T>( Get() ); }
 | |
| 
 | |
|     // returns the type info of the contentc
 | |
|     virtual const wxTypeInfo* GetTypeInfo() const { return wxGetTypeInfo( (T*) NULL ); }
 | |
| 
 | |
| private:
 | |
|     T m_data;
 | |
| };
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * wxVariantBase can store any kind of data, but has some basic types
 | |
|  * built in.
 | |
|  */
 | |
| 
 | |
| class WXDLLIMPEXP_BASE wxVariantBase
 | |
| {
 | |
| public:
 | |
|     wxVariantBase();
 | |
|     wxVariantBase(const wxVariantBase& variant);
 | |
|     wxVariantBase(wxVariantData* data, const wxString& name = wxEmptyString);
 | |
| 
 | |
|     template<typename T>
 | |
|         wxVariantBase(const T& data, const wxString& name = wxEmptyString) :
 | |
|             m_data(new wxVariantDataT<T>(data)), m_name(name) {}
 | |
| 
 | |
|     virtual ~wxVariantBase();
 | |
| 
 | |
|     // generic assignment
 | |
|     void operator= (const wxVariantBase& variant);
 | |
| 
 | |
|     // Assignment using data, e.g.
 | |
|     // myVariant = new wxStringVariantData("hello");
 | |
|     void operator= (wxVariantData* variantData);
 | |
| 
 | |
|     bool operator== (const wxVariantBase& variant) const;
 | |
|     bool operator!= (const wxVariantBase& variant) const;
 | |
| 
 | |
|     // Sets/gets name
 | |
|     inline void SetName(const wxString& name) { m_name = name; }
 | |
|     inline const wxString& GetName() const { return m_name; }
 | |
| 
 | |
|     // Tests whether there is data
 | |
|     bool IsNull() const;
 | |
| 
 | |
|     // FIXME: used by wxVariantBase code but is nice wording...
 | |
|     bool IsEmpty() const { return IsNull(); }
 | |
| 
 | |
|     // For compatibility with wxWidgets <= 2.6, this doesn't increase
 | |
|     // reference count.
 | |
|     wxVariantData* GetData() const { return m_data; }
 | |
|     void SetData(wxVariantData* data) ;
 | |
| 
 | |
|     // make a 'clone' of the object
 | |
|     void Ref(const wxVariantBase& clone);
 | |
| 
 | |
|     // destroy a reference
 | |
|     void UnRef();
 | |
| 
 | |
|     // Make NULL (i.e. delete the data)
 | |
|     void MakeNull();
 | |
| 
 | |
|     // write contents to a string (e.g. for debugging)
 | |
|     wxString MakeString() const;
 | |
| 
 | |
|     // Delete data and name
 | |
|     void Clear();
 | |
| 
 | |
|     // Returns a string representing the type of the variant,
 | |
|     // e.g. "string", "bool", "stringlist", "list", "double", "long"
 | |
|     wxString GetType() const;
 | |
| 
 | |
|     bool IsType(const wxString& type) const;
 | |
|     bool IsValueKindOf(const wxClassInfo* type) const;
 | |
| 
 | |
|     // FIXME wxXTI methods:
 | |
| 
 | |
|     // get the typeinfo of the stored object
 | |
|     const wxTypeInfo* GetTypeInfo() const
 | |
|     {
 | |
|         if (!m_data)
 | |
|             return NULL;
 | |
|         return m_data->GetTypeInfo();
 | |
|     }
 | |
| 
 | |
|     // get a ref to the stored data
 | |
|     template<typename T> T& Get()
 | |
|     {
 | |
|         wxVariantDataT<T> *dataptr =
 | |
|             wx_dynamic_cast(wxVariantDataT<T>*, m_data);
 | |
|         wxASSERT_MSG( dataptr,
 | |
|             wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) );
 | |
|         return dataptr->Get();
 | |
|     }
 | |
| 
 | |
|     // get a const ref to the stored data
 | |
|     template<typename T> const T& Get() const
 | |
|     {
 | |
|         const wxVariantDataT<T> *dataptr =
 | |
|             wx_dynamic_cast(const wxVariantDataT<T>*, m_data);
 | |
|         wxASSERT_MSG( dataptr,
 | |
|             wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) );
 | |
|         return dataptr->Get();
 | |
|     }
 | |
| 
 | |
|     template<typename T> bool HasData() const
 | |
|     {
 | |
|         const wxVariantDataT<T> *dataptr =
 | |
|             wx_dynamic_cast(const wxVariantDataT<T>*, m_data);
 | |
|         return dataptr != NULL;
 | |
|     }
 | |
| 
 | |
|     // returns this value as string
 | |
|     wxString GetAsString() const;
 | |
| 
 | |
|     // gets the stored data casted to a wxObject*,
 | |
|     // returning NULL if cast is not possible
 | |
|     wxObject* GetAsObject();
 | |
| 
 | |
| protected:
 | |
|     wxVariantData*  m_data;
 | |
|     wxString        m_name;
 | |
| };
 | |
| 
 | |
| #include "wx/dynarray.h"
 | |
| WX_DECLARE_OBJARRAY_WITH_DECL(wxVariantBase, wxVariantBaseArray, class WXDLLIMPEXP_BASE);
 | |
| 
 | |
| 
 | |
| // templated streaming, every type must have their specialization for these methods
 | |
| 
 | |
| template<typename T>
 | |
| void wxStringReadValue( const wxString &s, T &data );
 | |
| 
 | |
| template<typename T>
 | |
| void wxStringWriteValue( wxString &s, const T &data);
 | |
| 
 | |
| template<typename T>
 | |
| void wxToStringConverter( const wxVariantBase &v, wxString &s ) \
 | |
|     { wxStringWriteValue( s, v.Get<T>() ); }
 | |
| 
 | |
| template<typename T>
 | |
| void wxFromStringConverter( const wxString &s, wxVariantBase &v ) \
 | |
|     { T d; wxStringReadValue( s, d ); v = wxVariantBase(d); }
 | |
| 
 | |
| 
 | |
| #endif // wxUSE_VARIANT
 | |
| #endif // _WX_VARIANTBASE_H_
 |