Correct typo in wxRefCounter description.
[wxWidgets.git] / interface / wx / object.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: object.h
3 // Purpose: interface of wxRefCounter
4 // Author: wxWidgets team
5 // RCS-ID: $Id$
6 // Licence: wxWindows license
7 /////////////////////////////////////////////////////////////////////////////
8
9 /** @class wxObjectRefData
10
11 This class is just a typedef to wxRefCounter and is used by wxObject.
12
13 Derive classes from this to store your own data in wxObject derived
14 classes. When retrieving information from a wxObject's reference data,
15 you will need to cast to your own derived class.
16
17 Below is an example illustrating how to store reference counted
18 data in a class derived from wxObject including copy-on-write
19 semantics.
20
21 @section objectrefdata_example Example
22
23 @code
24 // include file
25 // ------------
26
27 class MyCar : public wxObject
28 {
29 public:
30 MyCar() { }
31 MyCar( int price );
32
33 bool IsOk() const { return m_refData != NULL; }
34
35 bool operator == ( const MyCar& car ) const;
36 bool operator != (const MyCar& car) const { return !(*this == car); }
37
38 void SetPrice( int price );
39 int GetPrice() const;
40
41 protected:
42 virtual wxObjectRefData *CreateRefData() const;
43 virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
44
45 DECLARE_DYNAMIC_CLASS(MyCar)
46 };
47
48
49 // implementation
50 // --------------
51
52 // the reference data class is typically a private class only visible in the
53 // implementation source file of the refcounted class.
54 class MyCarRefData : public wxObjectRefData
55 {
56 public:
57 MyCarRefData()
58 {
59 m_price = 0;
60 }
61
62 MyCarRefData( const MyCarRefData& data )
63 : wxObjectRefData()
64 {
65 // copy refcounted data; this is usually a time- and memory-consuming operation
66 // and is only done when two (or more) MyCar instances need to unshare a
67 // common instance of MyCarRefData
68 m_price = data.m_price;
69 }
70
71 bool operator == (const MyCarRefData& data) const
72 {
73 return m_price == data.m_price;
74 }
75
76 private:
77 // in real world, reference counting is usually used only when
78 // the wxObjectRefData-derived class holds data very memory-consuming;
79 // in this example the various MyCar instances may share a MyCarRefData
80 // instance which however only takes 4 bytes for this integer!
81 int m_price;
82 };
83
84
85 #define M_CARDATA ((MyCarRefData *)m_refData)
86 IMPLEMENT_DYNAMIC_CLASS(MyCar,wxObject)
87
88 MyCar::MyCar( int price )
89 {
90 // here we init the MyCar internal data:
91 m_refData = new MyCarRefData();
92 M_CARDATA->m_price = price;
93 }
94
95 wxObjectRefData *MyCar::CreateRefData() const
96 {
97 return new MyCarRefData;
98 }
99
100 wxObjectRefData *MyCar::CloneRefData(const wxObjectRefData *data) const
101 {
102 return new MyCarRefData(*(MyCarRefData *)data);
103 }
104
105 bool MyCar::operator == ( const MyCar& car ) const
106 {
107 if (m_refData == car.m_refData)
108 return true;
109 if (!m_refData || !car.m_refData)
110 return false;
111
112 // here we use the MyCarRefData::operator==() function.
113 // Note however that this comparison may be very slow if the
114 // reference data contains a lot of data to be compared.
115 return ( *(MyCarRefData*)m_refData == *(MyCarRefData*)car.m_refData );
116 }
117
118 void MyCar::SetPrice( int price )
119 {
120 // since this function modifies one of the MyCar internal property,
121 // we need to be sure that the other MyCar instances which share the
122 // same MyCarRefData instance are not affected by this call.
123 // I.e. it's very important to call UnShare() in all setters of
124 // refcounted classes!
125 UnShare();
126
127 M_CARDATA->m_price = price;
128 }
129
130 int MyCar::GetPrice() const
131 {
132 wxCHECK_MSG( IsOk(), -1, "invalid car" );
133
134 return M_CARDATA->m_price;
135 }
136 @endcode
137
138
139 @library{wxbase}
140 @category{rtti}
141
142 @see wxObject, wxObjectDataPtr<T>, @ref overview_refcount
143 */
144 typedef wxRefCounter wxObjectRefData;
145
146
147 /**
148 @class wxRefCounter
149
150 This class is used to manage reference-counting providing a simple
151 interface and a counter. wxRefCounter can be easily used together
152 with wxObjectDataPtr<T> to ensure that no calls to wxRefCounter::DecRef()
153 are missed - thus avoiding memory leaks.
154
155 wxObjectRefData is a typedef to wxRefCounter and is used as the
156 built-in reference counted storage for wxObject-derived classes.
157
158 @library{wxbase}
159 @category{rtti}
160
161 @see wxObject, wxObjectRefData, wxObjectDataPtr<T>, @ref overview_refcount
162 */
163 class wxRefCounter
164 {
165 protected:
166 /**
167 Destructor.
168
169 It's declared @c protected so that wxRefCounter instances
170 will never be destroyed directly but only as result of a DecRef() call.
171 */
172 virtual ~wxRefCounter();
173
174 public:
175 /**
176 Default constructor. Initialises the internal reference count to 1.
177 */
178 wxRefCounter();
179
180 /**
181 Decrements the reference count associated with this shared data and, if
182 it reaches zero, destroys this instance of wxRefCounter releasing its
183 memory.
184
185 Please note that after calling this function, the caller should
186 absolutely avoid to use the pointer to this instance since it may not be
187 valid anymore.
188 */
189 void DecRef();
190
191 /**
192 Returns the reference count associated with this shared data.
193
194 When this goes to zero during a DecRef() call, the object will auto-free itself.
195 */
196 int GetRefCount() const;
197
198 /**
199 Increments the reference count associated with this shared data.
200 */
201 void IncRef();
202 };
203
204
205
206 /**
207 @class wxObject
208
209 This is the root class of many of the wxWidgets classes.
210
211 It declares a virtual destructor which ensures that destructors get called
212 for all derived class objects where necessary.
213
214 wxObject is the hub of a dynamic object creation scheme, enabling a program
215 to create instances of a class only knowing its string class name, and to
216 query the class hierarchy.
217
218 The class contains optional debugging versions of @b new and @b delete, which
219 can help trace memory allocation and deallocation problems.
220
221 wxObject can be used to implement @ref overview_refcount "reference counted"
222 objects, such as wxPen, wxBitmap and others
223 (see @ref overview_refcount_list "this list").
224 See wxRefCounter and @ref overview_refcount for more info about
225 reference counting.
226
227 @library{wxbase}
228 @category{rtti}
229
230 @see wxClassInfo, @ref overview_debugging, @ref overview_refcount,
231 wxObjectDataRef, wxObjectDataPtr<T>
232 */
233 class wxObject
234 {
235 public:
236
237 /**
238 Default ctor; initializes to @NULL the internal reference data.
239 */
240 wxObject();
241
242 /**
243 Copy ctor.
244
245 Sets the internal wxObject::m_refData pointer to point to the same
246 instance of the wxObjectRefData-derived class pointed by @c other and
247 increments the refcount of wxObject::m_refData.
248 */
249 wxObject(const wxObject& other);
250
251 /**
252 Destructor.
253
254 Performs dereferencing, for those objects that use reference counting.
255 */
256 virtual ~wxObject();
257
258 /**
259 This virtual function is redefined for every class that requires run-time
260 type information, when using the ::DECLARE_CLASS macro (or similar).
261 */
262 virtual wxClassInfo* GetClassInfo() const;
263
264 /**
265 Returns the wxObject::m_refData pointer, i.e. the data referenced by this object.
266
267 @see Ref(), UnRef(), wxObject::m_refData, SetRefData(), wxObjectRefData
268 */
269 wxObjectRefData* GetRefData() const;
270
271 /**
272 Determines whether this class is a subclass of (or the same class as)
273 the given class.
274
275 Example:
276
277 @code
278 bool tmp = obj->IsKindOf(CLASSINFO(wxFrame));
279 @endcode
280
281 @param info
282 A pointer to a class information object, which may be obtained
283 by using the ::CLASSINFO macro.
284
285 @return @true if the class represented by info is the same class as this
286 one or is derived from it.
287 */
288 bool IsKindOf(const wxClassInfo* info) const;
289
290 /**
291 Returns @true if this object has the same data pointer as @a obj.
292
293 Notice that @true is returned if the data pointers are @NULL in both objects.
294
295 This function only does a @e shallow comparison, i.e. it doesn't compare
296 the objects pointed to by the data pointers of these objects.
297
298 @see @ref overview_refcount
299 */
300 bool IsSameAs(const wxObject& obj) const;
301
302 /**
303 Makes this object refer to the data in @a clone.
304
305 @param clone
306 The object to 'clone'.
307
308 @remarks First this function calls UnRef() on itself to decrement
309 (and perhaps free) the data it is currently referring to.
310 It then sets its own wxObject::m_refData to point to that of @a clone,
311 and increments the reference count inside the data.
312
313 @see UnRef(), SetRefData(), GetRefData(), wxObjectRefData
314 */
315 void Ref(const wxObject& clone);
316
317 /**
318 Sets the wxObject::m_refData pointer.
319
320 @see Ref(), UnRef(), GetRefData(), wxObjectRefData
321 */
322 void SetRefData(wxObjectRefData* data);
323
324 /**
325 Decrements the reference count in the associated data, and if it is zero,
326 deletes the data.
327
328 The wxObject::m_refData member is set to @NULL.
329
330 @see Ref(), SetRefData(), GetRefData(), wxObjectRefData
331 */
332 void UnRef();
333
334 /**
335 This is the same of AllocExclusive() but this method is public.
336 */
337 void UnShare();
338
339 /**
340 The @e delete operator is defined for debugging versions of the library only,
341 when the identifier @c __WXDEBUG__ is defined.
342
343 It takes over memory deallocation, allowing wxDebugContext operations.
344 */
345 void operator delete(void *buf);
346
347 /**
348 The @e new operator is defined for debugging versions of the library only, when
349 the identifier @c __WXDEBUG__ is defined.
350
351 It takes over memory allocation, allowing wxDebugContext operations.
352 */
353 void* operator new(size_t size, const wxString& filename = NULL, int lineNum = 0);
354
355 protected:
356 /**
357 Ensure that this object's data is not shared with any other object.
358
359 If we have no data, it is created using CreateRefData();
360 if we have shared data (i.e. data with a reference count greater than 1),
361 it is copied using CloneRefData(); otherwise nothing is done (the data
362 is already present and is not shared by other object instances).
363
364 If you use this function you should make sure that you override the
365 CreateRefData() and CloneRefData() functions in your class otherwise
366 an assertion will fail at runtime.
367 */
368 void AllocExclusive();
369
370 /**
371 Creates a new instance of the wxObjectRefData-derived class specific to
372 this object and returns it.
373
374 This is usually implemented as a one-line call:
375 @code
376 wxObjectRefData *MyObject::CreateRefData() const
377 {
378 return new MyObjectRefData;
379 }
380 @endcode
381 */
382 virtual wxObjectRefData *CreateRefData() const;
383
384 /**
385 Creates a new instance of the wxObjectRefData-derived class specific to
386 this object and initializes it copying @a data.
387
388 This is usually implemented as a one-line call:
389 @code
390 wxObjectRefData *MyObject::CloneRefData(const wxObjectRefData *data) const
391 {
392 // rely on the MyObjectRefData copy ctor:
393 return new MyObjectRefData(*(MyObjectRefData *)data);
394 }
395 @endcode
396 */
397 virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
398
399 /**
400 Pointer to an object which is the object's reference-counted data.
401
402 @see Ref(), UnRef(), SetRefData(), GetRefData(), wxObjectRefData
403 */
404 wxObjectRefData* m_refData;
405 };
406
407
408
409 /**
410 @class wxClassInfo
411
412 This class stores meta-information about classes.
413
414 Instances of this class are not generally defined directly by an application,
415 but indirectly through use of macros such as ::DECLARE_DYNAMIC_CLASS and
416 ::IMPLEMENT_DYNAMIC_CLASS.
417
418 @library{wxbase}
419 @category{rtti}
420
421 @see @ref overview_rtti_classinfo, wxObject
422 */
423 class wxClassInfo
424 {
425 public:
426 /**
427 Constructs a wxClassInfo object.
428
429 The supplied macros implicitly construct objects of this class, so there is no
430 need to create such objects explicitly in an application.
431 */
432 wxClassInfo(const wxChar* className,
433 const wxClassInfo* baseClass1,
434 const wxClassInfo* baseClass2,
435 int size, wxObjectConstructorFn fn);
436
437 /**
438 Creates an object of the appropriate kind.
439
440 @return @NULL if the class has not been declared dynamically creatable
441 (typically, this happens for abstract classes).
442 */
443 wxObject* CreateObject() const;
444
445 /**
446 Finds the wxClassInfo object for a class with the given @a name.
447 */
448 static wxClassInfo* FindClass(const wxString& className);
449
450 /**
451 Returns the name of the first base class (@NULL if none).
452 */
453 const wxChar* GetBaseClassName1() const;
454
455 /**
456 Returns the name of the second base class (@NULL if none).
457 */
458 const wxChar* GetBaseClassName2() const;
459
460 /**
461 Returns the string form of the class name.
462 */
463 const wxChar* GetClassName() const;
464
465 /**
466 Returns the size of the class.
467 */
468 int GetSize() const;
469
470 /**
471 Returns @true if this class info can create objects of the associated class.
472 */
473 bool IsDynamic() const;
474
475 /**
476 Returns @true if this class is a kind of (inherits from) the given class.
477 */
478 bool IsKindOf(const wxClassInfo* info) const;
479 };
480
481
482
483 /**
484
485 This is an helper template class primarily written to avoid memory leaks because
486 of missing calls to wxRefCounter::DecRef() and wxObjectRefData::DecRef().
487
488 Despite the name this template can actually be used as a smart pointer for any
489 class implementing the reference counting interface which only consists of the two
490 methods @b T::IncRef() and @b T::DecRef().
491
492 The difference to wxSharedPtr<T> is that wxObjectDataPtr<T> relies on the reference
493 counting to be in the class pointed to, where instead wxSharedPtr<T> implements the
494 reference counting itself.
495
496 Below is an example illustrating how to implement reference counted
497 data using wxRefCounter and wxObjectDataPtr<T> with copy-on-write
498 semantics.
499
500 @section objectdataptr_example Example
501
502 @code
503 class MyCarRefData: public wxRefCounter
504 {
505 public:
506 MyCarRefData( int price = 0 ) : m_price(price) { }
507 MyCarRefData( const MyCarRefData& data ) : m_price(data.m_price) { }
508
509 void SetPrice( int price ) { m_price = price; }
510 int GetPrice() const { return m_price; }
511
512 protected:
513 int m_price;
514 };
515
516 class MyCar
517 {
518 public:
519 // initializes this MyCar assigning to the
520 // internal data pointer a new instance of MyCarRefData
521 MyCar( int price = 0 ) : m_data( new MyCarRefData(price) )
522 {
523 }
524
525 MyCar& operator =( const MyCar& tocopy )
526 {
527 // shallow copy: this is just a fast copy of pointers; the real
528 // memory-consuming data which typically is stored inside
529 // MyCarRefData is not copied here!
530 m_data = tocopy.m_data;
531 return *this;
532 }
533
534 bool operator == ( const MyCar& other ) const
535 {
536 if (m_data.get() == other.m_data.get())
537 return true; // this instance and the 'other' one share the
538 // same MyCarRefData data...
539
540 return (m_data.GetPrice() == other.m_data.GetPrice());
541 }
542
543 void SetPrice( int price )
544 {
545 // make sure changes to this class do not affect other instances
546 // currently sharing our same refcounted data:
547 UnShare();
548
549 m_data->SetPrice( price );
550 }
551
552 int GetPrice() const
553 {
554 return m_data->GetPrice();
555 }
556
557 wxObjectDataPtr<MyCarRefData> m_data;
558
559 protected:
560 void UnShare()
561 {
562 if (m_data->GetRefCount() == 1)
563 return;
564
565 m_data.reset( new MyCarRefData( *m_data ) );
566 }
567 };
568 @endcode
569
570
571 @library{wxbase}
572 @category{rtti,smartpointers}
573
574 @see wxObject, wxObjectRefData, @ref overview_refcount, wxSharedPtr<T>,
575 wxScopedPtr<T>, wxWeakRef<T>
576 */
577 template <class T>
578 class wxObjectDataPtr<T>
579 {
580 public:
581 /**
582 Constructor.
583
584 @a ptr is a pointer to the reference counted object to which this class points.
585 If @a ptr is not NULL @b T::IncRef() will be called on the object.
586 */
587 wxObjectDataPtr<T>(T* ptr = NULL);
588
589 /**
590 This copy constructor increases the count of the reference counted object to
591 which @a tocopy points and then this class will point to, as well.
592 */
593 wxObjectDataPtr<T>(const wxObjectDataPtr<T>& tocopy);
594
595
596 /**
597 Decreases the reference count of the object to which this class points.
598 */
599 ~wxObjectDataPtr<T>();
600
601 /**
602 Gets a pointer to the reference counted object to which this class points.
603 */
604 T* get() const;
605
606 /**
607 Reset this class to ptr which points to a reference counted object and
608 calls T::DecRef() on the previously owned object.
609 */
610 void reset(T *ptr);
611
612 /**
613 Conversion to a boolean expression (in a variant which is not
614 convertable to anything but a boolean expression).
615
616 If this class contains a valid pointer it will return @true, if it contains
617 a @NULL pointer it will return @false.
618 */
619 operator unspecified_bool_type() const;
620
621 /**
622 Returns a reference to the object.
623
624 If the internal pointer is @NULL this method will cause an assert in debug mode.
625 */
626 T& operator*() const;
627
628 /**
629 Returns a pointer to the reference counted object to which this class points.
630
631 If this the internal pointer is @NULL, this method will assert in debug mode.
632 */
633 T* operator->() const;
634
635 //@{
636 /**
637 Assignment operator.
638 */
639 wxObjectDataPtr<T>& operator=(const wxObjectDataPtr<T>& tocopy);
640 wxObjectDataPtr<T>& operator=(T* ptr);
641 //@}
642 };
643
644
645
646 // ============================================================================
647 // Global functions/macros
648 // ============================================================================
649
650 /** @addtogroup group_funcmacro_rtti */
651 //@{
652
653 /**
654 Returns a pointer to the wxClassInfo object associated with this class.
655
656 @header{wx/object.h}
657 */
658 #define CLASSINFO( className )
659
660 /**
661 Used inside a class declaration to declare that the class should be made
662 known to the class hierarchy, but objects of this class cannot be created
663 dynamically. The same as DECLARE_ABSTRACT_CLASS().
664
665 @header{wx/object.h}
666 */
667 #define DECLARE_CLASS( className )
668
669 /**
670 Used inside a class declaration to declare that the class should be
671 made known to the class hierarchy, but objects of this class cannot be created
672 dynamically. The same as DECLARE_CLASS().
673
674 @header{wx/object.h}
675
676 Example:
677
678 @code
679 class wxCommand: public wxObject
680 {
681 DECLARE_ABSTRACT_CLASS(wxCommand)
682
683 private:
684 ...
685 public:
686 ...
687 };
688 @endcode
689 */
690 #define DECLARE_ABSTRACT_CLASS( className )
691
692 /**
693 Used inside a class declaration to make the class known to wxWidgets RTTI
694 system and also declare that the objects of this class should be
695 dynamically creatable from run-time type information. Notice that this
696 implies that the class should have a default constructor, if this is not
697 the case consider using DECLARE_CLASS().
698
699 @header{wx/object.h}
700
701 Example:
702
703 @code
704 class wxFrame: public wxWindow
705 {
706 DECLARE_DYNAMIC_CLASS(wxFrame)
707
708 private:
709 const wxString& frameTitle;
710 public:
711 ...
712 };
713 @endcode
714 */
715 #define DECLARE_DYNAMIC_CLASS( className )
716
717 /**
718 Used in a C++ implementation file to complete the declaration of a class
719 that has run-time type information. The same as IMPLEMENT_ABSTRACT_CLASS().
720
721 @header{wx/object.h}
722 */
723 #define IMPLEMENT_CLASS( className, baseClassName )
724
725 /**
726 Used in a C++ implementation file to complete the declaration of a class
727 that has run-time type information and two base classes. The same as
728 IMPLEMENT_ABSTRACT_CLASS2().
729
730 @header{wx/object.h}
731 */
732 #define IMPLEMENT_CLASS2( className, baseClassName1, baseClassName2 )
733
734 /**
735 Used in a C++ implementation file to complete the declaration of a class
736 that has run-time type information. The same as IMPLEMENT_CLASS().
737
738 @header{wx/object.h}
739
740 Example:
741
742 @code
743 IMPLEMENT_ABSTRACT_CLASS(wxCommand, wxObject)
744
745 wxCommand::wxCommand(void)
746 {
747 ...
748 }
749 @endcode
750 */
751 #define IMPLEMENT_ABSTRACT_CLASS( className, baseClassName )
752
753 /**
754 Used in a C++ implementation file to complete the declaration of a class
755 that has run-time type information and two base classes. The same as
756 IMPLEMENT_CLASS2().
757
758 @header{wx/object.h}
759 */
760 #define IMPLEMENT_ABSTRACT_CLASS2( className, baseClassName1, baseClassName2 )
761
762 /**
763 Used in a C++ implementation file to complete the declaration of a class
764 that has run-time type information, and whose instances can be created
765 dynamically.
766
767 @header{wx/object.h}
768
769 Example:
770
771 @code
772 IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
773
774 wxFrame::wxFrame(void)
775 {
776 ...
777 }
778 @endcode
779 */
780 #define IMPLEMENT_DYNAMIC_CLASS( className, baseClassName )
781
782 /**
783 Used in a C++ implementation file to complete the declaration of a class
784 that has run-time type information, and whose instances can be created
785 dynamically. Use this for classes derived from two base classes.
786
787 @header{wx/object.h}
788 */
789 #define IMPLEMENT_DYNAMIC_CLASS2( className, baseClassName1, baseClassName2 )
790
791 /**
792 Same as @c const_cast<T>(x) if the compiler supports const cast or @c (T)x for
793 old compilers. Unlike wxConstCast(), the cast it to the type @c T and not to
794 <tt>T *</tt> and also the order of arguments is the same as for the standard cast.
795
796 @header{wx/defs.h}
797
798 @see wx_reinterpret_cast(), wx_static_cast()
799 */
800 #define wx_const_cast(T, x)
801
802 /**
803 Same as @c reinterpret_cast<T>(x) if the compiler supports reinterpret cast or
804 @c (T)x for old compilers.
805
806 @header{wx/defs.h}
807
808 @see wx_const_cast(), wx_static_cast()
809 */
810 #define wx_reinterpret_cast(T, x)
811
812 /**
813 Same as @c static_cast<T>(x) if the compiler supports static cast or @c (T)x for
814 old compilers. Unlike wxStaticCast(), there are no checks being done and
815 the meaning of the macro arguments is exactly the same as for the standard
816 static cast, i.e. @a T is the full type name and star is not appended to it.
817
818 @header{wx/defs.h}
819
820 @see wx_const_cast(), wx_reinterpret_cast(), wx_truncate_cast()
821 */
822 #define wx_static_cast(T, x)
823
824 /**
825 This case doesn’t correspond to any standard cast but exists solely to make
826 casts which possibly result in a truncation of an integer value more
827 readable.
828
829 @header{wx/defs.h}
830 */
831 #define wx_truncate_cast(T, x)
832
833 /**
834 This macro expands into <tt>const_cast<classname *>(ptr)</tt> if the compiler
835 supports const_cast or into an old, C-style cast, otherwise.
836
837 @header{wx/defs.h}
838
839 @see wx_const_cast(), wxDynamicCast(), wxStaticCast()
840 */
841 #define wxConstCast( ptr, classname )
842
843 /**
844 This macro returns the pointer @e ptr cast to the type @e classname * if
845 the pointer is of this type (the check is done during the run-time) or
846 @NULL otherwise. Usage of this macro is preferred over obsoleted
847 wxObject::IsKindOf() function.
848
849 The @e ptr argument may be @NULL, in which case @NULL will be returned.
850
851 @header{wx/object.h}
852
853 Example:
854
855 @code
856 wxWindow *win = wxWindow::FindFocus();
857 wxTextCtrl *text = wxDynamicCast(win, wxTextCtrl);
858 if ( text )
859 {
860 // a text control has the focus...
861 }
862 else
863 {
864 // no window has the focus or it is not a text control
865 }
866 @endcode
867
868 @see @ref overview_rtti, wxDynamicCastThis(), wxConstCast(), wxStaticCast()
869 */
870 #define wxDynamicCast( ptr, classname )
871
872 /**
873 This macro is equivalent to <tt>wxDynamicCast(this, classname)</tt> but the latter provokes
874 spurious compilation warnings from some compilers (because it tests whether
875 @c this pointer is non-@NULL which is always true), so this macro should be
876 used to avoid them.
877
878 @header{wx/object.h}
879
880 @see wxDynamicCast()
881 */
882 #define wxDynamicCastThis( classname )
883
884 /**
885 This macro checks that the cast is valid in debug mode (an assert failure
886 will result if wxDynamicCast(ptr, classname) == @NULL) and then returns the
887 result of executing an equivalent of <tt>static_cast<classname *>(ptr)</tt>.
888
889 @header{wx/object.h}
890
891 @see wx_static_cast(), wxDynamicCast(), wxConstCast()
892 */
893 #define wxStaticCast( ptr, classname )
894
895 /**
896 Creates and returns an object of the given class, if the class has been
897 registered with the dynamic class system using DECLARE... and IMPLEMENT...
898 macros.
899
900 @header{wx/object.h}
901 */
902 wxObject *wxCreateDynamicObject(const wxString& className);
903
904 //@}
905
906 /** @addtogroup group_funcmacro_debug */
907 //@{
908
909 /**
910 This is defined in debug mode to be call the redefined new operator
911 with filename and line number arguments. The definition is:
912
913 @code
914 #define WXDEBUG_NEW new(__FILE__,__LINE__)
915 @endcode
916
917 In non-debug mode, this is defined as the normal new operator.
918
919 @header{wx/object.h}
920 */
921 #define WXDEBUG_NEW( arg )
922
923 //@}
924