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
255
|
/**
* vim: set ts=4 sw=4 tw=99 noet :
* =============================================================================
* SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This file is part of the SourceMod/SourcePawn SDK.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#if defined _datapack_included
#endinput
#endif
#define _datapack_included
/**
* Opaque handle to a datapack position.
*/
enum DataPackPos: {};
// A DataPack allows serializing multiple variables into a single stream.
methodmap DataPack < Handle
{
// Creates a new data pack.
public native DataPack();
// Packs a normal cell into a data pack.
//
// @param cell Cell to add.
// @param insert Determines whether mid-pack writes will insert instead of overwrite.
public native void WriteCell(any cell, bool insert = false);
// Packs a float into a data pack.
//
// @param val Float to add.
// @param insert Determines whether mid-pack writes will insert instead of overwrite.
public native void WriteFloat(float val, bool insert = false);
// Packs a string into a data pack.
//
// @param str String to add.
// @param insert Determines whether mid-pack writes will insert instead of overwrite.
public native void WriteString(const char[] str, bool insert = false);
// Packs a function pointer into a data pack.
//
// @param fktptr Function pointer to add.
// @param insert Determines whether mid-pack writes will insert instead of overwrite.
public native void WriteFunction(Function fktptr, bool insert = false);
// Packs an array of cells into a data pack.
//
// @param array Array to add.
// @param count Number of elements
// @param insert Determines whether mid-pack writes will insert instead of overwrite.
public native void WriteCellArray(const any[] array, int count, bool insert = false);
// Packs an array of floats into a data pack.
//
// @param array Array to add.
// @param count Number of elements
// @param insert Determines whether mid-pack writes will insert instead of overwrite.
public native void WriteFloatArray(const float[] array, int count, bool insert = false);
// Reads a cell from a data pack.
//
// @return A cell at this position
public native any ReadCell();
// Reads a float from a data pack.
//
// @return Float at this position
public native float ReadFloat();
// Reads a string from a data pack.
//
// @param buffer Destination string buffer.
// @param maxlen Maximum length of output string buffer.
public native void ReadString(char[] buffer, int maxlen);
// Reads a function pointer from a data pack.
//
// @return Function pointer.
public native Function ReadFunction();
// Reads an array of cells a data pack.
//
// @param buffer Destination buffer.
// @param count Maximum length of output buffer.
public native void ReadCellArray(any[] buffer, int count);
// Reads an array of floats from a data pack.
//
// @param buffer Destination buffer.
// @param count Maximum length of output buffer.
public native void ReadFloatArray(float[] buffer, int count);
// Resets the position in a data pack.
//
// @param clear If true, clears the contained data.
public native void Reset(bool clear=false);
// Returns whether or not a specified number of bytes from the data pack
// position to the end can be read.
//
// @param unused Unused variable. Exists for backwards compatability.
public native bool IsReadable(int unused = 0);
// The read or write position in a data pack.
property DataPackPos Position {
public native get();
public native set(DataPackPos pos);
}
};
/**
* Creates a new data pack.
*
* @return A Handle to the data pack. Must be closed with CloseHandle().
*/
native DataPack CreateDataPack();
/**
* Packs a normal cell into a data pack.
*
* @param pack Handle to the data pack.
* @param cell Cell to add.
* @error Invalid handle.
*/
native void WritePackCell(Handle pack, any cell);
/**
* Packs a float into a data pack.
*
* @param pack Handle to the data pack.
* @param val Float to add.
* @error Invalid handle.
*/
native void WritePackFloat(Handle pack, float val);
/**
* Packs a string into a data pack.
*
* @param pack Handle to the data pack.
* @param str String to add.
* @error Invalid handle.
*/
native void WritePackString(Handle pack, const char[] str);
/**
* Packs a function pointer into a data pack.
*
* @param pack Handle to the data pack.
* @param fktptr Function pointer to add.
* @error Invalid handle.
*/
native void WritePackFunction(Handle pack, Function fktptr);
/**
* Reads a cell from a data pack.
*
* @param pack Handle to the data pack.
* @return Cell value.
* @error Invalid handle, or bounds error.
*/
native any ReadPackCell(Handle pack);
/**
* Reads a float from a data pack.
*
* @param pack Handle to the data pack.
* @return Float value.
* @error Invalid handle, or bounds error.
*/
native float ReadPackFloat(Handle pack);
/**
* Reads a string from a data pack.
*
* @param pack Handle to the data pack.
* @param buffer Destination string buffer.
* @param maxlen Maximum length of output string buffer.
* @error Invalid handle, or bounds error.
*/
native void ReadPackString(Handle pack, char[] buffer, int maxlen);
/**
* Reads a function pointer from a data pack.
*
* @param pack Handle to the data pack.
* @return Function pointer.
* @error Invalid handle, or bounds error.
*/
native Function ReadPackFunction(Handle pack);
/**
* Resets the position in a data pack.
*
* @param pack Handle to the data pack.
* @param clear If true, clears the contained data.
* @error Invalid handle.
*/
native void ResetPack(Handle pack, bool clear=false);
/**
* Returns the read or write position in a data pack.
*
* @param pack Handle to the data pack.
* @return Position in the data pack, only usable with calls to SetPackPosition.
* @error Invalid handle.
*/
native DataPackPos GetPackPosition(Handle pack);
/**
* Sets the read/write position in a data pack.
*
* @param pack Handle to the data pack.
* @param position New position to set. Must have been previously retrieved from a call to GetPackPosition.
* @error Invalid handle, or position is beyond the pack bounds.
*/
native void SetPackPosition(Handle pack, DataPackPos position);
/**
* Returns whether or not a specified number of bytes from the data pack
* position to the end can be read.
*
* @param pack Handle to the data pack.
* @param bytes Number of bytes to simulate reading.
* @return True if can be read, false otherwise.
* @error Invalid handle.
*/
native bool IsPackReadable(Handle pack, int bytes);
|