94 lines
3.1 KiB
C
94 lines
3.1 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file nodeCachedReferenceCount.h
|
||
|
* @author drose
|
||
|
* @date 2005-05-07
|
||
|
*/
|
||
|
|
||
|
#ifndef NODECACHEDREFERENCECOUNT_H
|
||
|
#define NODECACHEDREFERENCECOUNT_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
|
||
|
#include "cachedTypedWritableReferenceCount.h"
|
||
|
#include "nodeReferenceCount.h" // for node_unref_delete()
|
||
|
|
||
|
/**
|
||
|
* 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_PUTIL 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:
|
||
|
INLINE void node_unref_only() const;
|
||
|
bool do_test_ref_count_integrity() const;
|
||
|
|
||
|
private:
|
||
|
AtomicAdjust::Integer _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
|