diff options
Diffstat (limited to 'ace/Memory/Based_Pointer_T.i')
-rw-r--r-- | ace/Memory/Based_Pointer_T.i | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/ace/Memory/Based_Pointer_T.i b/ace/Memory/Based_Pointer_T.i new file mode 100644 index 00000000000..1d99f9ecaa8 --- /dev/null +++ b/ace/Memory/Based_Pointer_T.i @@ -0,0 +1,136 @@ +/* -*- C++ -*- */ +// $Id$ + +#define ACE_COMPUTE_BASED_POINTER(P) (((char *) (P) - (P)->base_offset_) + (P)->target_) + +template <class CONCRETE> ACE_INLINE CONCRETE * +ACE_Based_Pointer<CONCRETE>::operator->(void) +{ + ACE_TRACE ("ACE_Based_Pointer<CONCRETE>::operator->"); + return (CONCRETE *)(ACE_COMPUTE_BASED_POINTER (this)); +} + +template <class CONCRETE> ACE_INLINE void +ACE_Based_Pointer_Basic<CONCRETE>::operator = (CONCRETE *rhs) +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator ="); + if (rhs == 0) + // Store a value of <target_> that indicate "NULL" pointer. + this->target_ = -1; + else + this->target_ = ((char *) rhs + - ((char *) this - this->base_offset_)); +} + +template <class CONCRETE> ACE_INLINE void +ACE_Based_Pointer<CONCRETE>::operator = (CONCRETE *rhs) +{ + ACE_TRACE ("ACE_Based_Pointer<CONCRETE>::operator ="); + if (rhs == 0) + // Store a value of <target_> that indicate "NULL" pointer. + this->target_ = -1; + else + this->target_ = ((char *) rhs + - ((char *) this - this->base_offset_)); +} + +template <class CONCRETE> ACE_INLINE CONCRETE +ACE_Based_Pointer_Basic<CONCRETE>::operator *(void) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator *"); + return *ACE_reinterpret_cast (CONCRETE *, + ACE_COMPUTE_BASED_POINTER (this)); +} + +template <class CONCRETE> ACE_INLINE CONCRETE * +ACE_Based_Pointer_Basic<CONCRETE>::addr (void) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::addr"); + + if (this->target_ == -1) + return 0; + else + return ACE_reinterpret_cast (CONCRETE *, + ACE_COMPUTE_BASED_POINTER (this)); +} + +template <class CONCRETE> ACE_INLINE +ACE_Based_Pointer_Basic<CONCRETE>::operator CONCRETE *() const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator CONCRETE *()"); + + return this->addr (); +} + +template <class CONCRETE> ACE_INLINE CONCRETE +ACE_Based_Pointer_Basic<CONCRETE>::operator [] (int index) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator []"); + CONCRETE *c = ACE_reinterpret_cast (CONCRETE *, + ACE_COMPUTE_BASED_POINTER (this)); + return c[index]; +} + +template <class CONCRETE> ACE_INLINE void +ACE_Based_Pointer_Basic<CONCRETE>::operator += (int index) +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator +="); + this->base_offset_ += (index * sizeof (CONCRETE)); +} + +template <class CONCRETE> ACE_INLINE int +ACE_Based_Pointer_Basic<CONCRETE>::operator == (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator =="); + return ACE_COMPUTE_BASED_POINTER (this) == ACE_COMPUTE_BASED_POINTER (&rhs); +} + +template <class CONCRETE> ACE_INLINE int +ACE_Based_Pointer_Basic<CONCRETE>::operator != (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator !="); + return !(*this == rhs); +} + +template <class CONCRETE> ACE_INLINE int +ACE_Based_Pointer_Basic<CONCRETE>::operator < (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator <"); + return ACE_COMPUTE_BASED_POINTER (this) < ACE_COMPUTE_BASED_POINTER (&rhs); +} + +template <class CONCRETE> ACE_INLINE int +ACE_Based_Pointer_Basic<CONCRETE>::operator <= (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator <="); + return ACE_COMPUTE_BASED_POINTER (this) <= ACE_COMPUTE_BASED_POINTER (&rhs); +} + +template <class CONCRETE> ACE_INLINE int +ACE_Based_Pointer_Basic<CONCRETE>::operator > (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator >"); + return ACE_COMPUTE_BASED_POINTER (this) > ACE_COMPUTE_BASED_POINTER (&rhs); +} + +template <class CONCRETE> ACE_INLINE int +ACE_Based_Pointer_Basic<CONCRETE>::operator >= (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) const +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator >="); + return ACE_COMPUTE_BASED_POINTER (this) >= ACE_COMPUTE_BASED_POINTER (&rhs); +} + +template <class CONCRETE> ACE_INLINE void +ACE_Based_Pointer_Basic<CONCRETE>::operator= (const ACE_Based_Pointer_Basic<CONCRETE> &rhs) +{ + ACE_TRACE ("ACE_Based_Pointer_Basic<CONCRETE>::operator="); + *this = rhs.addr (); +} + +template <class CONCRETE> ACE_INLINE void +ACE_Based_Pointer<CONCRETE>::operator= (const ACE_Based_Pointer<CONCRETE> &rhs) +{ + ACE_TRACE ("ACE_Based_Pointer<CONCRETE>::operator="); + *this = rhs.addr (); +} + |