// Filename: nodeCachedReferenceCount.h // Created by: drose (07May05) // //////////////////////////////////////////////////////////////////// // // 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 // panda3d-general@lists.sourceforge.net . // //////////////////////////////////////////////////////////////////// #ifndef NODECACHEDREFERENCECOUNT_H #define NODECACHEDREFERENCECOUNT_H #include "pandabase.h" #include "cachedTypedWritableReferenceCount.h" #include "nodeReferenceCount.h" // for node_unref_delete() #include "objectDeletor.h" //////////////////////////////////////////////////////////////////// // Class : NodeCachedReferenceCount // Description : This class further specializes // CachedTypedWritableReferenceCount to also add a // node_ref_count, for the purposes of counting the // number of times the object is referenced by a "node", // presumably a PandaNode. // // This essentially combines the functionality of // NodeReferenceCount and // CachedTypedWritableReferenceCount, so that a // derivative of this object actually has three // counters: the standard reference count, the "cache" // reference count, and the "node" reference count. // Rather than multiply inheriting from the two // reference count classes, we inherit only from // CachedTypedWritableReferenceCount and simply // duplicate the functionality of NodeReferenceCount, to // avoid all of the problems associated with multiple // inheritance. // // The intended design is to use this as a base class // for RenderState and TransformState, both of which are // held by PandaNodes, and also have caches which are // independently maintained. By keeping track of how // many nodes hold a pointer to a particular object, we // can classify each object into node-referenced, // cache-referenced, or other, which is primarily useful // for PStats reporting. // // As with CachedTypedWritableReferenceCount's // cache_ref() and cache_unref(), the new methods // node_ref() and node_unref() automatically increment // and decrement the primary reference count as well. // In this case, however, there does exist a // NodePointerTo<> class to maintain the node_ref // counters automatically. //////////////////////////////////////////////////////////////////// class EXPCL_PANDA NodeCachedReferenceCount : public CachedTypedWritableReferenceCount { protected: INLINE NodeCachedReferenceCount(); INLINE NodeCachedReferenceCount(const NodeCachedReferenceCount ©); INLINE void operator = (const NodeCachedReferenceCount ©); INLINE ~NodeCachedReferenceCount(); PUBLISHED: INLINE int get_node_ref_count() const; INLINE void node_ref() const; INLINE bool node_unref() const; INLINE bool test_ref_count_integrity() const; enum Referenced { R_node = 0x001, R_cache = 0x002, }; INLINE int get_referenced_bits() const; protected: bool do_test_ref_count_integrity() const; private: PN_int32 _node_ref_count; public: static TypeHandle get_class_type() { return _type_handle; } static void init_type() { CachedTypedWritableReferenceCount::init_type(); register_type(_type_handle, "NodeCachedReferenceCount", CachedTypedWritableReferenceCount::get_class_type()); } private: static TypeHandle _type_handle; }; #include "nodeCachedReferenceCount.I" #endif