Browse Source

handle copy constructor properly

David Rose 23 years ago
parent
commit
63f2f424db

+ 10 - 10
panda/src/putil/pipelineCycler.I

@@ -41,7 +41,7 @@ PipelineCycler(Pipeline *pipeline) :
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE PipelineCycler<CycleDataType>::
 INLINE PipelineCycler<CycleDataType>::
 PipelineCycler(const PipelineCycler<CycleDataType> &copy) :
 PipelineCycler(const PipelineCycler<CycleDataType> &copy) :
-  PipelineCyclerBase(copy)
+  PipelineCyclerBase(copy._data->make_copy(), copy)
 {
 {
 }
 }
 
 
@@ -129,7 +129,7 @@ cheat() const {
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE PipelineCycler<CycleDataType>::
 INLINE PipelineCycler<CycleDataType>::
 PipelineCycler(Pipeline *pipeline) :
 PipelineCycler(Pipeline *pipeline) :
-  PipelineCyclerBase(&_data, pipeline)
+  PipelineCyclerBase(&_typed_data, pipeline)
 {
 {
 }
 }
 
 
@@ -141,8 +141,8 @@ PipelineCycler(Pipeline *pipeline) :
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE PipelineCycler<CycleDataType>::
 INLINE PipelineCycler<CycleDataType>::
 PipelineCycler(const PipelineCycler<CycleDataType> &copy) :
 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>::
 INLINE void PipelineCycler<CycleDataType>::
 operator = (const PipelineCycler<CycleDataType> &copy) {
 operator = (const PipelineCycler<CycleDataType> &copy) {
   PipelineCyclerBase::operator = (copy);
   PipelineCyclerBase::operator = (copy);
-  _data = copy._data;
+  _typed_data = copy._typed_data;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -166,7 +166,7 @@ operator = (const PipelineCycler<CycleDataType> &copy) {
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE const CycleDataType *PipelineCycler<CycleDataType>::
 INLINE const CycleDataType *PipelineCycler<CycleDataType>::
 read() const {
 read() const {
-  return &_data;
+  return &_typed_data;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -177,7 +177,7 @@ read() const {
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 write() {
 write() {
-  return &_data;
+  return &_typed_data;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -188,7 +188,7 @@ write() {
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 elevate_read(const CycleDataType *) {
 elevate_read(const CycleDataType *) {
-  return &_data;
+  return &_typed_data;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -199,7 +199,7 @@ elevate_read(const CycleDataType *) {
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 write_stage(int) {
 write_stage(int) {
-  return &_data;
+  return &_typed_data;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -215,7 +215,7 @@ write_stage(int) {
 template<class CycleDataType>
 template<class CycleDataType>
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 INLINE CycleDataType *PipelineCycler<CycleDataType>::
 cheat() const {
 cheat() const {
-  return (CycleDataType *)&_data;
+  return (CycleDataType *)&_typed_data;
 }
 }
 
 
 
 

+ 1 - 1
panda/src/putil/pipelineCycler.h

@@ -73,7 +73,7 @@ public:
 private:
 private:
   // If we are *not* compiling in support for pipelining, we just
   // If we are *not* compiling in support for pipelining, we just
   // store the CycleData object right here.  No pointers needed.
   // store the CycleData object right here.  No pointers needed.
-  CycleDataType _data;
+  CycleDataType _typed_data;
 #endif  // !DO_PIPELINING
 #endif  // !DO_PIPELINING
 };
 };
 
 

+ 11 - 3
panda/src/putil/pipelineCyclerBase.I

@@ -44,8 +44,8 @@ PipelineCyclerBase(CycleData *initial_data, Pipeline *pipeline) :
 //  Description: 
 //  Description: 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE PipelineCyclerBase::
 INLINE PipelineCyclerBase::
-PipelineCyclerBase(const PipelineCyclerBase &copy) :
-  _data(copy._data->make_copy()),
+PipelineCyclerBase(CycleData *initial_data, const PipelineCyclerBase &copy) :
+  _data(initial_data),
   _pipeline(copy._pipeline),
   _pipeline(copy._pipeline),
   _read_count(0),
   _read_count(0),
   _write_count(0)
   _write_count(0)
@@ -312,7 +312,13 @@ PipelineCyclerBase(CycleData *initial_data, Pipeline *) {
 //  Description: 
 //  Description: 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE PipelineCyclerBase::
 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::
 INLINE void PipelineCyclerBase::
 operator = (const PipelineCyclerBase &) {
 operator = (const PipelineCyclerBase &) {
+  // We don't reassign the _data pointer here; we assume it was set
+  // correctly previously.
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 1
panda/src/putil/pipelineCyclerBase.h

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