RavEngine
Loading...
Searching...
No Matches
CmPtrTable.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef CM_PTR_TABLE_H
30#define CM_PTR_TABLE_H
31
32#include "common/PxPhysXCommonConfig.h"
33
34namespace physx
35{
36class PxSerializationContext;
37class PxDeserializationContext;
38
39namespace Cm
40{
42{
43 // This will typically be backed by a MultiPool implementation with fallback to the user
44 // allocator. For MultiPool, when deallocating we want to know what the previously requested size was
45 // so we can release into the right pool
46
47public:
48
49 virtual void** allocate(PxU32 capacity) = 0;
50 virtual void deallocate(void** addr, PxU32 originalCapacity) = 0;
51
52 // whether memory allocated at one capacity can (and should) be safely reused at a different capacity
53 // allows realloc-style reuse by clients.
54
55 virtual bool canReuse(PxU32 originalCapacity, PxU32 newCapacity) = 0;
56protected:
57 virtual ~PtrTableStorageManager() {}
58};
59
60// specialized class to hold an array of pointers with extrinsic storage management,
61// serialization-compatible with 3.3.1 PtrTable
62//
63// note that extrinsic storage implies you *must* clear the table before the destructor runs
64//
65// capacity is implicit:
66// if the memory is not owned (i.e. came from deserialization) then the capacity is exactly mCount
67// else if mCount==0, capacity is 0
68// else the capacity is the power of 2 >= mCount
69//
70// one implication of this is that if we want to add or remove a pointer from unowned memory, we always realloc
71struct PX_PHYSX_COMMON_API PtrTable
72{
73//= ATTENTION! =====================================================================================
74// Changing the data layout of this class breaks the binary serialization format. See comments for
75// PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData
76// function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION
77// accordingly.
78//==================================================================================================
79
80 PtrTable();
81 ~PtrTable();
82
83 void add(void* ptr, PtrTableStorageManager& sm);
84 void replaceWithLast(PxU32 index, PtrTableStorageManager& sm);
85 void clear(PtrTableStorageManager& sm);
86
87 PxU32 find(const void* ptr) const;
88
89 PX_FORCE_INLINE PxU32 getCount() const { return mCount; }
90 PX_FORCE_INLINE void*const* getPtrs() const { return mCount == 1 ? &mSingle : mList; }
91 PX_FORCE_INLINE void** getPtrs() { return mCount == 1 ? &mSingle : mList; }
92
93 // SERIALIZATION
94
95 // 3.3.1 compatibility fixup: this implementation ALWAYS sets 'ownsMemory' if the size is 0 or 1
96 PtrTable(const PxEMPTY)
97 {
98 mOwnsMemory = mCount<2;
99 if(mCount == 0)
100 mList = NULL;
101 }
102
103 void exportExtraData(PxSerializationContext& stream);
104 void importExtraData(PxDeserializationContext& context);
105
106 static void getBinaryMetaData(physx::PxOutputStream& stream);
107
108private:
109 void realloc(PxU32 oldCapacity, PxU32 newCapacity, PtrTableStorageManager& sm);
110
111 union
112 {
113 void* mSingle;
114 void** mList;
115 };
116
117 PxU16 mCount;
118 bool mOwnsMemory;
119 bool mBufferUsed; // dark magic in serialization requires this, otherwise redundant because it's logically equivalent to mCount == 1.
120public:
121 PxU32 mFreeSlot; // PT: padding bytes on x64
122};
123
124} // namespace Cm
125
126}
127
128#endif
Definition base.h:1940
Definition CmPtrTable.h:42
Binary deserialization context class.
Definition PxSerialFramework.h:174
Output stream class for I/O.
Definition PxIO.h:114
Binary serialization context class.
Definition PxSerialFramework.h:99
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PxEMPTY
Definition Px.h:87
Definition CmPtrTable.h:72