// -*- C++ -*- // // $Id$ #if defined (ACE_HAS_BUILTIN_ATOMIC_OP) ACE_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op (void) : value_ (0) { } ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op (const long &c) : value_ (c) { } ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op ( const ACE_Atomic_Op &rhs) : value_ (rhs.value_) { } ACE_INLINE long ACE_Atomic_Op::operator++ (void) { #if defined (WIN32) return ::InterlockedIncrement (const_cast (&this->value_)); #else /* WIN32 */ return (*increment_fn_) (&this->value_); #endif /* WIN32 */ } ACE_INLINE long ACE_Atomic_Op::operator++ (int) { return ++*this - 1; } ACE_INLINE long ACE_Atomic_Op::operator-- (void) { #if defined (WIN32) return ::InterlockedDecrement (const_cast (&this->value_)); #else /* WIN32 */ return (*decrement_fn_) (&this->value_); #endif /* WIN32 */ } ACE_INLINE long ACE_Atomic_Op::operator-- (int) { return --*this + 1; } ACE_INLINE long ACE_Atomic_Op::operator+= (long rhs) { #if defined (WIN32) && defined (ACE_HAS_INTERLOCKED_EXCHANGEADD) return ::InterlockedExchangeAdd (const_cast (&this->value_), rhs) + rhs; #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return (*exchange_add_fn_) (&this->value_, rhs) + rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ } ACE_INLINE long ACE_Atomic_Op::operator-= (long rhs) { #if defined (WIN32) && defined (ACE_HAS_INTERLOCKED_EXCHANGEADD) return ::InterlockedExchangeAdd (const_cast (&this->value_), -rhs) - rhs; #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return (*exchange_add_fn_) (&this->value_, -rhs) - rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ } ACE_INLINE bool ACE_Atomic_Op::operator== (long rhs) const { return (this->value_ == rhs); } ACE_INLINE bool ACE_Atomic_Op::operator!= (long rhs) const { return (this->value_ != rhs); } ACE_INLINE bool ACE_Atomic_Op::operator>= (long rhs) const { return (this->value_ >= rhs); } ACE_INLINE bool ACE_Atomic_Op::operator> (long rhs) const { return (this->value_ > rhs); } ACE_INLINE bool ACE_Atomic_Op::operator<= (long rhs) const { return (this->value_ <= rhs); } ACE_INLINE bool ACE_Atomic_Op::operator< (long rhs) const { return (this->value_ < rhs); } ACE_INLINE ACE_Atomic_Op & ACE_Atomic_Op::operator= (long rhs) { #if defined (WIN32) ::InterlockedExchange (const_cast (&this->value_), rhs); #else /* WIN32 */ (*exchange_fn_) (&this->value_, rhs); #endif /* WIN32 */ return *this; } ACE_INLINE ACE_Atomic_Op & ACE_Atomic_Op::operator= ( const ACE_Atomic_Op &rhs) { #if defined (WIN32) ::InterlockedExchange (const_cast (&this->value_), rhs.value_); #else /* WIN32 */ (*exchange_fn_) (&this->value_, rhs.value_); #endif /* WIN32 */ return *this; } ACE_INLINE long ACE_Atomic_Op::value (void) const { return this->value_; } ACE_INLINE volatile long & ACE_Atomic_Op::value_i (void) { return this->value_; } ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op (void) : value_ (0) { } ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op (const unsigned long &c) : value_ (c) { } ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op ( const ACE_Atomic_Op &rhs) : value_ (rhs.value_) { } ACE_INLINE unsigned long ACE_Atomic_Op::operator++ (void) { #if defined (WIN32) return static_cast (::InterlockedIncrement (const_cast (reinterpret_cast(&this->value_)))); #else /* WIN32 */ return static_cast ((*increment_fn_) (reinterpret_cast (&this->value_))); #endif /* WIN32 */ } ACE_INLINE unsigned long ACE_Atomic_Op::operator++ (int) { return ++*this - 1; } ACE_INLINE unsigned long ACE_Atomic_Op::operator-- (void) { #if defined (WIN32) return static_cast (::InterlockedDecrement (const_cast (reinterpret_cast(&this->value_)))); #else /* WIN32 */ return static_cast ((*decrement_fn_) (reinterpret_cast (&this->value_))); #endif /* WIN32 */ } ACE_INLINE unsigned long ACE_Atomic_Op::operator-- (int) { return --*this + 1; } ACE_INLINE unsigned long ACE_Atomic_Op::operator+= (unsigned long rhs) { #if defined (WIN32) && defined (ACE_HAS_INTERLOCKED_EXCHANGEADD) return static_cast (::InterlockedExchangeAdd (const_cast (reinterpret_cast (&this->value_)), rhs)) + rhs; #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return static_cast ((*exchange_add_fn_) (reinterpret_cast (&this->value_), rhs)) + rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ } ACE_INLINE unsigned long ACE_Atomic_Op::operator-= (unsigned long rhs) { #if defined (WIN32) && defined (ACE_HAS_INTERLOCKED_EXCHANGEADD) return static_cast (::InterlockedExchangeAdd (const_cast (reinterpret_cast(&this->value_)), -static_cast(rhs))) - rhs; #else /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ return static_cast ((*exchange_add_fn_) (reinterpret_cast (&this->value_), -rhs)) - rhs; #endif /* WIN32 && ACE_HAS_INTERLOCKED_EXCHANGEADD */ } ACE_INLINE bool ACE_Atomic_Op::operator== (unsigned long rhs) const { return (this->value_ == rhs); } ACE_INLINE bool ACE_Atomic_Op::operator!= (unsigned long rhs) const { return (this->value_ != rhs); } ACE_INLINE bool ACE_Atomic_Op::operator>= (unsigned long rhs) const { return (this->value_ >= rhs); } ACE_INLINE bool ACE_Atomic_Op::operator> (unsigned long rhs) const { return (this->value_ > rhs); } ACE_INLINE bool ACE_Atomic_Op::operator<= (unsigned long rhs) const { return (this->value_ <= rhs); } ACE_INLINE bool ACE_Atomic_Op::operator< (unsigned long rhs) const { return (this->value_ < rhs); } ACE_INLINE ACE_Atomic_Op & ACE_Atomic_Op::operator= (unsigned long rhs) { #if defined (WIN32) ::InterlockedExchange (const_cast (reinterpret_cast (&this->value_)), rhs); #else /* WIN32 */ (*exchange_fn_) (reinterpret_cast (&this->value_), rhs); #endif /* WIN32 */ return *this; } ACE_INLINE ACE_Atomic_Op & ACE_Atomic_Op::operator= ( const ACE_Atomic_Op &rhs) { #if defined (WIN32) ::InterlockedExchange (const_cast (reinterpret_cast (&this->value_)), rhs.value_); #else /* WIN32 */ (*exchange_fn_) (reinterpret_cast (&this->value_), rhs.value_); #endif /* WIN32 */ return *this; } ACE_INLINE unsigned long ACE_Atomic_Op::value (void) const { return this->value_; } ACE_INLINE volatile unsigned long & ACE_Atomic_Op::value_i (void) { return this->value_; } ACE_END_VERSIONED_NAMESPACE_DECL #endif /* ACE_HAS_BUILTIN_ATOMIC_OP */