comparison anagram/support/agref.h @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:13d2b8934445
1 /**********************************************************
2
3 The AnaGram Class Library
4
5 The AgReference Class
6 Copyright 1997 Parsifal Software. All Rights Reserved.
7 See the file COPYING for license and usage terms.
8
9 ***********************************************************/
10
11
12 #ifndef AGREF_H
13 #define AGREF_H
14
15 #include "assert.h"
16
17
18 class AgReferenceCount {
19 private:
20 int count;
21 public:
22 AgReferenceCount()
23 : count(0)
24 {}
25 virtual ~AgReferenceCount() {
26 assert(count == 0);
27 }
28 inline AgReferenceCount(const AgReferenceCount &) : count(0) {}
29 inline AgReferenceCount &operator = (const AgReferenceCount &) {
30 return *this;
31 }
32 inline void lock() {
33 count++;
34 }
35 inline int unlock() {
36 /*
37 if (count <= 0) {
38 LOGSECTION("AgReferenceCount::unlock");
39 LOGV(count);
40 }
41 */
42 assert(count > 0);
43 return (--count <= 0);
44 }
45 };
46
47 class AgReferenceBase {
48 protected:
49 AgReferenceCount *object;
50 void doAssignmentLocks(const AgReferenceBase &r); /* {
51 if (object!=0 && object->unlock()) delete object;
52 object = r.object;
53 if (object != 0) object->lock();
54 }
55 */
56 public:
57 AgReferenceBase();// : object(0) {}
58 AgReferenceBase(AgReferenceCount* object_);
59 AgReferenceBase(const AgReferenceBase &r);
60 virtual ~AgReferenceBase();
61 int exists() const;
62 void discardData();
63 /*
64 AgReferenceBase(AgReferenceCount* object_)
65 : object(object_)
66 {
67 if (object != 0) object->lock();
68 }
69 AgReferenceBase(const AgReferenceBase &r)
70 : object(r.object)
71 {
72 if (object!= 0) object->lock();
73 }
74 virtual ~AgReferenceBase() {
75 if (object!= 0 && object->unlock()) delete object;
76 }
77
78 int exists() const {
79 return object != 0;
80 }
81 void discardData() {
82 if (object && object->unlock()) delete object;
83 object = 0;
84 }
85 */
86 };
87 /*
88 template <class T>
89 class AgReference : public AgReferenceBase {
90 public:
91 inline AgReference() : AgReferenceBase() {}
92 inline AgReference(T *x) : AgReferenceBase(x) {}
93 inline AgReference(const AgReference<T> &r)
94 : AgReferenceBase((const AgReferenceBase &)r)
95 {}
96 inline AgReference<T> &operator = (const AgReference<T> &t) {
97 doAssignmentLocks(t);
98 return *this;
99 }
100 inline T *operator -> () const {
101 return (T *) object;
102 }
103 inline T *pointer() const {
104 return (T *) object;
105 }
106 };
107 */
108
109
110 #endif /* AGREF_H */