My favorites
▼
|
Sign in
androidndkgame
A game written using the android NDK
Project Home
Downloads
Wiki
Issues
Source
Repository:
default
wiki
Checkout
Browse
Changes
Clones
Source path:
hg
/
project
/
jni
/
game
/
core
/
MetaField.h
‹39d5aecd7d58
426becdb61f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
// MetaField.h
// Copyright (C) 2008 Chris Pruett. c_pruett@efn.org
//
// FarClip Engine
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _METAFIELD_H
#define _METAFIELD_H
#include "MetaBase.h"
#include "Object.h"
#include "my_assert.h"
#include <string.h>
class MetaField : public Object
{
public:
enum MetaType
{
TYPE_value,
TYPE_pointer,
};
enum ArrayType
{
ARRAY_inline,
ARRAY_dynamic
};
// Constructor for basic fields.
MetaField(const MetaType type, const char* pName, const char* pTypeName, int offset, size_t fieldSize)
: mType(type),
mpName(pName),
mpTypeName(pTypeName),
mOffset(offset),
mFieldSize(fieldSize),
mArrayType(ARRAY_inline),
mElementCount(1),
mElementSize(fieldSize)
{};
// Constructor for fields that are arrays.
MetaField(const MetaType type, const char* pName, const char* pTypeName, int offset, size_t fieldSize, const ArrayType arrayType, int elementCount, size_t elementSize)
: mType(type),
mpName(pName),
mpTypeName(pTypeName),
mOffset(offset),
mFieldSize(fieldSize),
mArrayType(arrayType),
mElementCount(elementCount),
mElementSize(elementSize)
{};
const char* getName() const;
const char* getTypeName() const;
const int getOffset() const;
const size_t getFieldSize() const;
const MetaType getStorageType() const;
const ArrayType getArrayType() const;
virtual void* get(const MetaBase* pObject) const;
virtual void set(MetaBase* pObject, const void* pData) const;
virtual void copy(const MetaBase* pSource, MetaBase* pDest) const;
// array support
// The object must be passed so that dynamic arrays can be supported.
virtual const int getElementCount(const MetaBase* pObject) const;
const size_t getElementSize() const;
virtual void* getElement(const MetaBase* pObject, const int index) const;
virtual void setElement(MetaBase* pObject, const int index, const void* pData) const;
virtual const size_t getAllocatedSize(const MetaBase* pObject, const int index) const;
// Makes sure that the reference counts for smart objects are correct.
virtual void validateRefs(const MetaBase* pObject) const;
virtual void validateIndividualRef(const MetaBase* pObject, const int index) const;
private:
const MetaType mType;
const char* mpName;
const char* mpTypeName;
const int mOffset;
const size_t mFieldSize; // total size including all elements
const ArrayType mArrayType;
const int mElementCount;
const size_t mElementSize; // the size of a single element. mElementSize * mElementCount == mFieldSize
};
template<class T>
class TMetaField : public MetaField
{
public:
T* get(const void* pObject) const;
};
inline const char* MetaField::getName() const
{
return mpName;
}
inline const char* MetaField::getTypeName() const
{
return mpTypeName;
}
inline const int MetaField::getOffset() const
{
return mOffset;
}
inline const size_t MetaField::getFieldSize() const
{
return mFieldSize;
}
inline const MetaField::MetaType MetaField::getStorageType() const
{
return mType;
}
inline const MetaField::ArrayType MetaField::getArrayType() const
{
return mArrayType;
}
inline const int MetaField::getElementCount(const MetaBase* /*pObject*/) const
{
return mElementCount;
}
inline const size_t MetaField::getElementSize() const
{
return mElementSize;
}
inline void* MetaField::get(const MetaBase* pObject) const
{
ASSERT(pObject != NULL, "NULL object passed to get()!");
return getElement(pObject, 0);
}
inline void MetaField::set(MetaBase* pObject, const void* pData) const
{
ASSERT(pObject != NULL, "NULL object passed to set()!");
char* pAddress = (char*)pObject->getObjectMemory();
pAddress += mOffset;
::memcpy(pAddress, pData, getFieldSize());
}
inline void* MetaField::getElement(const MetaBase* pObject, const int index) const
{
ASSERT(pObject != NULL, "NULL object passed to get()!");
ASSERT(index >= 0 && index < mElementCount, "Invalid index!");
char* pAddress = NULL;
if (index >= 0 && index < mElementCount)
{
pAddress = (char*)pObject->getObjectMemory();
pAddress += mOffset;
pAddress += index * getElementSize();
}
return pAddress;
}
inline void MetaField::setElement(MetaBase* pObject, const int index, const void* pData) const
{
ASSERT(pObject != NULL, "NULL object passed to set()!");
ASSERT(index >= 0 && index < mElementCount, "Invalid index!");
if (index >= 0 && index < mElementCount)
{
char* pAddress = (char*)pObject->getObjectMemory();
pAddress += mOffset;
pAddress += index * getElementSize();
::memcpy(pAddress, pData, getElementSize());
}
}
inline void MetaField::copy(const MetaBase* pSource, MetaBase* pDest) const
{
set(pDest, get(pSource));
}
inline void MetaField::validateRefs(const MetaBase* pObject) const
{
const int elementCount = getElementCount(pObject);
for (int x = 0; x < elementCount; x++)
{
validateIndividualRef(pObject, x);
}
}
inline void MetaField::validateIndividualRef(const MetaBase* pObject, const int index) const
{
// base class knows nothing about ref counting, so do nothing
}
// may be overridden for complex objects. default returns field size
inline const size_t MetaField::getAllocatedSize(const MetaBase* pObject, const int index) const
{
ASSERT(pObject != NULL, "NULL object passed to getAllocatedSize()!");
size_t size = 0;
if (pObject)
{
if (getStorageType() == TYPE_value)
{
size = getElementSize();
}
else
{
// if this is a pointer we'll return the field size unless
// it's set to NULL. More complex functions could
// return the actual allocated size if they knew it.
void** pPointer = static_cast<void**>(getElement(pObject, index));
if (*pPointer != NULL)
{
size = getElementSize();
}
}
}
return size;
}
template<class T>
T* TMetaField<T>::get(const void* pObject) const
{
return static_cast<T*>(MetaField::get(pObject));
}
#endif //_METAFIELD_H
Show details
Hide details
Change log
9ecaaa66aa02
by gman on Jul 11, 2010
Diff
remove bogus folders
Go to:
/Application.mk
/android/apps/o3d/Application.mk
/android/apps/o3d/project/.cproject
...roid/apps/o3d/project/Android.mk
.../o3d/project/AndroidManifest.xml
...s/o3d/project/assets/client.html
...s/images/ui-anim_basic_16x16.gif
...s/ui-bg_flat_0_aaaaaa_40x100.png
.../ui-bg_flat_75_ffffff_40x100.png
.../ui-bg_glass_55_fbf9ee_1x400.png
.../ui-bg_glass_65_ffffff_1x400.png
.../ui-bg_glass_75_dadada_1x400.png
.../ui-bg_glass_75_e6e6e6_1x400.png
.../ui-bg_glass_95_fef1ec_1x400.png
...ghlight-soft_75_cccccc_1x100.png
...ages/ui-icons_222222_256x240.png
...ages/ui-icons_2e83ff_256x240.png
...ages/ui-icons_454545_256x240.png
...ages/ui-icons_888888_256x240.png
...ages/ui-icons_cd0a0a_256x240.png
...hness/jquery-ui-1.8.2.custom.css
...d/project/assets/jquery-1.4.2.js
...ct/assets/js/jquery-1.4.2.min.js
...js/jquery-ui-1.8.2.custom.min.js
.../apps/o3d/project/build/build.py
...3d/project/build/build_system.py
...s/o3d/project/default.properties
.../apps/o3d/project/jni/Android.mk
...3d/project/jni/base/cross/bits.h
...ject/jni/base/cross/bits_test.cc
.../jni/base/cross/std_functional.h
...o3d/project/jni/debug/Android.mk
...oject/jni/debug/debugconsole.cpp
...project/jni/debug/debugconsole.h
...project/jni/debug/debugmenus.cpp
...d/project/jni/debug/debugmenus.h
...ni/debug/debugmenus_examples.cpp
...roject/jni/debug/debugplatform.h
.../debug/debugplatform_android.cpp
...project/jni/debug/debugprint.cpp
...d/project/jni/debug/debugprint.h
.../project/jni/debug/debugtext.cpp
...3d/project/jni/debug/debugtext.h
...3d/project/jni/debug/ggsassert.h
...project/jni/game/core/Android.mk
...3d/project/jni/game/core/Array.h
...oject/jni/game/core/CRCUtility.h
.../game/core/DataReferenceObject.h
...roject/jni/game/core/DataStack.h
...roject/jni/game/core/DataTable.h
Project members,
sign in
to write a code review
Older revisions
39d5aecd7d58
by gman on Jul 5, 2010
Diff
initial checkin
All revisions of this file
File info
Size: 6493 bytes, 254 lines
View raw file
Powered by
Google Project Hosting