plugins/include/adt_array.inc
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1156 a80f4ebe389f
child 1451 14d1cc64bd78
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

(This day shall henceforth be known as the Eighty Column Massacre of '07)
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
/**
dvander@1156
    83
 * Resizes an array.  If the size is smaller than the current size,
dvander@1156
    84
 * the array is truncated.
dvander@1156
    85
 *
dvander@1156
    86
 * @param array			Array Handle.
dvander@1156
    87
 * @param newsize		New size.
dvander@1156
    88
 * @noreturn
dvander@1156
    89
 * @error				Invalid Handle or out of memory.
dvander@1156
    90
 */
dvander@1156
    91
native bool:ResizeArray(Handle:array, newsize);
dvander@1156
    92
dvander@1156
    93
/**
dvander@1156
    94
 * Returns the array size.
dvander@1156
    95
 *
dvander@1156
    96
 * @param array			Array Handle.
dvander@1156
    97
 * @return				Number of elements in the array.
dvander@1156
    98
 * @error				Invalid Handle.
dvander@1156
    99
 */
dvander@1156
   100
native GetArraySize(Handle:array);
dvander@1156
   101
dvander@1156
   102
/**
dvander@1156
   103
 * Pushes a value onto the end of an array, adding a new index.
dvander@1156
   104
 *
dvander@1156
   105
 * This may safely be used even if the array has a blocksize
dvander@1156
   106
 * greater than 1.
dvander@1156
   107
 *
dvander@1156
   108
 * @param array			Array Handle.
dvander@1156
   109
 * @param value			Value to push.
dvander@1156
   110
 * @return				Index of the new entry.
dvander@1156
   111
 * @error				Invalid Handle or out of memory.
dvander@1156
   112
 */
dvander@1156
   113
native PushArrayCell(Handle:array, any:value);
dvander@1156
   114
dvander@1156
   115
/**
dvander@1156
   116
 * Pushes a string onto the end of an array, truncating it
dvander@1156
   117
 * if it is too big.
dvander@1156
   118
 *
dvander@1156
   119
 * @param array			Array Handle.
dvander@1156
   120
 * @param value			String 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 PushArrayString(Handle:array, const String:value[]);
dvander@1156
   125
dvander@1156
   126
/**
dvander@1156
   127
 * Pushes an array of cells onto the end of an array.  The cells
dvander@1156
   128
 * are pushed as a block (i.e. the entire array sits at the index),
dvander@1156
   129
 * rather than pushing each cell individually.
dvander@1156
   130
 *
dvander@1156
   131
 * @param array			Array Handle.
dvander@1156
   132
 * @param values		Block of values to copy.
dvander@1156
   133
 * @param size			If not set, the number of elements copied from the array
dvander@1156
   134
 *						will be equal to the blocksize.  If set higher than the 
dvander@1156
   135
 *						blocksize, the operation will be truncated.
dvander@1156
   136
 * @return				Index of the new entry.
dvander@1156
   137
 * @error				Invalid Handle or out of memory.
dvander@1156
   138
 */
dvander@1156
   139
native PushArrayArray(Handle:array, const values[], size=-1);
dvander@1156
   140
dvander@1156
   141
/**
dvander@1156
   142
 * Retrieves a cell value from an array.
dvander@1156
   143
 *
dvander@1156
   144
 * @param array			Array Handle.
dvander@1156
   145
 * @param index			Index in the array.
dvander@1156
   146
 * @param block			Optionally specify which block to read from
dvander@1156
   147
 *						(useful if the blocksize > 0).
dvander@1156
   148
 * @param asChar		Optionally read as a byte instead of a cell.
dvander@1156
   149
 * @return				Value read.
dvander@1156
   150
 * @error				Invalid Handle, invalid index, or invalid block.
dvander@1156
   151
 */
dvander@1156
   152
native any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false);
dvander@1156
   153
dvander@1156
   154
/**
dvander@1156
   155
 * Retrieves a string value from an array.
dvander@1156
   156
 *
dvander@1156
   157
 * @param array			Array Handle.
dvander@1156
   158
 * @param index			Index in the array.
dvander@1156
   159
 * @param buffer		Buffer to copy to.
dvander@1156
   160
 * @param maxlength		Maximum size of the buffer.
dvander@1156
   161
 * @return				Number of characters copied.
dvander@1156
   162
 * @error				Invalid Handle or invalid index.
dvander@1156
   163
 */
dvander@1156
   164
native GetArrayString(Handle:array, index, String:buffer[], maxlength);
dvander@1156
   165
dvander@1156
   166
