7870c1db9a907a6b0a225af05d48e2c6ed89f47e
[serna.git] / sfworks / common / RefCounted.h
1 // 
2 // Copyright(c) 2009 Syntext, Inc. All Rights Reserved.
3 // Contact: info@syntext.com, http://www.syntext.com
4 // 
5 // This file is part of Syntext Serna XML Editor.
6 // 
7 // COMMERCIAL USAGE
8 // Licensees holding valid Syntext Serna commercial licenses may use this file
9 // in accordance with the Syntext Serna Commercial License Agreement provided
10 // with the software, or, alternatively, in accorance with the terms contained
11 // in a written agreement between you and Syntext, Inc.
12 // 
13 // GNU GENERAL PUBLIC LICENSE USAGE
14 // Alternatively, this file may be used under the terms of the GNU General 
15 // Public License versions 2.0 or 3.0 as published by the Free Software 
16 // Foundation and appearing in the file LICENSE.GPL included in the packaging 
17 // of this file. In addition, as a special exception, Syntext, Inc. gives you
18 // certain additional rights, which are described in the Syntext, Inc. GPL 
19 // Exception for Syntext Serna Free Edition, included in the file 
20 // GPL_EXCEPTION.txt in this package.
21 // 
22 // You should have received a copy of appropriate licenses along with this 
23 // package. If not, see <http://www.syntext.com/legal/>. If you are unsure
24 // which license is appropriate for your use, please contact the sales 
25 // department at sales@syntext.com.
26 // 
27 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 // 
30 /*! \file
31     Implementation of RefCounted
32  */
33 #ifndef REF_COUNTED_H
34 #define REF_COUNTED_H
35
36 #include "common/common_defs.h"
37 #include "common/ThreadingPolicies.h"
38
39
40 COMMON_NS_BEGIN
41
42 /*! Objects eligible for intrusive refcounting should inherit from
43     this class.
44     RefCntPtr uses interface of this class.
45  */
46 template <class TP = DEFAULT_THREADING<> >
47 class RefCounted {
48 public:
49     /// Decrement reference counter & return new value
50     int32 decRefCnt() const
51     {
52         return TP::atomicDecrement(count_);
53     }
54
55     /// Increment reference counter
56     void incRefCnt() const
57     {
58         TP::atomicIncrement(count_);
59     }
60
61     /// Return ref counter's value
62     int32 getRefCnt() const
63     {
64         return TP::atomicRead(count_);
65     }
66
67     RefCounted() : count_(0) {}
68     RefCounted(const RefCounted&) : count_(0) {}
69     ~RefCounted() {}
70
71 private:
72     typedef typename TP::VolatileIntType CounterType;
73
74     mutable CounterType count_; ///< The actual reference counter
75 };
76
77 #ifdef _WIN32
78 template class COMMON_EXPIMP RefCounted<>;
79 #endif
80
81 /*! This template should be used when we want to have reference
82  *  counter located _after_ certain base class BT. Disadvantage of this
83  *  feature is that it defeats the non-default constructors of BT.
84  *
85  *  We use separate template (not just another template argument to
86  *  RefCounted) because certain compilers don't do empty base optimization.
87  */
88 template <class BT, class TP = DEFAULT_THREADING<> >
89   class RefCountedBase : public BT, public RefCounted<TP> {};
90
91 COMMON_NS_END
92
93 #endif // REF_COUNTED_H