[250] | 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 |
|
---|