diff options
Diffstat (limited to 'ACE/ace/Based_Pointer_T.inl')
-rw-r--r-- | ACE/ace/Based_Pointer_T.inl | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/ACE/ace/Based_Pointer_T.inl b/ACE/ace/Based_Pointer_T.inl new file mode 100644 index 00000000000..4d6b86e0c41 --- /dev/null +++ b/ACE/ace/Based_Pointer_T.inl @@ -0,0 +1,139 @@ +// -*- C++ -*- +// +// $Id$ + +#define ACE_COMPUTE_BASED_POINTER(P) (((char *) (P) - (P)->base_offset_) + (P)->target_) +#include "ace/Global_Macros.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +template <class CONCRETE> ACE_INLINE CONCRETE * +ACE_Based_Pointer<CONCRETE>::operator->(void) +{ + ACE_TRACE ("ACE_Based_Pointer<CONCRETE>::operator->"); + return reinterpret_cast<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 *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 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 = + 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 bool +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 bool +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 bool +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 bool +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 bool +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 bool +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 (); +} + +ACE_END_VERSIONED_NAMESPACE_DECL |