// SharedMutexHolder.tli // #pragma once #include "SharedMutexHolder.tlh" template SharedMutexHolder ::SharedMutexHolder () { m_pObject = NULL; } template SharedMutexHolder ::~SharedMutexHolder () { UpdateLock Lock (this); delete m_pObject; } template SharedMutexHolder ::SharedMutexHolder (T * object) { m_pObject = object; } template void SharedMutexHolder ::Attach (T * obj) { UpdateLock Lock (this); delete m_pObject; m_pObject = obj; } template bool SharedMutexHolder ::Update (T && obj) { UpdateLock Lock (this); if (m_pObject) { *m_pObject = std::move (obj); return true; } else { m_pObject = new T (std::move (obj)); return false; } } template T * SharedMutexHolder ::Detach () { UpdateLock Lock (this); T * old = m_pObject; m_pObject = NULL; Release (); return old; } template void SharedMutexHolder ::Release () { UpdateLock Lock (this); delete m_pObject; m_pObject = NULL; } template SharedMutexHolder & SharedMutexHolder ::operator = (T * object) { Attach (object); return *this; } template bool SharedMutexHolder ::IsEmpty () const { ReadLock Lock (this); return (m_pObject == NULL); } //----------------------------------------------------------------------------- // ReadLock //----------------------------------------------------------------------------- template SharedMutexHolder ::ReadLock::ReadLock (const SharedMutexHolder * holder) : m_Lock { std::shared_lock < std::shared_mutex > (holder->m_Mutex) } , m_Holder (holder) { assert (m_Holder); } template SharedMutexHolder ::ReadLock::ReadLock (ReadLock && from) { m_Lock.swap (from.m_Lock); m_Holder = from.m_Holder; } template T * SharedMutexHolder ::ReadLock::As () { return m_Holder->m_pObject; } template const T * SharedMutexHolder ::ReadLock::As () const { return m_Holder->m_pObject; } template template C * SharedMutexHolder ::ReadLock::AS () { return m_Holder->m_pObject; } template template const C * SharedMutexHolder ::ReadLock::AS () const { return m_Holder->m_pObject; } //----------------------------------------------------------------------------- // UpdateLock //----------------------------------------------------------------------------- template SharedMutexHolder ::UpdateLock::UpdateLock (SharedMutexHolder * holder) : m_Lock { std::lock_guard < std::shared_mutex > (holder->m_Mutex) } , m_Holder (holder) { assert (m_Holder); } template SharedMutexHolder ::UpdateLock::UpdateLock (ReadLock && from) { m_Lock.swap (from.m_Lock); m_Holder = from.m_Holder; } template T * SharedMutexHolder ::UpdateLock::As () { return m_Holder->m_pObject; } template const T * SharedMutexHolder ::UpdateLock::As () const { return m_Holder->m_pObject; } template template C * SharedMutexHolder ::UpdateLock::AS () { return m_Holder->m_pObject; } template template const C * SharedMutexHolder ::UpdateLock::AS () const { return m_Holder->m_pObject; }