plugins/include/adt_array.inc
author David Anderson <dvander@alliedmods.net>
Sun Jan 13 08:10:25 2008 +0000 (2008-01-13)
changeset 1847 5336a438763f
parent 1683 63b830faea21
child 1937 b1d373d7c127
permissions -rw-r--r--
fixed amb1379 with sweeping changes to the entity stuff. all prop stocks are now natives so they can properly compute everything quickly, as well as do type checks. Get/SetEntDataEnt are deprecated for being sucky, the new 2 versions do more checking and uses better values. lastly, there are functions/parameters for finding types and sizes of property.
dvander@1156
     1
/**
dvander@1156
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1156
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     5
 * =============================================================================
ds@1330
     6
 *
ds@1330
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@1156
     8
 *
ds@1330
     9
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    11
 * Free Software Foundation.
ds@1330
    12
 * 
ds@1330
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    16
 * details.
ds@1330
    17
 *
ds@1330
    18
 * You should have received a copy of the GNU General Public License along with
ds@1330
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1330
    20
 *
ds@1330
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@1156
    29
 *
dvander@1156
    30
 * Version: $Id$
dvander@1156
    31
 */
dvander@1156
    32
 
dvander@1156
    33
#if defined _adt_array_included
dvander@1156
    34
 #endinput
dvander@1156
    35
#endif
dvander@1156
    36
#define _adt_array_included
dvander@1156
    37
dvander@1156
    38
/**
dvander@1156
    39
 * Given a maximum string size (including the null terminator), 
dvander@1156
    40
 * returns the number of cells required to fit that string.
dvander@1156
    41
 *
dvander@1156
    42
 * @param size			Number of bytes.
dvander@1156
    43
 * @return				Minimum number of cells required to fit the byte count.
dvander@1156
    44
 */
dvander@1156
    45
stock ByteCountToCells(size)
dvander@1156
    46
{
dvander@1156
    47
	if (!size)
dvander@1156
    48
	{
dvander@1156
    49
		return 1;
dvander@1156
    50
	}
dvander@1156
    51
	
dvander@1156
    52
	return (size + 3) / 4;
dvander@1156
    53
}
dvander@1156
    54
dvander@1156
    55
/**
dvander@1156
    56
 * Creates a dynamic global cell array.  While slower than a normal array,
dvander@1156
    57
 * it can be used globally AND dynamically, which is otherwise impossible.
dvander@1156
    58
 * 
dvander@1156
    59
 * The contents of the array are uniform; i.e. storing a string at index X 
dvander@1156
    60
 * and then retrieving it as an integer is NOT the same as StringToInt()!
dvander@1156
    61
 * The "blocksize" determines how many cells each array slot has; it cannot
dvander@1156
    62
 * be changed after creation.
dvander@1156
    63
 *
dvander@1156
    64
 * @param blocksize		The number of cells each member of the array can 
dvander@1156
    65
 *						hold.  For example, 32 cells is equivalent to:
dvander@1156
    66
 *						new Array[X][32]
dvander@1156
    67
 * @param startsize		Initial size of the array.  Note that data will 
dvander@1156
    68
 *						NOT be auto-intialized.
dvander@1156
    69
 * @return				New Handle to the array object.
dvander@1156
    70
 */
dvander@1156
    71
native Handle:CreateArray(blocksize=1, startsize=0);
dvander@1156
    72
dvander@1156
    73
/**
dvander@1156
    74
 * Clears an array of all entries.  This is the same as ResizeArray(0).
dvander@1156
    75
 *
dvander@1156
    76
 * @param array			Array Handle.
dvander@1156
    77
 * @noreturn
dvander@1156
    78
 * @error				Invalid Handle.
dvander@1156
    79
 */
dvander@1156
    80
native ClearArray(Handle:array);
dvander@1156
    81
dvander@1156
    82
