atomic ops routed via qt
[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 #ifndef REF_COUNTED_H
31 #define REF_COUNTED_H
32
33 #include "common/common_defs.h"
34 #include "common/ThreadingPolicies.h"
35
36 namespace Common {
37
38 /*! Objects eligible for intrusive refcounting should inherit from
39     this class.
40     RefCntPtr uses interface of this class.
41  */
42 template <class TP = DEFAULT_THREADING<> >
43 class RefCounted {
44 public:
45     /// Decrement reference counter & return new value
46     int32 decRefCnt() const { count_.deref(); return count_; }
47
48     /// Increment reference counter
49     void incRefCnt() const { count_.ref(); }
50
51     /// Return ref counter's value
52     int32 getRefCnt() const { return count_; }
53
54     RefCounted(const RefCounted&) : count_(0) {}
55     RefCounted() : count_(0) {}
56     
57 private:
58     typedef typename TP::AtomicInt AtomicInt;
59     mutable AtomicInt count_;
60 };
61
62 #ifdef _WIN32
63 template class COMMON_EXPIMP RefCounted<>;
64 #endif
65
66 /*! This template should be used when we want to have reference
67  *  counter located _after_ certain base class BT. Disadvantage of this
68  *  feature is that it defeats the non-default constructors of BT.
69  *
70  *  We use separate template (not just another template argument to
71  *  RefCounted) because certain compilers don't do empty base optimization.
72  */
73 template <class BT, class TP = DEFAULT_THREADING<> >
74   class RefCountedBase : public BT, public RefCounted<TP> {};
75
76 } // namespace Common
77
78 #endif // REF_COUNTED_H