1 class Counted
2 {
3 public:
4
5 ~Counted() {}
6 Counted() : _num_references(0), _instance() {}
7
8 void dismiss () { if (!--_num_references) delete this; }
9 void use () { ++_num_references; }
10
11 operator Data& () { return _instance; }
12 operator Data* () { return &_instance; }
13 Data* operator-> () { return &_instance; }
14
15 template<class Derived>
16 void dyn_cast() const
17 {
18 dynamic_cast<Derived&>(_instance);
19 }
20
21 template<class Derived>
22 void dyn_cast()
23 {
24 dynamic_cast<Derived&>(_instance);
25 }
26
27 private:
28
29 typedef unsigned int uint;
30
31 mutable uint _num_references; // Reference counter.
32 Data _instance;
33
34 Counted(const Counted&); // Not implemented
35
36 public: // New stuff.
37
38 // One argument.
39
40 template<class Arg1>
41 Counted(const Arg1& arg1)
42 : _num_references(0), _instance(arg1) {}
43
44 template<class Arg1>
45 Counted(Arg1& arg1)
46 : _num_references(0), _instance(arg1) {}
47
48 // Two args.
49
50 #define TEMPLATE template<class Arg1, class Arg2>
51 #define CONSTRUCTOR(Arg1, Arg2) \
52 Counted(Arg1& arg1, Arg2& arg2) \
53 : _num_references(0), _instance(arg1, arg2) {}
54
55 TEMPLATE CONSTRUCTOR(const Arg1, const Arg2)
56 TEMPLATE CONSTRUCTOR(const Arg1, Arg2)
57 TEMPLATE CONSTRUCTOR( Arg1, const Arg2)
58 TEMPLATE CONSTRUCTOR( Arg1, Arg2)
59
60 #undef TEMPLATE
61 #undef CONSTRUCTOR
62
63 // Three args require 8 constructors.
64 // Four args require 16 constructors.
65 // Five args require 32 constructors.
66 // Implement when needed.
67 };