Mercurial > ~dholland > hg > ag > index.cgi
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 */ |