/**
ferret99gt@1664
    83
 * Clones an array, returning a new handle with the same size and data. This should NOT
ferret99gt@1664
    84
 * be confused with CloneHandle. This is a completely new handle with the same data but
ferret99gt@1664
    85
 * no relation to the original. You MUST close it.
ferret99gt@1664
    86
 *
ferret99gt@1664
    87
 * @param array			Array handle to be cloned
ferret99gt@1664
    88
 * @return			New handle to the cloned array object
ferret99gt@1664
    89
 * @error			Invalid Handle
ferret99gt@1664
    90
 */
ferret99gt@1664
    91
 native Handle:CloneArray(Handle:array);
ferret99gt@1664
    92
ferret99gt@1664
    93
/**
dvander@1156
    94
 * Resizes an array.  If the size is smaller than the current size,
dvander@1156
    95
 * the array is truncated.
dvander@1156
    96
 *
dvander@1156
    97
 * @param array			Array Handle.
dvander@1156
    98
 * @param newsize		New size.
dvander@1156
    99
 * @noreturn
dvander@1156
   100
 * @error				Invalid Handle or out of memory.
dvander@1156
   101
 */
dvander@1156
   102
native bool:ResizeArray(Handle:array, newsize);
dvander@1156
   103
dvander@1156
   104
/**
dvander@1156
   105
 * Returns the array size.
dvander@1156
   106
 *
dvander@1156
   107
 * @param array			Array Handle.
dvander@1156
   108
 * @return				Number of elements in the array.
dvander@1156
   109
 * @error				Invalid Handle.
dvander@1156
   110
 */
dvander@1156
   111
native GetArraySize(Handle:array);
dvander@1156
   112
dvander@1156
   113
/**
dvander@1156
   114
 * Pushes a value onto the end of an array, adding a new index.
dvander@1156
   115
 *
dvander@1156
   116
 * This may safely be used even if the array has a blocksize
dvander@1156
   117
 * greater than 1.
dvander@1156
   118
 *
dvander@1156
   119
 * @param array			Array Handle.
dvander@1156
   120
 * @param value			Value to push.
dvander@1156
   121
 * @return				Index of the new entry.
dvander@1156
   122
 * @error				Invalid Handle or out of memory.
dvander@1156
   123
 */
dvander@1156
   124
native PushArrayCell(Handle:array, any:value);
dvander@1156
   125
dvander@1156
   126
/**
dvander@1156
   127
 * Pushes a string onto the end of an array, truncating it
dvander@1156
   128
 * if it is too big.
dvander@1156
   129
 *
dvander@1156
   130
 * @param array			Array Handle.
dvander@1156
   131
 * @param value			String to push.
dvander@1156
   132
 * @return				Index of the new entry.
dvander@1156
   133
 * @error				Invalid Handle or out of memory.
dvander@1156
   134
 */
dvander@1156
   135
native PushArrayString(Handle:array, const String:value[]);
dvander@1156
   136
dvander@1156
   137
/**
dvander@1156
   138
 * Pushes an array of cells onto the end of an array.  The cells
dvander@1156
   139
 * are pushed as a block (i.e. the entire array sits at the index),
dvander@1156
   140
 * rather than pushing each cell individually.
dvander@1156
   141
 *
dvander@1156
   142
 * @param array			Array Handle.
dvander@1156
   143
 * @param values		Block of values to copy.
dvander@1156
   144
 * @param size			If not set, the number of elements copied from the array
dvander@1156
   145
 *						will be equal to the blocksize.  If set higher than the 
dvander@1156
   146
 *						blocksize, the operation will be truncated.
dvander@1156
   147
 * @return				Index of the new entry.
dvander@1156
   148
 * @error				Invalid Handle or out of memory.
dvander@1156
   149
 */
dvander@1156
   150
native PushArrayArray(Handle:array, const values[], size=-1);
dvander@1156
   151
dvander@1156
   152
