Hey,
ik ben een eigen pointer class aan het maken, die circulair gedrag vertoont tussen twee bounds.
So far, so good, maar nu wil ik deze pointers ook, net als bij normale pointers, kunnen casten.
Specifiek, wil ik de volgende casts mogelijk maken:
Cast syntax heb ik nog niet zo over na gedacht; liefst maak ik gewoon (TYPE)EXPR mogelijk, maar als er iets anders nodig is vind ik dat niet zo'n probleem.
Zover ben ik ook nog helemaal niet, want casten wil vooralsnog überhaupt niet lukken. Mijn "cast" pogingen lopen tot dusverre steevast uit op constructies van een nieuw object, waarbij wijzigingen niet worden gereflecteerd in de originele gecaste variable. Voorbeeld:
Ik weet niet zo goed hoe ik hier nu mee verder moet. Ik heb al zitten denken aan een tweede class, identiek aan de eerste, maar met alle members als references. Deze class zou ik dan kunnen gebruiken bij het casten, maar dan moet ik weer een manier verzinnen om deze twee classes aan elkaar te praten, wat ook nog niet echt wil lukken.
Het gaat nu dus al mis als ik tussen T * en circ_ptr<T> wil casten, en het wordt alleen nog maar erger als ik het tussen T1 * en circ_ptr<T2> of circ_ptr<T1> en circ_ptr<T2> ga proberen.
Heeft iemand een goed idee om hiermee om te gaan?
ik ben een eigen pointer class aan het maken, die circulair gedrag vertoont tussen twee bounds.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| template<class T> class circ_pointer { private: T * m_ptr; /* the actual pointer */ int8_t * m_base; /* the lowerbound of the circular memory region */ size_t m_size; /* size of the circular memory region in bytes */ public: /* constructors */ circ_pointer(T * p = NULL) : m_ptr(p), m_base(NULL), m_size(0) {} /* size in number of elements */ circ_pointer(T * p, size_t size) : m_ptr(p), m_base((int8_t *)p), m_size(sizeof(T) * size) {} /* modifiers */ circ_pointer<T> & operator += (ptrdiff_t); circ_pointer<T> & operator -= (ptrdiff_t); circ_pointer<T> operator ++ (ptrdiff_t); circ_pointer<T> operator -- (ptrdiff_t); circ_pointer<T> operator + (ptrdiff_t incr) const { return circ_pointer<T>(*this) += incr; } circ_pointer<T> operator - (ptrdiff_t decr) const { return circ_pointer<T>(*this) -= decr; } circ_pointer<T> & operator ++ () { return *this += 1; } circ_pointer<T> & operator -- () { return *this -= 1; } const T & operator [] (ptrdiff_t index) const { return *(*this + index); } T & operator [] (ptrdiff_t index) { return *(*this + index); } T & operator * () const { return *m_ptr; } } /* hieronder nog wat implementaties... */ |
So far, so good, maar nu wil ik deze pointers ook, net als bij normale pointers, kunnen casten.
Specifiek, wil ik de volgende casts mogelijk maken:
code:
1
2
| circ_ptr<T1> <=> circ_ptr<T2> circ_ptr<T1> <=> T2 * |
Cast syntax heb ik nog niet zo over na gedacht; liefst maak ik gewoon (TYPE)EXPR mogelijk, maar als er iets anders nodig is vind ik dat niet zo'n probleem.
Zover ben ik ook nog helemaal niet, want casten wil vooralsnog überhaupt niet lukken. Mijn "cast" pogingen lopen tot dusverre steevast uit op constructies van een nieuw object, waarbij wijzigingen niet worden gereflecteerd in de originele gecaste variable. Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| int array[10] = {0,1,2,3,4,5,6,7,8,9};
int * a = array;
/* a wijst naar 0 */
a++;
/* a wijst naar 1 */
((long *)a)++;
/* a wijst naar 2 (op mijn architectuur) */
((long long *)a)++;
/* a wijst naar 4 (op mijn architectuur) */
/* echter */
a = array;
/* a wijst naar 0 */
((circ_ptr<int>)a)++
/* a wijst naar 0, cast heeft dus een nieuw object gecreerd, en */
/* wijzigingen gaan verloren... */ |
Ik weet niet zo goed hoe ik hier nu mee verder moet. Ik heb al zitten denken aan een tweede class, identiek aan de eerste, maar met alle members als references. Deze class zou ik dan kunnen gebruiken bij het casten, maar dan moet ik weer een manier verzinnen om deze twee classes aan elkaar te praten, wat ook nog niet echt wil lukken.
Het gaat nu dus al mis als ik tussen T * en circ_ptr<T> wil casten, en het wordt alleen nog maar erger als ik het tussen T1 * en circ_ptr<T2> of circ_ptr<T1> en circ_ptr<T2> ga proberen.
Heeft iemand een goed idee om hiermee om te gaan?
[ Voor 10% gewijzigd door RickN op 01-07-2004 14:19 ]
He who knows only his own side of the case knows little of that.