handle copy constructor properly
This commit is contained in:
parent
e32fb9c7ef
commit
63f2f424db
|
|
@ -41,7 +41,7 @@ PipelineCycler(Pipeline *pipeline) :
|
|||
template<class CycleDataType>
|
||||
INLINE PipelineCycler<CycleDataType>::
|
||||
PipelineCycler(const PipelineCycler<CycleDataType> ©) :
|
||||
PipelineCyclerBase(copy)
|
||||
PipelineCyclerBase(copy._data->make_copy(), copy)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -129,7 +129,7 @@ cheat() const {
|
|||
template<class CycleDataType>
|
||||
INLINE PipelineCycler<CycleDataType>::
|
||||
PipelineCycler(Pipeline *pipeline) :
|
||||
PipelineCyclerBase(&_data, pipeline)
|
||||
PipelineCyclerBase(&_typed_data, pipeline)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -141,8 +141,8 @@ PipelineCycler(Pipeline *pipeline) :
|
|||
template<class CycleDataType>
|
||||
INLINE PipelineCycler<CycleDataType>::
|
||||
PipelineCycler(const PipelineCycler<CycleDataType> ©) :
|
||||
PipelineCyclerBase(copy),
|
||||
_data(copy._data)
|
||||
PipelineCyclerBase(&_typed_data, copy),
|
||||
_typed_data(copy._typed_data)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -155,7 +155,7 @@ template<class CycleDataType>
|
|||
INLINE void PipelineCycler<CycleDataType>::
|
||||
operator = (const PipelineCycler<CycleDataType> ©) {
|
||||
PipelineCyclerBase::operator = (copy);
|
||||
_data = copy._data;
|
||||
_typed_data = copy._typed_data;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -166,7 +166,7 @@ operator = (const PipelineCycler<CycleDataType> ©) {
|
|||
template<class CycleDataType>
|
||||
INLINE const CycleDataType *PipelineCycler<CycleDataType>::
|
||||
read() const {
|
||||
return &_data;
|
||||
return &_typed_data;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -177,7 +177,7 @@ read() const {
|
|||
template<class CycleDataType>
|
||||
INLINE CycleDataType *PipelineCycler<CycleDataType>::
|
||||
write() {
|
||||
return &_data;
|
||||
return &_typed_data;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -188,7 +188,7 @@ write() {
|
|||
template<class CycleDataType>
|
||||
INLINE CycleDataType *PipelineCycler<CycleDataType>::
|
||||
elevate_read(const CycleDataType *) {
|
||||
return &_data;
|
||||
return &_typed_data;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -199,7 +199,7 @@ elevate_read(const CycleDataType *) {
|
|||
template<class CycleDataType>
|
||||
INLINE CycleDataType *PipelineCycler<CycleDataType>::
|
||||
write_stage(int) {
|
||||
return &_data;
|
||||
return &_typed_data;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -215,7 +215,7 @@ write_stage(int) {
|
|||
template<class CycleDataType>
|
||||
INLINE CycleDataType *PipelineCycler<CycleDataType>::
|
||||
cheat() const {
|
||||
return (CycleDataType *)&_data;
|
||||
return (CycleDataType *)&_typed_data;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ public:
|
|||
private:
|
||||
// If we are *not* compiling in support for pipelining, we just
|
||||
// store the CycleData object right here. No pointers needed.
|
||||
CycleDataType _data;
|
||||
CycleDataType _typed_data;
|
||||
#endif // !DO_PIPELINING
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ PipelineCyclerBase(CycleData *initial_data, Pipeline *pipeline) :
|
|||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE PipelineCyclerBase::
|
||||
PipelineCyclerBase(const PipelineCyclerBase ©) :
|
||||
_data(copy._data->make_copy()),
|
||||
PipelineCyclerBase(CycleData *initial_data, const PipelineCyclerBase ©) :
|
||||
_data(initial_data),
|
||||
_pipeline(copy._pipeline),
|
||||
_read_count(0),
|
||||
_write_count(0)
|
||||
|
|
@ -312,7 +312,13 @@ PipelineCyclerBase(CycleData *initial_data, Pipeline *) {
|
|||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE PipelineCyclerBase::
|
||||
PipelineCyclerBase(const PipelineCyclerBase &) {
|
||||
PipelineCyclerBase(CycleData *initial_data, const PipelineCyclerBase &) {
|
||||
// The copy constructor for the DO_PIPELINING case is
|
||||
#ifdef SIMPLE_STRUCT_POINTERS
|
||||
nassertv(initial_data == (CycleData *)this);
|
||||
#else
|
||||
_data = initial_data;
|
||||
#endif // SIMPLE_STRUCT_POINTERS
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -322,6 +328,8 @@ PipelineCyclerBase(const PipelineCyclerBase &) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void PipelineCyclerBase::
|
||||
operator = (const PipelineCyclerBase &) {
|
||||
// We don't reassign the _data pointer here; we assume it was set
|
||||
// correctly previously.
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
struct EXPCL_PANDA PipelineCyclerBase {
|
||||
public:
|
||||
INLINE PipelineCyclerBase(CycleData *initial_data, Pipeline *pipeline = NULL);
|
||||
INLINE PipelineCyclerBase(const PipelineCyclerBase ©);
|
||||
INLINE PipelineCyclerBase(CycleData *initial_data, const PipelineCyclerBase ©);
|
||||
INLINE void operator = (const PipelineCyclerBase ©);
|
||||
INLINE ~PipelineCyclerBase();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue