| 1 |
|
|---|
| 2 | /*
|
|---|
| 3 | *@@sourcefile bs_refptr.h:
|
|---|
| 4 | * template definition for REFPOINTER.b
|
|---|
| 5 | */
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 | /*
|
|---|
| 9 | *@@ REFPOINTER:
|
|---|
| 10 | * generic pointer class template, which allows us to
|
|---|
| 11 | * to store pointers in STL containers and still have
|
|---|
| 12 | * operators work right.
|
|---|
| 13 | *
|
|---|
| 14 | * The problem with pointers and the STL is that the
|
|---|
| 15 | * operators such as "<" are not invoked on the object
|
|---|
| 16 | * directly, but on the pointer, so that sorting etc.
|
|---|
| 17 | * occurs according to pointer values.
|
|---|
| 18 | *
|
|---|
| 19 | * It doesn't really make that much sense to sort items
|
|---|
| 20 | * according to storage addresses in memory... so
|
|---|
| 21 | * instead of storing "real" pointers, you can store
|
|---|
| 22 | * instances of this class template, which supports
|
|---|
| 23 | * the "*", "->", "==", "<" operators.
|
|---|
| 24 | *
|
|---|
| 25 | * Declare your list like this:
|
|---|
| 26 | + list< REFPOINTER<Class> > ClassesList;
|
|---|
| 27 | *
|
|---|
| 28 | * Mind the spaces in "> >", because otherwise the
|
|---|
| 29 | * compiler considers this an ">>" operator. There
|
|---|
| 30 | * are no asterices (*) anywhere.
|
|---|
| 31 | *
|
|---|
| 32 | * Use the "*" or "->" operators on the REFPOINTER
|
|---|
| 33 | * to get the actual class instance.
|
|---|
| 34 | */
|
|---|
| 35 |
|
|---|
| 36 | template <class T>
|
|---|
| 37 | class REFPOINTER
|
|---|
| 38 | {
|
|---|
| 39 | private:
|
|---|
| 40 | T* ptr;
|
|---|
| 41 |
|
|---|
| 42 | public:
|
|---|
| 43 | // default constructor
|
|---|
| 44 | inline REFPOINTER()
|
|---|
| 45 | { ptr = 0; }
|
|---|
| 46 |
|
|---|
| 47 | // destructor
|
|---|
| 48 | inline ~REFPOINTER()
|
|---|
| 49 | { }
|
|---|
| 50 |
|
|---|
| 51 | // constructor from object
|
|---|
| 52 | inline REFPOINTER(T& t)
|
|---|
| 53 | { ptr = &t; }
|
|---|
| 54 |
|
|---|
| 55 | // copy constructor 1
|
|---|
| 56 | inline REFPOINTER(const REFPOINTER<T>& X)
|
|---|
| 57 | { ptr = X.ptr; }
|
|---|
| 58 |
|
|---|
| 59 | // copy constructor 2
|
|---|
| 60 | inline REFPOINTER(const void* p)
|
|---|
| 61 | { ptr = (T*)p; }
|
|---|
| 62 |
|
|---|
| 63 | // dereference
|
|---|
| 64 | inline T& operator*()
|
|---|
| 65 | const
|
|---|
| 66 | { return *ptr; }
|
|---|
| 67 |
|
|---|
| 68 | inline T* operator->()
|
|---|
| 69 | const
|
|---|
| 70 | { return ptr; }
|
|---|
| 71 |
|
|---|
| 72 | // conversion to pointer to class T
|
|---|
| 73 | inline operator T*()
|
|---|
| 74 | { return ptr; }
|
|---|
| 75 |
|
|---|
| 76 | // () operator
|
|---|
| 77 | inline operator bool()
|
|---|
| 78 | const
|
|---|
| 79 | { return ptr != 0; }
|
|---|
| 80 |
|
|---|
| 81 | // ! operator
|
|---|
| 82 | inline bool operator!()
|
|---|
| 83 | const
|
|---|
| 84 | { return ptr == 0; }
|
|---|
| 85 |
|
|---|
| 86 | // comparison
|
|---|
| 87 | inline friend bool operator == (const REFPOINTER<T>& left,
|
|---|
| 88 | const REFPOINTER<T>& right)
|
|---|
| 89 | {
|
|---|
| 90 | return *(left.ptr) == *(right.ptr);
|
|---|
| 91 | }
|
|---|
| 92 |
|
|---|
| 93 | inline friend bool operator < (const REFPOINTER<T>& left,
|
|---|
| 94 | const REFPOINTER<T>& right)
|
|---|
| 95 | {
|
|---|
| 96 | return *(left.ptr) < *(right.ptr);
|
|---|
| 97 | }
|
|---|
| 98 | };
|
|---|
| 99 |
|
|---|
| 100 |
|
|---|