handle copy constructor properly

This commit is contained in:
David Rose 2003-04-04 16:14:25 +00:00
parent e32fb9c7ef
commit 63f2f424db
4 changed files with 23 additions and 15 deletions

View File

@ -41,7 +41,7 @@ PipelineCycler(Pipeline *pipeline) :
template<class CycleDataType>
INLINE PipelineCycler<CycleDataType>::
PipelineCycler(const PipelineCycler<CycleDataType> &copy) :
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> &copy) :
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> &copy) {
PipelineCyclerBase::operator = (copy);
_data = copy._data;
_typed_data = copy._typed_data;
}
////////////////////////////////////////////////////////////////////
@ -166,7 +166,7 @@ operator = (const PipelineCycler<CycleDataType> &copy) {
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;
}

View File

@ -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
};

View File

@ -44,8 +44,8 @@ PipelineCyclerBase(CycleData *initial_data, Pipeline *pipeline) :
// Description:
////////////////////////////////////////////////////////////////////
INLINE PipelineCyclerBase::
PipelineCyclerBase(const PipelineCyclerBase &copy) :
_data(copy._data->make_copy()),
PipelineCyclerBase(CycleData *initial_data, const PipelineCyclerBase &copy) :
_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.
}
////////////////////////////////////////////////////////////////////

View File

@ -39,7 +39,7 @@
struct EXPCL_PANDA PipelineCyclerBase {
public:
INLINE PipelineCyclerBase(CycleData *initial_data, Pipeline *pipeline = NULL);
INLINE PipelineCyclerBase(const PipelineCyclerBase &copy);
INLINE PipelineCyclerBase(CycleData *initial_data, const PipelineCyclerBase &copy);
INLINE void operator = (const PipelineCyclerBase &copy);
INLINE ~PipelineCyclerBase();