3 // $Id: Atomic_Op_T.inl 80826 2008-03-04 14:51:23Z wotte $
5 #include "ace/Guard_T.h"
9 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
12 // ACE_Atomic_Op_Ex inline functions
15 template <class ACE_LOCK, class TYPE>
17 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator++ (void)
19 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator++");
20 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
21 return ++this->value_;
24 template <class ACE_LOCK, class TYPE>
26 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator+= (
27 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs)
29 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator+=");
30 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
31 return this->value_ += rhs;
34 template <class ACE_LOCK, class TYPE>
36 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator-- (void)
38 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator--");
39 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
40 return --this->value_;
43 template <class ACE_LOCK, class TYPE>
45 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator-= (
46 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs)
48 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator-=");
49 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
50 return this->value_ -= rhs;
53 template <class ACE_LOCK, class TYPE>
55 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::ACE_Atomic_Op_Ex (
56 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE> const & rhs)
58 , value_ (rhs.value ()) // rhs.value() returns atomically
60 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::ACE_Atomic_Op_Ex");
63 template <class ACE_LOCK, class TYPE>
65 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator++ (int)
67 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator++");
68 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
69 return this->value_++;
72 template <class ACE_LOCK, class TYPE>
74 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator-- (int)
76 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator--");
77 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
78 return this->value_--;
81 template <class ACE_LOCK, class TYPE>
83 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator== (
84 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs) const
86 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator==");
87 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, false);
88 return this->value_ == rhs;
91 template <class ACE_LOCK, class TYPE>
93 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator!= (
94 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs) const
96 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator!=");
97 return !(*this == rhs);
100 template <class ACE_LOCK, class TYPE>
102 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator>= (
103 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs) const
105 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator>=");
106 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, false);
107 return this->value_ >= rhs;
110 template <class ACE_LOCK, class TYPE>
112 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator> (
113 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs) const
115 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator>");
116 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, false);
117 return this->value_ > rhs;
120 template <class ACE_LOCK, class TYPE>
122 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator<= (
123 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs) const
125 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator<=");
126 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, false);
127 return this->value_ <= rhs;
130 template <class ACE_LOCK, class TYPE>
132 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator< (
133 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs) const
135 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator<");
136 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, false);
137 return this->value_ < rhs;
140 template <class ACE_LOCK, class TYPE>
141 ACE_INLINE ACE_Atomic_Op_Ex<ACE_LOCK, TYPE> &
142 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator= (
143 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE> const & rhs)
145 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator=");
147 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE> tmp (rhs);
149 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, *this);
150 std::swap (this->value_, tmp.value_);
155 template <class ACE_LOCK, class TYPE>
157 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::value (void) const
159 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::value");
160 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, this->value_);
164 template <class ACE_LOCK, class TYPE>
166 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::value_i (void)
168 // Explicitly return <value_> (by reference). This gives the user
169 // full, unrestricted access to the underlying value. This method
170 // will usually be used in conjunction with explicit access to the
171 // lock. Use with care ;-)
175 template <class ACE_LOCK, class TYPE>
176 ACE_INLINE ACE_Atomic_Op_Ex<ACE_LOCK, TYPE> &
177 ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator= (
178 typename ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::arg_type rhs)
180 // ACE_TRACE ("ACE_Atomic_Op_Ex<ACE_LOCK, TYPE>::operator=");
181 ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, *this);
187 // ACE_Atomic_Op inline functions
190 template <class ACE_LOCK, class TYPE> ACE_INLINE
191 ACE_Atomic_Op<ACE_LOCK, TYPE>::ACE_Atomic_Op (
192 ACE_Atomic_Op<ACE_LOCK, TYPE> const & rhs)
193 : impl_ (own_mutex_, rhs.value ())
195 // ACE_TRACE ("ACE_Atomic_Op<ACE_LOCK, TYPE>::ACE_Atomic_Op");
199 template <class ACE_LOCK, class TYPE>
200 ACE_INLINE ACE_Atomic_Op<ACE_LOCK, TYPE> &
201 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator= (
202 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type i)
208 template <class ACE_LOCK, class TYPE>
209 ACE_INLINE ACE_Atomic_Op<ACE_LOCK, TYPE> &
210 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator= (
211 ACE_Atomic_Op<ACE_LOCK, TYPE> const & rhs)
213 this->impl_ = rhs.impl_;
217 template <class ACE_LOCK, class TYPE>
219 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator++ (void)
221 return ++this->impl_;
224 template <class ACE_LOCK, class TYPE>
226 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator++ (int)
228 return this->impl_++;
231 template <class ACE_LOCK, class TYPE>
233 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator+= (
234 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs)
236 return this->impl_ += rhs;
239 template <class ACE_LOCK, class TYPE>
241 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator-- (void)
243 return --this->impl_;
246 template <class ACE_LOCK, class TYPE>
248 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator-- (int)
250 return this->impl_--;
253 template <class ACE_LOCK, class TYPE>
255 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator-= (
256 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs)
258 return this->impl_ -= rhs;
261 template <class ACE_LOCK, class TYPE>
263 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator== (
264 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs) const
266 return this->impl_ == rhs;
269 template <class ACE_LOCK, class TYPE>
271 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator!= (
272 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs) const
274 return this->impl_ != rhs;
277 template <class ACE_LOCK, class TYPE>
279 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator>= (
280 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs) const
282 return this->impl_ >= rhs;
285 template <class ACE_LOCK, class TYPE>
287 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator> (
288 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs) const
290 return this->impl_ > rhs;
293 template <class ACE_LOCK, class TYPE>
295 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator<= (
296 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs) const
298 return this->impl_ <= rhs;
301 template <class ACE_LOCK, class TYPE>
303 ACE_Atomic_Op<ACE_LOCK, TYPE>::operator< (
304 typename ACE_Atomic_Op<ACE_LOCK, TYPE>::arg_type rhs) const
306 return this->impl_ < rhs;
309 template <class ACE_LOCK, class TYPE>
311 ACE_Atomic_Op<ACE_LOCK, TYPE>::value (void) const
313 return this->impl_.value ();
316 template <class ACE_LOCK, class TYPE>
318 ACE_Atomic_Op<ACE_LOCK, TYPE>::dump (void) const
320 #if defined (ACE_HAS_DUMP)
322 #endif /* ACE_HAS_DUMP */
326 template <class ACE_LOCK, class TYPE>
327 ACE_INLINE ACE_LOCK &
328 ACE_Atomic_Op<ACE_LOCK, TYPE>::mutex (void)
330 return this->own_mutex_;
333 template <class ACE_LOCK, class TYPE>
335 ACE_Atomic_Op<ACE_LOCK, TYPE>::value_i (void)
337 return this->impl_.value_i ();
340 ACE_END_VERSIONED_NAMESPACE_DECL