/**
dvander@1156
   167
 * Retrieves an array of cells from an array.
dvander@1156
   168
 *
dvander@1156
   169
 * @param array			Array Handle.
dvander@1156
   170
 * @param index			Index in the array.
dvander@1156
   171
 * @param buffer		Buffer to store the array in.
dvander@1156
   172
 * @param size			If not set, assumes the buffer size is equal to the
dvander@1156
   173
 *						blocksize.  Otherwise, the size passed is used.
dvander@1156
   174
 * @return				Number of cells copied.
dvander@1156
   175
 * @error				Invalid Handle or invalid index.
dvander@1156
   176
 */
dvander@1156
   177
native GetArrayArray(Handle:array, index, buffer[], size=-1);
dvander@1156
   178
dvander@1156
   179
/**
dvander@1156
   180
 * Sets a cell value in an array.
dvander@1156
   181
 *
dvander@1156
   182
 * @param array			Array Handle.
dvander@1156
   183
 * @param index			Index in the array.
dvander@1156
   184
 * @param value			Cell value to set.
dvander@1156
   185
 * @param block			Optionally specify which block to write to
dvander@1156
   186
 *						(useful if the blocksize > 0).
dvander@1156
   187
 * @param asChar		Optionally set as a byte instead of a cell.
dvander@1156
   188
 * @noreturn
dvander@1156
   189
 * @error				Invalid Handle, invalid index, or invalid block.
dvander@1156
   190
 */
dvander@1156
   191
native any:SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false);
dvander@1156
   192
dvander@1156
   193
/**
dvander@1156
   194
 * Sets a string value in an array.
dvander@1156
   195
 *
dvander@1156
   196
 * @param array			Array Handle.
dvander@1156
   197
 * @param index			Index in the array.
dvander@1156
   198
 * @param value			String value to set.
dvander@1156
   199
 * @return				Number of characters copied.
dvander@1156
   200
 * @error				Invalid Handle or invalid index.
dvander@1156
   201
 */
dvander@1156
   202
native SetArrayString(Handle:array, index, const String:buffer[]);
dvander@1156
   203
dvander@1156
   204
/**
dvander@1156
   205
 * Sets an array of cells 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 buffer		Array to copy.
dvander@1156
   210
 * @param size			If not set, assumes the buffer size is equal to the
dvander@1156
   211
 *						blocksize.  Otherwise, the size passed is used.
dvander@1156
   212
 * @return				Number of cells copied.
dvander@1156
   213
 * @error				Invalid Handle or invalid index.
dvander@1156
   214
 */
dvander@1156
   215
native SetArrayArray(Handle:array, index, const values[], size=-1);
dvander@1156
   216
dvander@1156
   217
/**
dvander@1156
   218
 * Shifts an array up.  All array contents after and including the given 
dvander@1156
   219
 * index are shifted up by one, and the given index is then "free."  
dvander@1156
   220
 * After shifting, the contents of the given index is undefined.
dvander@1156
   221
 *
dvander@1156
   222
 * @param array			Array Handle.
dvander@1156
   223
 * @param index			Index in the array to shift up from.
dvander@1156
   224
 * @noreturn
dvander@1156
   225
 * @error				Invalid Handle or invalid index.
dvander@1156
   226
 */
dvander@1156
   227
native ShiftArrayUp(Handle:array, index);
dvander@1156
   228
dvander@1156
   229
/**
dvander@1156
   230
 * Removes an array index, shifting the entire array down from that position 
dvander@1156
   231
 * on.  For example, if item 8 of 10 is removed, the last 3 items will then be
dvander@1156
   232
 * (6,7,8) instead of (7,8,9), and all indexes before 8 will remain unchanged.
dvander@1156
   233
 *
dvander@1156
   234
 * @param array			Array Handle.
dvander@1156
   235
 * @param index			Index in the array to remove at.
dvander@1156
   236
 * @noreturn
dvander@1156
   237
 * @error				Invalid Handle or invalid index.
dvander@1156
   238
 */
dvander@1156
   239
native RemoveFromArray(Handle:array, index);
dvander@1156
   240
dvander@1156
   241
/**
dvander@1156
   242
 * Swaps two items in the array.
dvander@1156
   243
 *
dvander@1156
   244
 * @param array			Array Handle.
dvander@1156
   245
 * @param index1		First index.
dvander@1156
   246
 * @param index2		Second index.
dvander@1156
   247
 * @noreturn
dvander@1156
   248
 * @error				Invalid Handle or invalid index.
dvander@1156
   249
 */
dvander@1156
   250
native SwapArrayItems(Handle:array, index1, index2);