core/sm_memtable.h
author Asher Baker <asherkin@gmail.com>
Sun Aug 14 21:42:32 2011 +0100 (2011-08-14)
changeset 3367 18eb63085ca4
parent 3003 489c2b05a1b2
child 4096 1ed7fe4e8f7e
permissions -rw-r--r--
Added a reset argument to 'sm cvars' (bug 5043, r=psychonic).
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
ds@1947
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@370
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@370
    28
 *
dvander@370
    29
 * Version: $Id$
dvander@370
    30
 */
dvander@370
    31
dvander@203
    32
#ifndef _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
dvander@203
    33
#define _INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
dvander@203
    34
dvander@3003
    35
#include <stdlib.h>
dvander@3003
    36
#include <string.h>
dvander@3003
    37
dvander@203
    38
class BaseMemTable
dvander@203
    39
{
dvander@203
    40
public:
dvander@3003
    41
	BaseMemTable(unsigned int init_size)
dvander@3003
    42
	{
dvander@3003
    43
		membase = (unsigned char *)malloc(init_size);
dvander@3003
    44
		size = init_size;
dvander@3003
    45
		tail = 0;
dvander@3003
    46
	}
dvander@3003
    47
	~BaseMemTable()
dvander@3003
    48
	{
dvander@3003
    49
		free(membase);
dvander@3003
    50
		membase = NULL;
dvander@3003
    51
	}
dvander@203
    52
public:
dvander@203
    53
	/**
dvander@203
    54
	 * Allocates 'size' bytes of memory.
dvander@203
    55
	 * Optionally outputs the address through 'addr'.
dvander@203
    56
	 * Returns an index >= 0 on success, < 0 on failure.
dvander@203
    57
	 */
dvander@3003
    58
	int CreateMem(unsigned int addsize, void **addr)
dvander@3003
    59
	{
dvander@3003
    60
		int idx = (int)tail;
dvander@3003
    61
dvander@3003
    62
		while (tail + addsize >= size) {
dvander@3003
    63
			size *= 2;
dvander@3003
    64
			membase = (unsigned char *)realloc(membase, size);
dvander@3003
    65
		}
dvander@3003
    66
dvander@3003
    67
		tail += addsize;
dvander@3003
    68
		if (addr)
dvander@3003
    69
			*addr = (void *)&membase[idx];
dvander@3003
    70
dvander@3003
    71
		return idx;
dvander@3003
    72
	}
dvander@203
    73
dvander@203
    74
	/**
dvander@203
    75
	 * Given an index into the memory table, returns its address.
dvander@203
    76
	 * Returns NULL if invalid.
dvander@203
    77
	 */
dvander@3003
    78
	void *GetAddress(int index)
dvander@3003
    79
	{
dvander@3003
    80
		if (index < 0 || (unsigned int)index >= tail)
dvander@3003
    81
			return NULL;
dvander@3003
    82
		return &membase[index];
dvander@3003
    83
	}
dvander@203
    84
dvander@203
    85
	/**
dvander@203
    86
	 * Scraps the memory table.  For caching purposes, the memory 
dvander@203
    87
	 * is not freed, however subsequent calls to CreateMem() will 
dvander@203
    88
	 * begin at the first index again.
dvander@203
    89
	 */
dvander@3003
    90
	void Reset()
dvander@3003
    91
	{
dvander@3003
    92
		tail = 0;
dvander@3003
    93
	}
dvander@404
    94
dvander@1766
    95
	inline unsigned int GetMemUsage()
dvander@1766
    96
	{
dvander@1766
    97
		return size;
dvander@1766
    98
	}
dvander@404
    99
pred@2142
   100
	inline unsigned int GetActualMemUsed()
pred@2142
   101
	{
pred@2142
   102
		return tail;
pred@2142
   103
	}
pred@2142
   104
dvander@203
   105
private:
dvander@203
   106
	unsigned char *membase;
dvander@203
   107
	unsigned int size;
dvander@203
   108
	unsigned int tail;
dvander@203
   109
};
dvander@203
   110
dvander@203
   111
class BaseStringTable
dvander@203
   112
{
dvander@203
   113
public:
dvander@3003
   114
	BaseStringTable(unsigned int init_size) : m_table(init_size)
dvander@3003
   115
	{
dvander@3003
   116
	}
dvander@203
   117
public:
dvander@203
   118
	/** 
dvander@203
   119
	 * Adds a string to the string table and returns its index.
dvander@203
   120
	 */
dvander@3003
   121
	int AddString(const char *string)
dvander@3003
   122
	{
dvander@3003
   123
		size_t len = strlen(string) + 1;
dvander@3003
   124
		int idx;
dvander@3003
   125
		char *addr;
dvander@3003
   126
dvander@3003
   127
		idx = m_table.CreateMem(len, (void **)&addr);
dvander@3003
   128
		strcpy(addr, string);
dvander@3003
   129
dvander@3003
   130
		return idx;
dvander@3003
   131
	}
dvander@203
   132
dvander@203
   133
	/**
dvander@203
   134
	 * Given an index into the string table, returns the associated string.
dvander@203
   135
	 */
dvander@293
   136
	inline const char *GetString(int str)
dvander@293
   137
	{
dvander@293
   138
		return (const char *)m_table.GetAddress(str);
dvander@293
   139
	}
dvander@203
   140
dvander@203
   141
	/**
dvander@203
   142
	 * Scraps the string table.  For caching purposes, the memory
dvander@203
   143
	 * is not freed, however subsequent calls to AddString() will 
dvander@203
   144
	 * begin at the first index again.
dvander@203
   145
	 */
dvander@3003
   146
	void Reset()
dvander@3003
   147
	{
dvander@3003
   148
		m_table.Reset();
dvander@3003
   149
	}
dvander@203
   150
dvander@203
   151
	/**
dvander@203
   152
	 * Returns the parent BaseMemTable that this string table uses.
dvander@203
   153
	 */
dvander@203
   154
	inline BaseMemTable *GetMemTable()
dvander@203
   155
	{
dvander@203
   156
		return &m_table;
dvander@203
   157
	}
dvander@203
   158
private:
dvander@203
   159
	BaseMemTable m_table;
dvander@203
   160
};
dvander@203
   161
dvander@203
   162
#endif //_INCLUDE_SOURCEMOD_CORE_STRINGTABLE_H_
dvander@3003
   163