| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // Filename: pointerToBase.I
- // Created by: drose (27Sep04)
- //
- ////////////////////////////////////////////////////////////////////
- //
- // PANDA 3D SOFTWARE
- // Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
- //
- // All use of this software is subject to the terms of the Panda 3d
- // Software license. You should have received a copy of this license
- // along with this source code; you will also find a current copy of
- // the license at http://etc.cmu.edu/panda3d/docs/license/ .
- //
- // To contact the maintainers of this program write to
- // [email protected] .
- //
- ////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::Constructor
- // Access: Protected
- // Description:
- ////////////////////////////////////////////////////////////////////
- template<class T>
- INLINE PointerToBase<T>::
- PointerToBase(To *ptr) {
- reassign(ptr);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::Copy Constructor
- // Access: Protected
- // Description:
- ////////////////////////////////////////////////////////////////////
- template<class T>
- INLINE PointerToBase<T>::
- PointerToBase(const PointerToBase<T> ©) {
- reassign(copy);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::Destructor
- // Access: Protected
- // Description:
- ////////////////////////////////////////////////////////////////////
- template<class T>
- INLINE PointerToBase<T>::
- ~PointerToBase() {
- reassign((To *)NULL);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::reassign
- // Access: Protected
- // Description: This is the main work of the PointerTo family. When
- // the pointer is reassigned, decrement the old
- // reference count and increment the new one.
- ////////////////////////////////////////////////////////////////////
- template<class T>
- void PointerToBase<T>::
- reassign(To *ptr) {
- if (ptr != (To *)_void_ptr) {
- // First save the old pointer; we won't delete it until we have
- // assigned the new one. We do this just in case there are
- // cascading effects from deleting this pointer that might
- // inadvertently delete the new one. (Don't laugh--it's
- // happened!)
- To *old_ptr = (To *)_void_ptr;
- _void_ptr = (void *)ptr;
- if (ptr != (To *)NULL) {
- ptr->ref();
- #ifdef DO_MEMORY_USAGE
- if (MemoryUsage::get_track_memory_usage()) {
- // Make sure the MemoryUsage record knows what the TypeHandle
- // is, if we know it ourselves.
- TypeHandle type = get_type_handle(To);
- if (type == TypeHandle::none()) {
- do_init_type(To);
- type = get_type_handle(To);
- }
- if (type != TypeHandle::none()) {
- MemoryUsage::update_type(ptr, type);
- }
- }
- #endif
- }
- // Now delete the old pointer.
- if (old_ptr != (To *)NULL) {
- unref_delete(old_ptr);
- }
- }
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::reassign
- // Access: Protected
- // Description:
- ////////////////////////////////////////////////////////////////////
- template<class T>
- INLINE void PointerToBase<T>::
- reassign(const PointerToBase<To> ©) {
- reassign((To *)copy._void_ptr);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::clear
- // Access: Published
- // Description: A convenient way to set the PointerTo object to NULL.
- // (Assignment to a NULL pointer also works, of course.)
- ////////////////////////////////////////////////////////////////////
- template<class T>
- INLINE void PointerToBase<T>::
- clear() {
- reassign((To *)NULL);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PointerToBase::output
- // Access: Published
- // Description: A handy function to output PointerTo's as a hex
- // pointer followed by a reference count.
- ////////////////////////////////////////////////////////////////////
- template<class T>
- INLINE void PointerToBase<T>::
- output(ostream &out) const {
- out << _void_ptr;
- if (_void_ptr != (void *)NULL) {
- out << ":" << ((To *)_void_ptr)->get_ref_count();
- }
- }
|