VIP Boost Банери Кредити
Основно Начало Сървъри Marketplace Новини Форум Сървъри
Общности Хостинг Добави Boost
Ресурси
Библиотеки Карти Видеа Магазин
Инструменти
Builder Demo CFG HUD
AMXX API
Вход Регистрация
/ Библиотеки / hash.inc

hash.inc

cerberus.cstrike.in.ua/

.inc 3.6 KB 149 реда 04.04.2026
Pawn / AMX Mod X
/*
	Trie (Hash) abstraction layer
	by Zefir<[email protected]>
	developed for Cerberus project
	http://cerberus.cstrike.in.ua/
	12 jule 2009 (c) Zefir

	Big tnx Exolent :)
*/

#if defined _hash_included
  #endinput
#endif
#define _hash_included



// Default, builtin variant
//#define HASH_NATIVE

#if !defined HASH_NATIVE
	#define HASH_EMULATE
#endif


#if defined HASH_NATIVE
	#define Hash						Trie
	#define HashCreate()				TrieCreate()
	#define HashClear(%1)				TrieClear(%1)
	#define HashDestroy(%1)				TrieDestroy(%1)

	#define HashKeyExists(%1,%2)		TrieKeyExists(%1, %2)
	#define HashDeleteKey(%1,%2)		TrieDeleteKey(%1, %2)

	#define HashSetCell(%1,%2,%3)		TrieSetCell(%1, %2, %3)
	#define HashSetString(%1,%2,%3)		TrieSetString(%1, %2, %3)
	#define HashSetArray(%1,%2,%3,%4)	TrieSetArray(%1, %2, %3, %4)

	#define HashGetCell(%1,%2,%3)		TrieGetCell(%1, %2, %3)
	#define HashGetString(%1,%2,%3,%4)	TrieGetString(%1, %2, %3, %4)
	#define HashGetArray(%1,%2,%3,%4)	TrieGetArray(%1, %2, %3, %4)
#endif

#if defined HASH_EMULATE 
	#define Hash						Trie
	#define HashCreate()				TrieCreate()

	#define HashKeyExists(%1,%2)		TrieKeyExists(%1, %2)

	#define HashSetCell(%1,%2,%3)		TrieSetCell(%1, %2, %3)
	#define HashSetString(%1,%2,%3)		TrieSetString(%1, %2, %3)

	#define HashGetCell(%1,%2,%3)		TrieGetCell(%1, %2, %3)
	#define HashGetString(%1,%2,%3,%4)	TrieGetString(%1, %2, %3, %4)

stock HashClear(Hash:handle) {
	__HashDeleteAllKeys(handle)

	return TrieClear(handle)
}

stock HashDestroy(&Hash:handle) {
	__HashDeleteAllKeys(handle)

	return TrieDestroy(handle)
}

stock __HashDeleteAllKeys(Hash:handle) {
	if (!handle) return

	new Array:keys, Trie:pos
	if(TrieGetCell(handle, {10, 30, 'k', 0}, keys) && TrieGetCell(handle, {10, 30, 'p', 0}, pos)) {
		TrieDestroy(pos)

		new array_key[64], size = ArraySize(keys), Array:arr
		for(new i = 0; i < size; i++) {
			ArrayGetString(keys, i, array_key, charsmax(array_key))
			TrieGetCell(handle, array_key, arr)
			ArrayDestroy(arr)
		}

		ArrayDestroy(keys)
	}
}

stock bool:HashDeleteKey(Hash:handle, const key[]) {
	if(!handle || !TrieKeyExists(handle, key))
		return false

	new Array:keys, Trie:pos, index
	if(TrieGetCell(handle, {10, 30, 'k', 0}, keys)
	&& TrieGetCell(handle, {10, 30, 'p', 0}, pos)
	&& TrieGetCell(pos, key, index))
	{

		ArrayDeleteItem(keys, index)

		new array_key[64], size = ArraySize(keys)
		for(new i = index; i < size; i++) {
			ArrayGetString(keys, i, array_key, charsmax(array_key))
			TrieSetCell(pos, array_key, i)
		}

		new Array:arr
		TrieGetCell(handle, key, arr)
		ArrayDestroy(arr)
	}
	return TrieDeleteKey(handle, key)
}

stock HashSetArray(Hash:handle, const key[], const any:buffer[], size) {
	if (!handle) return false

	new Array:arr
	if (!TrieGetCell(handle, key, arr)) {
		arr = ArrayCreate(size, 1)
		ArrayPushArray(arr, buffer)

		new Array:keys, Trie:pos
		if(!TrieGetCell(handle, {10, 30, 'k', 0}, keys)) {
			keys = ArrayCreate(64)
			TrieSetCell(handle, {10, 30, 'k', 0}, keys)
		}
		if(!TrieGetCell(handle, {10, 30, 'p', 0}, pos)) {
			pos = TrieCreate()
			TrieSetCell(handle, {10, 30, 'p', 0}, pos)
		}

		new size = ArraySize(keys)
		ArrayPushString(keys, key)
		TrieSetCell(pos, key, size)
	} else
		ArraySetArray(arr, 0, buffer)

	return TrieSetCell(handle, key, arr)
}

stock bool:HashGetArray(Hash:handle, const key[], any:output[], outputsize) { 
	outputsize++
	new Array:arr

	if (!handle || !TrieGetCell(handle, key, arr))
		return false

	ArrayGetArray(arr, 0, output)

	return true
}
#endif
РЕКЛАМИРАЙ ПРИ НАС!
AMXX-BG.INFO
КАК ДА ИЗПОЛЗВАМ
Добави в началото на .sma файла:
#include <hash>
1. Изтегли
Свали файла от бутона по-горе
2. Копирай
Постави в scripting/include/
3. Включи
Добави #include директивата
4. Компилирай
Използвай amxxpc или scripting/compile.exe