SharedMutexHolder.tli 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // SharedMutexHolder.tli
  2. //
  3. #pragma once
  4. #include "SharedMutexHolder.tlh"
  5. template <typename T>
  6. SharedMutexHolder <T>::SharedMutexHolder ()
  7. {
  8. m_pObject = NULL;
  9. }
  10. template <typename T>
  11. SharedMutexHolder <T>::~SharedMutexHolder ()
  12. {
  13. UpdateLock Lock (this);
  14. delete m_pObject;
  15. }
  16. template <typename T>
  17. SharedMutexHolder <T>::SharedMutexHolder (T * object)
  18. {
  19. m_pObject = object;
  20. }
  21. template <typename T>
  22. void SharedMutexHolder <T>::Attach (T * obj)
  23. {
  24. UpdateLock Lock (this);
  25. delete m_pObject;
  26. m_pObject = obj;
  27. }
  28. template <typename T>
  29. bool SharedMutexHolder <T>::Update (T && obj)
  30. {
  31. UpdateLock Lock (this);
  32. if (m_pObject)
  33. {
  34. *m_pObject = std::move (obj);
  35. return true;
  36. }
  37. else
  38. {
  39. m_pObject = new T (std::move (obj));
  40. return false;
  41. }
  42. }
  43. template <typename T>
  44. T * SharedMutexHolder <T>::Detach ()
  45. {
  46. UpdateLock Lock (this);
  47. T * old = m_pObject;
  48. m_pObject = NULL;
  49. Release ();
  50. return old;
  51. }
  52. template <typename T>
  53. void SharedMutexHolder <T>::Release ()
  54. {
  55. UpdateLock Lock (this);
  56. delete m_pObject;
  57. m_pObject = NULL;
  58. }
  59. template <typename T>
  60. SharedMutexHolder <T> & SharedMutexHolder <T>::operator = (T * object)
  61. {
  62. Attach (object);
  63. return *this;
  64. }
  65. template <typename T>
  66. bool SharedMutexHolder <T>::IsEmpty () const
  67. {
  68. ReadLock Lock (this);
  69. return (m_pObject == NULL);
  70. }
  71. //-----------------------------------------------------------------------------
  72. // ReadLock
  73. //-----------------------------------------------------------------------------
  74. template <typename T>
  75. SharedMutexHolder <T>::ReadLock::ReadLock (const SharedMutexHolder <T> * holder)
  76. : m_Lock { std::shared_lock < std::shared_mutex > (holder->m_Mutex) }
  77. , m_Holder (holder)
  78. {
  79. assert (m_Holder);
  80. }
  81. template <typename T>
  82. SharedMutexHolder <T>::ReadLock::ReadLock (ReadLock && from)
  83. {
  84. m_Lock.swap (from.m_Lock);
  85. m_Holder = from.m_Holder;
  86. }
  87. template <typename T>
  88. T * SharedMutexHolder <T>::ReadLock::As ()
  89. {
  90. return m_Holder->m_pObject;
  91. }
  92. template <typename T>
  93. const T * SharedMutexHolder <T>::ReadLock::As () const
  94. {
  95. return m_Holder->m_pObject;
  96. }
  97. template <typename T>
  98. template <typename C> C * SharedMutexHolder <T>::ReadLock::AS ()
  99. {
  100. return m_Holder->m_pObject;
  101. }
  102. template <typename T>
  103. template <typename C> const C * SharedMutexHolder <T>::ReadLock::AS () const
  104. {
  105. return m_Holder->m_pObject;
  106. }
  107. //-----------------------------------------------------------------------------
  108. // UpdateLock
  109. //-----------------------------------------------------------------------------
  110. template <typename T>
  111. SharedMutexHolder <T>::UpdateLock::UpdateLock (SharedMutexHolder <T> * holder)
  112. : m_Lock { std::lock_guard < std::shared_mutex > (holder->m_Mutex) }
  113. , m_Holder (holder)
  114. {
  115. assert (m_Holder);
  116. }
  117. template <typename T>
  118. SharedMutexHolder <T>::UpdateLock::UpdateLock (ReadLock && from)
  119. {
  120. m_Lock.swap (from.m_Lock);
  121. m_Holder = from.m_Holder;
  122. }
  123. template <typename T>
  124. T * SharedMutexHolder <T>::UpdateLock::As ()
  125. {
  126. return m_Holder->m_pObject;
  127. }
  128. template <typename T>
  129. const T * SharedMutexHolder <T>::UpdateLock::As () const
  130. {
  131. return m_Holder->m_pObject;
  132. }
  133. template <typename T>
  134. template <typename C> C * SharedMutexHolder <T>::UpdateLock::AS ()
  135. {
  136. return m_Holder->m_pObject;
  137. }
  138. template <typename T>
  139. template <typename C> const C * SharedMutexHolder <T>::UpdateLock::AS () const
  140. {
  141. return m_Holder->m_pObject;
  142. }