Panda3D
copyOnWritePointer.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file copyOnWritePointer.h
10  * @author drose
11  * @date 2007-04-09
12  */
13 
14 #ifndef COPYONWRITEPOINTER_H
15 #define COPYONWRITEPOINTER_H
16 
17 #include "pandabase.h"
18 
19 #include "copyOnWriteObject.h"
20 #include "pointerTo.h"
21 #include "dcast.h"
22 
23 /**
24  * This safely stores the primary, owned pointer to a CopyOnWriteObject. At
25  * any time, you may call get_read_pointer() or get_write_pointer() to get a
26  * read-only or modifiable pointer to the object stored.
27  *
28  * There may be multiple copies of a CopyOnWritePointer which all refer to the
29  * same shared object. They will negotiate with each other properly.
30  */
31 class EXPCL_PANDA_PUTIL CopyOnWritePointer {
32 public:
33  INLINE CopyOnWritePointer(CopyOnWriteObject *object = nullptr);
34  INLINE CopyOnWritePointer(const CopyOnWritePointer &copy);
35  INLINE CopyOnWritePointer(CopyOnWritePointer &&from) noexcept;
36  INLINE CopyOnWritePointer(PointerTo<CopyOnWriteObject> &&from) noexcept;
37  INLINE ~CopyOnWritePointer();
38 
39  INLINE void operator = (const CopyOnWritePointer &copy);
40  INLINE void operator = (CopyOnWritePointer &&from) noexcept;
41  INLINE void operator = (PointerTo<CopyOnWriteObject> &&from) noexcept;
42  INLINE void operator = (CopyOnWriteObject *object);
43 
44  INLINE bool operator == (const CopyOnWritePointer &other) const;
45  INLINE bool operator != (const CopyOnWritePointer &other) const;
46  INLINE bool operator < (const CopyOnWritePointer &other) const;
47 
48 #ifdef COW_THREADED
49  CPT(CopyOnWriteObject) get_read_pointer(Thread *current_thread) const;
50  PT(CopyOnWriteObject) get_write_pointer();
51 #else
52  INLINE const CopyOnWriteObject *get_read_pointer(Thread *current_thread) const;
53  INLINE CopyOnWriteObject *get_write_pointer();
54 #endif // COW_THREADED
55 
56  INLINE CopyOnWriteObject *get_unsafe_pointer();
57 
58  INLINE bool is_null() const;
59  INLINE void clear();
60 
61  INLINE bool test_ref_count_integrity() const;
62  INLINE bool test_ref_count_nonzero() const;
63 
64 protected:
65  CopyOnWriteObject *_cow_object;
66 };
67 
68 
69 /**
70  * A template wrapper around the above class, mainly to handle the little
71  * typecasting niceties.
72  */
73 template <class T>
75 public:
76  // By hiding this template from interrogate, we improve compile-time speed
77  // and memory utilization.
78 #ifndef CPPPARSER
79  typedef T To;
80 
81  INLINE CopyOnWritePointerTo(To *object = nullptr);
83  INLINE CopyOnWritePointerTo(CopyOnWritePointerTo &&from) noexcept;
84  INLINE CopyOnWritePointerTo(PointerTo<T> &&from) noexcept;
85 
86  INLINE void operator = (const CopyOnWritePointerTo<T> &copy);
87  INLINE void operator = (To *object);
88  INLINE void operator = (CopyOnWritePointerTo &&from) noexcept;
89  INLINE void operator = (PointerTo<T> &&from) noexcept;
90 
91 #ifdef COW_THREADED
92  INLINE CPT(To) get_read_pointer(Thread *current_thread = Thread::get_current_thread()) const;
93  INLINE PT(To) get_write_pointer();
94 #else
95  INLINE const To *get_read_pointer(Thread *current_thread = Thread::get_current_thread()) const;
96  INLINE To *get_write_pointer();
97 #endif // COW_THREADED
98 
99  INLINE To *get_unsafe_pointer();
100 #endif // CPPPARSER
101 };
102 
103 #define COWPT(type) CopyOnWritePointerTo< type >
104 
105 #include "copyOnWritePointer.I"
106 
107 #endif
A template wrapper around the above class, mainly to handle the little typecasting niceties.
To * get_write_pointer()
See CopyOnWritePointer::get_write_pointer().
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
To * get_unsafe_pointer()
See CopyOnWritePointer::get_unsafe_pointer().
This base class provides basic reference counting, but also can be used with a CopyOnWritePointer to ...
This safely stores the primary, owned pointer to a CopyOnWriteObject.
A thread; that is, a lightweight process.
Definition: thread.h:46
This file defines the classes PointerTo and ConstPointerTo (and their abbreviations,...
Definition: pointerTo.h:69
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
const To * get_read_pointer(Thread *current_thread=Thread::get_current_thread()) const
See CopyOnWritePointer::get_read_pointer().
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.