Bug #: 3959
[WebKit-https.git] / SVGSupport / kdom / Shared.h
1 /*
2     Copyright (C) 2004 Nikolas Zimmermann <wildfox@kde.org>
3                                   2004 Rob Buis <buis@kde.org>
4
5     This file is part of the KDE project
6
7     This library is free software; you can redistribute it and/or
8     modify it under the terms of the GNU Library General Public
9     License as published by the Free Software Foundation; either
10     version 2 of the License, or (at your option) any later version.
11
12     This library is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15     Library General Public License for more details.
16
17     You should have received a copy of the GNU Library General Public License
18     along with this library; see the file COPYING.LIB.  If not, write to
19     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20     Boston, MA 02111-1307, USA.
21 */
22
23 #ifndef KDOM_Shared_H
24 #define KDOM_Shared_H
25
26 namespace KDOM
27 {
28         // The class expects 'this' to be an ecmafied class which needs
29         // to call ScriptInterpreter::forgetDOMObject on destruction...
30         class Shared
31         {
32         public:
33                 Shared(bool baseClass = false);
34                 virtual ~Shared();
35
36                 void ref();
37                 virtual void deref();
38
39                 int refCount() const;
40
41         protected:
42                 int m_ref;
43                 bool m_baseClass : 1;
44         };
45
46         template<class T>
47         inline void KDOM_SAFE_SET(T *&a, T *b)
48         {
49                 if(a != b)
50                 {
51                         if(a) a->deref();
52                         a = b;
53                         if(a) a->ref();
54                 }
55         }
56
57 #define KDOM_IMPL_DTOR_ASSIGN_OP(T) \
58 T::~T() { if(d) d->deref(); } \
59 T &T::operator=(const T &other) { \
60         KDOM_SAFE_SET(d, other.d); \
61         return *this; \
62 } \
63 bool T::operator==(const T &other) const { \
64         return d == other.d; \
65 } \
66 bool T::operator!=(const T &other) const { \
67         return !operator==(other); \
68 } \
69
70 /**
71  * Add a null object singleton to the class, of the class' type.
72  * This makes for efficient storage and can be used in comparisons
73  * like this: someNode.firstChild() != Node::null; .
74  *
75  * TODO: is there demand for isNull() convenience method? If so, add
76  * here.
77  */
78 #define KDOM_INTERNAL(ClassName) static ClassName null; typedef ClassName##Impl Private;
79
80 /**
81  * Base classes have a handle() convenience method that gives back
82  * the internal impl pointer, in addition to the null object singleton.
83  */
84 #define KDOM_INTERNAL_BASE(ClassName) KDOM_INTERNAL(ClassName) ClassName##Impl *handle() const { return d; }
85
86 };
87
88 #endif
89
90 // vim:ts=4:noet