Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4973 right-hear 1
// -*- c++ -*-
2
/*
3
 * Copyright 1999 Karl Nelson 
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Library General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Library General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Library General Public
16
 * License along with this library; if not, write to the Free
17
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
 */
19
#ifndef SIGCXX_SCOPE_H
20
#define SIGCXX_SCOPE_H
21
#include 
22
 
23
#ifdef SIGC_CXX_NAMESPACES
24
namespace SigC
25
{
26
#endif
27
 
28
 
29
struct LIBSIGC_API ScopeNode
30
  {
31
   mutable ScopeNode *prev_;
32
   mutable ScopeNode *next_;
33
 
34
   // removes self from list
35
   void remove_self();
36
 
37
   // Called to inform the item that it is erased
38
   virtual void erase();
39
 
40
   // inform scopes that invalid requested.
41
   virtual void disconnect(bool destroy=0);
42
 
43
   ScopeNode()
44
#ifdef LIBSIGC_WIN32
45
   {prev_=next_=this;}
46
#else
47
   :prev_(this),next_(this) {}
48
#endif
49
 
50
   virtual ~ScopeNode();
51
 
52
   private:
53
     ScopeNode& operator=(const ScopeNode&);
54
     ScopeNode(const ScopeNode&);
55
  };
56
 
57
struct LIBSIGC_API DataNode: public ScopeNode
58
  {
59
   virtual void erase();
60
   virtual ~DataNode();
61
  };
62
 
63
/*******************************************************************
64
***** Basis Scope
65
*******************************************************************/
66
class ObjectScoped;
67
class ObjectReferenced;
68
class Object;
69
class Scope;
70
 
71
class LIBSIGC_API Reference
72
  {
73
   protected:
74
     mutable ObjectReferenced* obj_;
75
     mutable void* cache_;
76
 
77
   public:
78
     void set_sink();
79
 
80
     void init(ObjectReferenced* obj);
81
     void set(ObjectReferenced* obj,void* cache=0,bool ptr=false);
82
 
83
     Reference& operator=(ObjectReferenced *obj) { set(obj); return *this; }
84
     Reference& operator=(ObjectReferenced &obj) { set(&obj); return *this; }
85
     Reference& operator=(const Reference& ref)  { set(ref.obj_); return *this; };
86
 
87
     ObjectReferenced* object() const {return obj_;}
88
     void* cache() const {return cache_;}
89
 
90
     Reference():obj_(0) {}
91
     Reference(ObjectReferenced &obj)
92
       {init(&obj);}
93
     Reference(const Reference& ref)
94
       {init(ref.obj_);}
95
     ~Reference();
96
  };
97
 
98
class LIBSIGC_API Scope:public ScopeNode
99
  {
100
   friend class ObjectScoped;
101
 
102
     Scope& operator=(const Scope& scope);
103
     Scope(const Scope& scope);
104
 
105
   protected:
106
     void set(ObjectScoped* obj,void* cache,bool ptr);
107
     mutable ObjectScoped* obj_;
108
     mutable void* cache_;
109
 
110
     virtual void on_connect()=0;
111
     virtual void erase();
112
 
113
     void register_scope(ObjectScoped *);
114
     void register_scope(const Scope *parent=0);
115
     void unregister_scope();
116
 
117
   public:
118
 
119
     void reference();
120
     void unreference();
121
     void set_sink();
122
 
123
     ObjectScoped* object() const {return (ObjectScoped*)(obj_);}
124
     void* cache() const {return cache_;}
125
 
126
     // Inform object it should invalidate its list.
127
     void invalid();
128
 
129
     Scope():obj_(0),cache_(0) {}
130
     virtual ~Scope();
131
  };
132
 
133
 
134
/******************************************************
135
**** Common Scopes
136
*******************************************************
137
  Available Scopes:
138
    Uncounted  - non-reference
139
    Limit      - Limits the lifetime of object to this scope
140
                 Sinks object.
141
    Extend     - Extends the lifetime of the object to this scope
142
                 Sinks object.
143
    LimitOwned - Conditionally limits the lifetime of object
144
                 Sinks object.
145
    FuncRef    - Extends the lifetime, without sink
146
                 (intended for functions)
147
    Reference  - Extends the lifetime, with sink
148
 
149
    AutoPtr    - Shorthand for auto_ptr like scope.
150
    RefCount   - Shorthand for ref_ptr like scope.
151
 
152
******************************************************/
153
struct Scopes
154
{
155
 
156
class LIBSIGC_API Uncounted:public Scope
157
  {
158
     Uncounted& operator=(const Uncounted&);
159
     Uncounted(const Uncounted&);
160
   public:
161
     virtual void disconnect(bool level=0);
162
     Uncounted():Scope() {}
163
     virtual ~Uncounted();
164
  };
165
 
166
class LIBSIGC_API Extend:public Scope
167
  {
168
  public:
169
     Extend& operator=(const Extend&);
170
     Extend(const Extend&);
171
   protected:
172
     virtual void on_connect();
173
     virtual void erase();
174
   public:
175
     virtual void disconnect(bool level=0);
176
     void set(ObjectScoped* obj,void* cache,bool ptr);
177
     Extend():Scope() {}
178
     virtual ~Extend();
179
  };
180
 
181
class LIBSIGC_API Limit:public Scope
182
  {
183
     Limit& operator=(const Limit&);
184
     Limit(const Limit&);
185
   protected:
186
     virtual void on_connect();
187
     virtual void erase();
188
   public:
189
     virtual void disconnect(bool level=0);
190
     void set(ObjectScoped* obj,void* cache,bool ptr);
191
     Limit():Scope() {}
192
     virtual ~Limit();
193
  };
194
 
195
typedef Extend RefCount;
196
typedef Reference Lock;
197
};
198
 
199
/*************************************************************
200
***** Lists
201
*************************************************************/
202
// Stub for building polylists
203
 
204
 
205
// Iterator skeleton
206
struct LIBSIGC_API ScopeIterator_
207
  {
208
   typedef ScopeNode NodeType;
209
   private:
210
     NodeType *node_;
211
   public:
212
 
213
   inline NodeType* node()             {return node_;}
214
   inline const NodeType* node() const {return node_;}
215
 
216
   inline NodeType& operator*()
217
     {return *node_;
218
     }
219
   inline const NodeType& operator*() const
220
     {return *node_;
221
     }
222
 
223
   inline bool operator==(const ScopeIterator_& i) const
224
     {return node_==i.node_;
225
     }
226
   inline bool operator!=(const ScopeIterator_& i) const
227
     {return node_!=i.node_;
228
     }
229
 
230
   inline ScopeIterator_& operator++()
231
     {
232
      if (node_)
233
        node_=(NodeType*)node_->next_;
234
      return *this;
235
     }
236
 
237
   ScopeIterator_ operator++(int)
238
     {
239
      ScopeIterator_ tmp=*this;
240
      ++*this;
241
      return tmp;
242
     }
243
 
244
   ScopeIterator_& operator= (const ScopeIterator_& i)
245
     {
246
      node_=i.node_;
247
      return *this;
248
     }
249
 
250
   ScopeIterator_(const ScopeIterator_ &n):node_(n.node_) {}
251
   ScopeIterator_(NodeType *n):node_(n) {}
252
   ScopeIterator_():node_(0) {}
253
  };
254
 
255
class LIBSIGC_API ScopeList
256
  {
257
   public:
258
   typedef ScopeNode NodeType;
259
   typedef ScopeIterator_ Iterator;
260
 
261
   ScopeNode node_;
262
 
263
   inline Iterator begin()             {return Iterator(node_.next_);}
264
   inline Iterator end()               {return Iterator(&node_);}
265
 
266
   // insert item directly on list
267
   Iterator insert_direct(Iterator pos,NodeType *n);
268
 
269
   Iterator erase(Iterator pos);
270
   void erase(Iterator start,Iterator stop)
271
     { while (start!=stop) start=erase(start); }
272
   void swap_elements(Iterator p1,Iterator p2);
273
 
274
   void clear()
275
     { erase(begin(),end()); }
276
 
277
   bool empty() const {return node_.next_==&node_;}
278
 
279
   ScopeList():node_() {}
280
   ~ScopeList() { clear(); }
281
 
282
   private:
283
     ScopeList(const ScopeList&);
284
  };
285
 
286
 
287
 
288
#ifdef SIGC_CXX_NAMESPACES
289
} // namespace sigc
290
#endif
291
 
292
#endif