Add move semantics to CDLockedReader/CDWriter

This commit is contained in:
rdb 2016-07-10 17:22:34 +02:00
parent 8b67ab31f5
commit f94db0661e
8 changed files with 145 additions and 1 deletions

View File

@ -61,6 +61,36 @@ operator = (const CycleDataLockedReader<CycleDataType> &copy) {
_cycler->increment_read(_pointer);
}
#ifdef USE_MOVE_SEMANTICS
/**
*
*/
template<class CycleDataType>
INLINE CycleDataLockedReader<CycleDataType>::
CycleDataLockedReader(CycleDataLockedReader<CycleDataType> &&from) NOEXCEPT :
_cycler(from._cycler),
_current_thread(from._current_thread),
_pointer(from._pointer)
{
from._pointer = NULL;
}
/**
*
*/
template<class CycleDataType>
INLINE void CycleDataLockedReader<CycleDataType>::
operator = (CycleDataLockedReader<CycleDataType> &&from) NOEXCEPT {
nassertv(_pointer == (CycleDataType *)NULL);
nassertv(_current_thread == from._current_thread);
_cycler = from._cycler;
_pointer = from._pointer;
from._pointer = NULL;
}
#endif // USE_MOVE_SEMANTICS
/**
*
*/

View File

@ -47,6 +47,11 @@ public:
INLINE CycleDataLockedReader(const CycleDataLockedReader<CycleDataType> &copy);
INLINE void operator = (const CycleDataLockedReader<CycleDataType> &copy);
#if defined(USE_MOVE_SEMANTICS) && defined(DO_PIPELINING)
INLINE CycleDataLockedReader(CycleDataLockedReader<CycleDataType> &&from) NOEXCEPT;
INLINE void operator = (CycleDataLockedReader<CycleDataType> &&from) NOEXCEPT;
#endif
INLINE ~CycleDataLockedReader();
INLINE const CycleDataType *operator -> () const;

View File

@ -64,6 +64,38 @@ operator = (const CycleDataLockedStageReader<CycleDataType> &copy) {
_cycler->increment_read(_pointer);
}
#ifdef USE_MOVE_SEMANTICS
/**
*
*/
template<class CycleDataType>
INLINE CycleDataLockedStageReader<CycleDataType>::
CycleDataLockedStageReader(CycleDataLockedStageReader<CycleDataType> &&from) NOEXCEPT :
_cycler(from._cycler),
_current_thread(from._current_thread),
_pointer(from._pointer),
_stage(from._stage)
{
from._pointer = NULL;
}
/**
*
*/
template<class CycleDataType>
INLINE void CycleDataLockedStageReader<CycleDataType>::
operator = (CycleDataLockedStageReader<CycleDataType> &&from) NOEXCEPT {
nassertv(_pointer == (CycleDataType *)NULL);
nassertv(_current_thread == from._current_thread);
_cycler = from._cycler;
_pointer = from._pointer;
_stage = from._stage;
from._pointer = NULL;
}
#endif // USE_MOVE_SEMANTICS
/**
*
*/

View File

@ -34,6 +34,11 @@ public:
INLINE CycleDataLockedStageReader(const CycleDataLockedStageReader<CycleDataType> &copy);
INLINE void operator = (const CycleDataLockedStageReader<CycleDataType> &copy);
#if defined(USE_MOVE_SEMANTICS) && defined(DO_PIPELINING)
INLINE CycleDataLockedStageReader(CycleDataLockedStageReader<CycleDataType> &&from) NOEXCEPT;
INLINE void operator = (CycleDataLockedStageReader<CycleDataType> &&from) NOEXCEPT;
#endif
INLINE ~CycleDataLockedStageReader();
INLINE const CycleDataType *operator -> () const;

View File

@ -114,6 +114,38 @@ CycleDataStageWriter(PipelineCycler<CycleDataType> &cycler, int stage,
force_to_0, _current_thread);
}
#ifdef USE_MOVE_SEMANTICS
/**
*
*/
template<class CycleDataType>
INLINE CycleDataStageWriter<CycleDataType>::
CycleDataStageWriter(CycleDataStageWriter<CycleDataType> &&from) NOEXCEPT :
_cycler(from._cycler),
_current_thread(from._current_thread),
_pointer(from._pointer),
_stage(from._stage)
{
from._pointer = NULL;
}
/**
*
*/
template<class CycleDataType>
INLINE void CycleDataStageWriter<CycleDataType>::
operator = (CycleDataStageWriter<CycleDataType> &&from) NOEXCEPT {
nassertv(_pointer == (CycleDataType *)NULL);
nassertv(_current_thread == from._current_thread);
_cycler = from._cycler;
_pointer = from._pointer;
_stage = from._stage;
from._pointer = NULL;
}
#endif // USE_MOVE_SEMANTICS
/**
*
*/

View File

@ -47,6 +47,11 @@ public:
CycleDataLockedStageReader<CycleDataType> &take_from,
bool force_to_0);
#if defined(USE_MOVE_SEMANTICS) && defined(DO_PIPELINING)
INLINE CycleDataStageWriter(CycleDataStageWriter<CycleDataType> &&from) NOEXCEPT;
INLINE void operator = (CycleDataStageWriter<CycleDataType> &&from) NOEXCEPT;
#endif
INLINE ~CycleDataStageWriter();
INLINE CycleDataType *operator -> ();

View File

@ -122,7 +122,7 @@ template<class CycleDataType>
INLINE CycleDataWriter<CycleDataType>::
CycleDataWriter(PipelineCycler<CycleDataType> &cycler,
CycleDataLockedReader<CycleDataType> &take_from,
bool force_to_0) :
bool force_to_0) :
_cycler(&cycler),
_current_thread(take_from.get_current_thread())
{
@ -130,6 +130,36 @@ CycleDataWriter(PipelineCycler<CycleDataType> &cycler,
force_to_0, _current_thread);
}
#ifdef USE_MOVE_SEMANTICS
/**
*
*/
template<class CycleDataType>
INLINE CycleDataWriter<CycleDataType>::
CycleDataWriter(CycleDataWriter<CycleDataType> &&from) NOEXCEPT :
_cycler(from._cycler),
_current_thread(from._current_thread),
_pointer(from._pointer)
{
from._pointer = NULL;
}
/**
*
*/
template<class CycleDataType>
INLINE void CycleDataWriter<CycleDataType>::
operator = (CycleDataWriter<CycleDataType> &&from) NOEXCEPT {
nassertv(_pointer == (CycleDataType *)NULL);
nassertv(_current_thread == from._current_thread);
_cycler = from._cycler;
_pointer = from._pointer;
from._pointer = NULL;
}
#endif // USE_MOVE_SEMANTICS
/**
*
*/

View File

@ -49,6 +49,11 @@ public:
INLINE CycleDataWriter(PipelineCycler<CycleDataType> &cycler, CycleDataLockedReader<CycleDataType> &take_from);
INLINE CycleDataWriter(PipelineCycler<CycleDataType> &cycler, CycleDataLockedReader<CycleDataType> &take_from, bool force_to_0);
#if defined(USE_MOVE_SEMANTICS) && defined(DO_PIPELINING)
INLINE CycleDataWriter(CycleDataWriter<CycleDataType> &&from) NOEXCEPT;
INLINE void operator = (CycleDataWriter<CycleDataType> &&from) NOEXCEPT;
#endif
INLINE ~CycleDataWriter();
INLINE CycleDataType *operator -> ();