/**
dvander@1156
   153
 * Retrieves a cell value from an array.
dvander@1156
   154
 *
dvander@1156
   155
 * @param array			Array Handle.
dvander@1156
   156
 * @param index			Index in the array.
dvander@1156
   157
 * @param block			Optionally specify which block to read from
dvander@1156
   158
 *						(useful if the blocksize > 0).
dvander@1156
   159
 * @param asChar		Optionally read as a byte instead of a cell.
dvander@1156
   160
 * @return				Value read.
dvander@1156
   161
 * @error				Invalid Handle, invalid index, or invalid block.
dvander@1156
   162
 */
dvander@1156
   163
native any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false);
dvander@1156
   164
dvander@1156
   165
/**
dvander@1156
   166
 * Retrieves a string value from an array.
dvander@1156
   167
 *
dvander@1156
   168
 * @param array			Array Handle.
dvander@1156
   169
 * @param index			Index in the array.
dvander@1156
   170
 * @param buffer		Buffer to copy to.
dvander@1156
   171
 * @param maxlength		Maximum size of the buffer.
dvander@1156
   172
 * @return				Number of characters copied.
dvander@1156
   173
 * @error				Invalid Handle or invalid index.
dvander@1156
   174
 */
dvander@1156
   175
native GetArrayString(Handle:array, index, String:buffer[], maxlength);
dvander@1156
   176
dvander@1156
   177
/**
dvander@1156
   178
 * Retrieves an array of cells from an array.
dvander@1156
   179
 *
dvander@1156
   180
 * @param array			Array Handle.
dvander@1156
   181
 * @param index			Index in the array.
dvander@1156
   182
 * @param buffer		Buffer to store the array in.
dvander@1156
   183
 * @param size			If not set, assumes the buffer size is equal to the
dvander@1156
   184
 *						blocksize.  Otherwise, the size passed is used.
dvander@1156
   185
 * @return				Number of cells copied.
dvander@1156
   186
 * @error				Invalid Handle or invalid index.
dvander@1156
   187
 */
dvander@1156
   188
native GetArrayArray(Handle:array, index, buffer[], size=-1);
dvander@1156
   189
dvander@1156
   190
/**
dvander@1156
   191
 * Sets a cell value in an array.
dvander@1156
   192
 *
dvander@1156
   193
 * @param array			Array Handle.
dvander@1156
   194
 * @param index			Index in the array.
dvander@1156
   195
 * @param value			Cell value to set.
dvander@1156
   196
 * @param block			Optionally specify which block to write to
dvander@1156
   197
 *						(useful if the blocksize > 0).
dvander@1156
   198
 * @param asChar		Optionally set as a byte instead of a cell.
dvander@1156
   199
 * @noreturn
dvander@1156
   200
 * @error				Invalid Handle, invalid index, or invalid block.
dvander@1156
   201
 */
dvander@1156
   202
native any:SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false);
dvander@1156
   203
dvander@1156
   204
/**
dvander@1156
   205
 * Sets a string value in an array.
dvander@1156
   206
 *
dvander@1156
   207
 * @param array			Array Handle.
dvander@1156
   208
 * @param index			Index in the array.
dvander@1156
   209
 * @param value			String value to set.
dvander@1156
   210
 * @return				Number of characters copied.
dvander@1156
   211
 * @error				Invalid Handle or invalid index.
dvander@1156
   212
 */
dvander@1156
   213
native SetArrayString(Handle:array, index, const String:buffer[]);
dvander@1156
   214
dvander@1156
   215
/**
dvander@1156
   216
 * Sets an array of cells in an array.
dvander@1156
   217
 *
dvander@1156
   218
 * @param array			Array Handle.
dvander@1156
   219
 * @param index			Index in the array.
dvander@1156
   220
 * @param buffer		Array to copy.
dvander@1156
   221
 * @param size			If not set, assumes the buffer size is equal to the
dvander@1156
   222
 *						blocksize.  Otherwise, the size passed is used.
dvander@1156
   223
 * @return				Number of cells copied.
dvander@1156
   224
 * @error				Invalid Handle or invalid index.
dvander@1156
   225
 */
dvander@1156
   226
