Bug #: 3250
[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  */
72 #define KDOM_INTERNAL(ClassName) static ClassName null; typedef ClassName##Impl Private;
73
74 /**
75  */
76 #define KDOM_INTERNAL_BASE(ClassName) KDOM_INTERNAL(ClassName) ClassName##Impl *handle() const { return d; }
77
78 };
79
80 #endif
81
82 // vim:ts=4:noet