PriorityExpire.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //
  2. // PriorityExpire.h
  3. //
  4. // $Id: //poco/1.4/Foundation/include/Poco/PriorityExpire.h#3 $
  5. //
  6. // Library: Foundation
  7. // Package: Events
  8. // Module: PriorityExpire
  9. //
  10. // Implementation of the PriorityExpire template.
  11. //
  12. // Copyright (c) 2006-2011, Applied Informatics Software Engineering GmbH.
  13. // and Contributors.
  14. //
  15. // SPDX-License-Identifier: BSL-1.0
  16. //
  17. #ifndef Foundation_PriorityExpire_INCLUDED
  18. #define Foundation_PriorityExpire_INCLUDED
  19. #include "Poco/Foundation.h"
  20. #include "Poco/Timestamp.h"
  21. #include "Poco/AbstractPriorityDelegate.h"
  22. namespace Poco {
  23. template <class TArgs>
  24. class PriorityExpire: public AbstractPriorityDelegate<TArgs>
  25. /// Decorator for AbstractPriorityDelegate adding automatic
  26. /// expiring of registrations to AbstractPriorityDelegate.
  27. {
  28. public:
  29. PriorityExpire(const AbstractPriorityDelegate<TArgs>& p, Timestamp::TimeDiff expireMilliSec):
  30. AbstractPriorityDelegate<TArgs>(p),
  31. _pDelegate(static_cast<AbstractPriorityDelegate<TArgs>*>(p.clone())),
  32. _expire(expireMilliSec*1000)
  33. {
  34. }
  35. PriorityExpire(const PriorityExpire& expire):
  36. AbstractPriorityDelegate<TArgs>(expire),
  37. _pDelegate(static_cast<AbstractPriorityDelegate<TArgs>*>(expire._pDelegate->clone())),
  38. _expire(expire._expire),
  39. _creationTime(expire._creationTime)
  40. {
  41. }
  42. ~PriorityExpire()
  43. {
  44. delete _pDelegate;
  45. }
  46. PriorityExpire& operator = (const PriorityExpire& expire)
  47. {
  48. if (&expire != this)
  49. {
  50. delete this->_pDelegate;
  51. this->_pTarget = expire._pTarget;
  52. this->_pDelegate = expire._pDelegate->clone();
  53. this->_expire = expire._expire;
  54. this->_creationTime = expire._creationTime;
  55. }
  56. return *this;
  57. }
  58. bool notify(const void* sender, TArgs& arguments)
  59. {
  60. if (!expired())
  61. return this->_pDelegate->notify(sender, arguments);
  62. else
  63. return false;
  64. }
  65. bool equals(const AbstractDelegate<TArgs>& other) const
  66. {
  67. return other.equals(*_pDelegate);
  68. }
  69. AbstractPriorityDelegate<TArgs>* clone() const
  70. {
  71. return new PriorityExpire(*this);
  72. }
  73. void disable()
  74. {
  75. _pDelegate->disable();
  76. }
  77. const AbstractPriorityDelegate<TArgs>* unwrap() const
  78. {
  79. return this->_pDelegate;
  80. }
  81. protected:
  82. bool expired() const
  83. {
  84. return _creationTime.isElapsed(_expire);
  85. }
  86. AbstractPriorityDelegate<TArgs>* _pDelegate;
  87. Timestamp::TimeDiff _expire;
  88. Timestamp _creationTime;
  89. private:
  90. PriorityExpire();
  91. };
  92. template <>
  93. class PriorityExpire<void>: public AbstractPriorityDelegate<void>
  94. /// Decorator for AbstractPriorityDelegate adding automatic
  95. /// expiring of registrations to AbstractPriorityDelegate.
  96. {
  97. public:
  98. PriorityExpire(const AbstractPriorityDelegate<void>& p, Timestamp::TimeDiff expireMilliSec):
  99. AbstractPriorityDelegate<void>(p),
  100. _pDelegate(static_cast<AbstractPriorityDelegate<void>*>(p.clone())),
  101. _expire(expireMilliSec*1000)
  102. {
  103. }
  104. PriorityExpire(const PriorityExpire& expire):
  105. AbstractPriorityDelegate<void>(expire),
  106. _pDelegate(static_cast<AbstractPriorityDelegate<void>*>(expire._pDelegate->clone())),
  107. _expire(expire._expire),
  108. _creationTime(expire._creationTime)
  109. {
  110. }
  111. ~PriorityExpire()
  112. {
  113. delete _pDelegate;
  114. }
  115. PriorityExpire& operator = (const PriorityExpire& expire)
  116. {
  117. if (&expire != this)
  118. {
  119. delete this->_pDelegate;
  120. this->_pDelegate = static_cast<AbstractPriorityDelegate<void>*>(expire._pDelegate->clone());
  121. this->_expire = expire._expire;
  122. this->_creationTime = expire._creationTime;
  123. }
  124. return *this;
  125. }
  126. bool notify(const void* sender)
  127. {
  128. if (!expired())
  129. return this->_pDelegate->notify(sender);
  130. else
  131. return false;
  132. }
  133. bool equals(const AbstractDelegate<void>& other) const
  134. {
  135. return other.equals(*_pDelegate);
  136. }
  137. AbstractPriorityDelegate<void>* clone() const
  138. {
  139. return new PriorityExpire(*this);
  140. }
  141. void disable()
  142. {
  143. _pDelegate->disable();
  144. }
  145. const AbstractPriorityDelegate<void>* unwrap() const
  146. {
  147. return this->_pDelegate;
  148. }
  149. protected:
  150. bool expired() const
  151. {
  152. return _creationTime.isElapsed(_expire);
  153. }
  154. AbstractPriorityDelegate<void>* _pDelegate;
  155. Timestamp::TimeDiff _expire;
  156. Timestamp _creationTime;
  157. private:
  158. PriorityExpire();
  159. };
  160. } // namespace Poco
  161. #endif // Foundation_PriorityExpire_INCLUDED