native SetArrayArray(Handle:array, index, const values[], size=-1);
dvander@1156
   227
dvander@1156
   228
/**
dvander@1156
   229
 * Shifts an array up.  All array contents after and including the given 
dvander@1156
   230
 * index are shifted up by one, and the given index is then "free."  
dvander@1156
   231
 * After shifting, the contents of the given index is undefined.
dvander@1156
   232
 *
dvander@1156
   233
 * @param array			Array Handle.
dvander@1156
   234
 * @param index			Index in the array to shift up from.
dvander@1156
   235
 * @noreturn
dvander@1156
   236
 * @error				Invalid Handle or invalid index.
dvander@1156
   237
 */
dvander@1156
   238
native ShiftArrayUp(Handle:array, index);
dvander@1156
   239
dvander@1156
   240
/**
dvander@1156
   241
 * Removes an array index, shifting the entire array down from that position 
dvander@1156
   242
 * on.  For example, if item 8 of 10 is removed, the last 3 items will then be
dvander@1156
   243
 * (6,7,8) instead of (7,8,9), and all indexes before 8 will remain unchanged.
dvander@1156
   244
 *
dvander@1156
   245
 * @param array			Array Handle.
dvander@1156
   246
 * @param index			Index in the array to remove at.
dvander@1156
   247
 * @noreturn
dvander@1156
   248
 * @error				Invalid Handle or invalid index.
dvander@1156
   249
 */
dvander@1156
   250
native RemoveFromArray(Handle:array, index);
dvander@1156
   251
dvander@1156
   252
/**
dvander@1156
   253
 * Swaps two items in the array.
dvander@1156
   254
 *
dvander@1156
   255
 * @param array			Array Handle.
dvander@1156
   256
 * @param index1		First index.
dvander@1156
   257
 * @param index2		Second index.
dvander@1156
   258
 * @noreturn
dvander@1156
   259
 * @error				Invalid Handle or invalid index.
dvander@1156
   260
 */
dvander@1156
   261
native SwapArrayItems(Handle:array, index1, index2);
ferret99gt@1451
   262
ferret99gt@1451
   263
/**
ferret99gt@1664
   264
 * Returns the index for the first occurance of the provided string. If the string
ferret99gt@1664
   265
 * cannot be located, -1 will be returned.
ferret99gt@1451
   266
 *
ferret99gt@1451
   267
 * @param array			Array Handle.
ferret99gt@1451
   268
 * @param item			String to search for
dvander@1683
   269
 * @return				Array index, or -1 on failure
dvander@1683
   270
 * @error				Invalid Handle
ferret99gt@1451
   271
 */
ferret99gt@1664
   272
native FindStringInArray(Handle:array, const String:item[]);
ferret99gt@1664
   273
 
ferret99gt@1664
   274
/**
ferret99gt@1664
   275
 * Returns the index for the first occurance of the provided value. If the value
ferret99gt@1664
   276
 * cannot be located, -1 will be returned.
ferret99gt@1664
   277
 *
ferret99gt@1664
   278
 * @param array			Array Handle.
ferret99gt@1664
   279
 * @param item			Value to search for
dvander@1683
   280
 * @return				Array index, or -1 on failure
dvander@1683
   281
 * @error				Invalid Handle
ferret99gt@1664
   282
 */
ferret99gt@1664
   283
native FindValueInArray(Handle:array, item); 
ferret99gt@1664
   284
ferret99gt@1664
   285
/**
ferret99gt@1664
   286
 * Backwards compatible stock - Use FindStringInArray()
ferret99gt@1664
   287
 * @deprecated		Replaced by FindStringInArray()
ferret99gt@1664
   288
 */
ferret99gt@1664
   289
#pragma deprecated Use FindStringInArray() instead
ferret99gt@1451
   290
stock bool:IsStringInArray(Handle:array, const String:item[])
ferret99gt@1451
   291
{
ferret99gt@1664
   292
	return (FindStringInArray(array, item) != -1);
dvander@1683
   293
}