mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2024-11-29 11:24:19 +01:00
1d9949e1a0
--HG-- rename : core-1.4/CPlugin.cpp => core-legacy/CPlugin.cpp rename : core-1.4/CPlugin.h => core-legacy/CPlugin.h rename : core-1.4/CSmmAPI.cpp => core-legacy/CSmmAPI.cpp rename : core-1.4/CSmmAPI.h => core-legacy/CSmmAPI.h rename : core-1.4/IPluginManager.h => core-legacy/IPluginManager.h rename : core-1.4/ISmmAPI.h => core-legacy/ISmmAPI.h rename : core-1.4/ISmmPlugin.h => core-legacy/ISmmPlugin.h rename : core-1.4/Makefile => core-legacy/Makefile rename : core-1.4/concommands.cpp => core-legacy/concommands.cpp rename : core-1.4/concommands.h => core-legacy/concommands.h rename : core-1.4/convar_smm.h => core-legacy/convar_smm.h rename : core-1.4/msvc7/sourcemm.sln => core-legacy/msvc7/sourcemm.sln rename : core-1.4/msvc7/sourcemm.vcproj => core-legacy/msvc7/sourcemm.vcproj rename : core-1.4/msvc8/sourcemm.sln => core-legacy/msvc8/sourcemm.sln rename : core-1.4/msvc8/sourcemm.vcproj => core-legacy/msvc8/sourcemm.vcproj rename : core-1.4/msvc9/sourcemm.sln => core-legacy/msvc9/sourcemm.sln rename : core-1.4/msvc9/sourcemm.vcproj => core-legacy/msvc9/sourcemm.vcproj rename : core-1.4/oslink.cpp => core-legacy/oslink.cpp rename : core-1.4/oslink.h => core-legacy/oslink.h rename : core-1.4/sourcehook.cpp => core-legacy/sourcehook.cpp rename : core-1.4/sourcehook/FastDelegate.h => core-legacy/sourcehook/FastDelegate.h rename : core-1.4/sourcehook/generate/FastDelegate.h => core-legacy/sourcehook/generate/FastDelegate.h rename : core-1.4/sourcehook/generate/FastDelegate.hxx => core-legacy/sourcehook/generate/FastDelegate.hxx rename : core-1.4/sourcehook/generate/generate => core-legacy/sourcehook/generate/generate rename : core-1.4/sourcehook/generate/generate.bat => core-legacy/sourcehook/generate/generate.bat rename : core-1.4/sourcehook/generate/sh_memfuncinfo.h => core-legacy/sourcehook/generate/sh_memfuncinfo.h rename : core-1.4/sourcehook/generate/sh_memfuncinfo.hxx => core-legacy/sourcehook/generate/sh_memfuncinfo.hxx rename : core-1.4/sourcehook/generate/shworker.bin => core-legacy/sourcehook/generate/shworker.bin rename : core-1.4/sourcehook/generate/shworker.exe => core-legacy/sourcehook/generate/shworker.exe rename : core-1.4/sourcehook/generate/shworker/Makefile => core-legacy/sourcehook/generate/shworker/Makefile rename : core-1.4/sourcehook/generate/shworker/fd_hopter.cpp => core-legacy/sourcehook/generate/shworker/fd_hopter.cpp rename : core-1.4/sourcehook/generate/shworker/msvc7/shworker.vcproj => core-legacy/sourcehook/generate/shworker/msvc7/shworker.vcproj rename : core-1.4/sourcehook/generate/shworker/msvc8/shworker.vcproj => core-legacy/sourcehook/generate/shworker/msvc8/shworker.vcproj rename : core-1.4/sourcehook/generate/shworker/shworker.cpp => core-legacy/sourcehook/generate/shworker/shworker.cpp rename : core-1.4/sourcehook/generate/sourcehook.h => core-legacy/sourcehook/generate/sourcehook.h rename : core-1.4/sourcehook/generate/sourcehook.hxx => core-legacy/sourcehook/generate/sourcehook.hxx rename : core-1.4/sourcehook/sh_list.h => core-legacy/sourcehook/sh_list.h rename : core-1.4/sourcehook/sh_memfuncinfo.h => core-legacy/sourcehook/sh_memfuncinfo.h rename : core-1.4/sourcehook/sh_memory.h => core-legacy/sourcehook/sh_memory.h rename : core-1.4/sourcehook/sh_stack.h => core-legacy/sourcehook/sh_stack.h rename : core-1.4/sourcehook/sh_string.h => core-legacy/sourcehook/sh_string.h rename : core-1.4/sourcehook/sh_tinyhash.h => core-legacy/sourcehook/sh_tinyhash.h rename : core-1.4/sourcehook/sh_vector.h => core-legacy/sourcehook/sh_vector.h rename : core-1.4/sourcehook/sourcehook.cpp => core-legacy/sourcehook/sourcehook.cpp rename : core-1.4/sourcehook/sourcehook.h => core-legacy/sourcehook/sourcehook.h rename : core-1.4/sourcehook/sourcehook_impl.h => core-legacy/sourcehook/sourcehook_impl.h rename : core-1.4/sourcehook/test/Makefile => core-legacy/sourcehook/test/Makefile rename : core-1.4/sourcehook/test/main.cpp => core-legacy/sourcehook/test/main.cpp rename : core-1.4/sourcehook/test/msvc7/test.vcproj => core-legacy/sourcehook/test/msvc7/test.vcproj rename : core-1.4/sourcehook/test/msvc8/test.vcproj => core-legacy/sourcehook/test/msvc8/test.vcproj rename : core-1.4/sourcehook/test/sourcehook_test.h => core-legacy/sourcehook/test/sourcehook_test.h rename : core-1.4/sourcehook/test/test1.cpp => core-legacy/sourcehook/test/test1.cpp rename : core-1.4/sourcehook/test/test2.cpp => core-legacy/sourcehook/test/test2.cpp rename : core-1.4/sourcehook/test/test3.cpp => core-legacy/sourcehook/test/test3.cpp rename : core-1.4/sourcehook/test/test4.cpp => core-legacy/sourcehook/test/test4.cpp rename : core-1.4/sourcehook/test/testbail.cpp => core-legacy/sourcehook/test/testbail.cpp rename : core-1.4/sourcehook/test/testbail.h => core-legacy/sourcehook/test/testbail.h rename : core-1.4/sourcehook/test/testbail2.cpp => core-legacy/sourcehook/test/testbail2.cpp rename : core-1.4/sourcehook/test/testevents.h => core-legacy/sourcehook/test/testevents.h rename : core-1.4/sourcehook/test/testlist.cpp => core-legacy/sourcehook/test/testlist.cpp rename : core-1.4/sourcehook/test/testmanual.cpp => core-legacy/sourcehook/test/testmanual.cpp rename : core-1.4/sourcehook/test/testmulti.cpp => core-legacy/sourcehook/test/testmulti.cpp rename : core-1.4/sourcehook/test/testrecall.cpp => core-legacy/sourcehook/test/testrecall.cpp rename : core-1.4/sourcehook/test/testreentr.cpp => core-legacy/sourcehook/test/testreentr.cpp rename : core-1.4/sourcehook/test/testref.cpp => core-legacy/sourcehook/test/testref.cpp rename : core-1.4/sourcehook/test/testrefret.cpp => core-legacy/sourcehook/test/testrefret.cpp rename : core-1.4/sourcemm.cpp => core-legacy/sourcemm.cpp rename : core-1.4/sourcemm.h => core-legacy/sourcemm.h rename : core-1.4/svn_version.h => core-legacy/svn_version.h rename : core-1.4/svn_version.tpl => core-legacy/svn_version.tpl rename : core-1.4/util.cpp => core-legacy/util.cpp rename : core-1.4/util.h => core-legacy/util.h rename : core-1.4/version.rc => core-legacy/version.rc rename : core-1.4/vsp_listener.cpp => core-legacy/vsp_listener.cpp rename : core-1.4/vsp_listener.h => core-legacy/vsp_listener.h
238 lines
4.1 KiB
C++
238 lines
4.1 KiB
C++
/* ======== SourceMM ========
|
|
* Copyright (C) 2004-2008 Metamod:Source Development Team
|
|
* No warranties of any kind
|
|
*
|
|
* License: zlib/libpng
|
|
*
|
|
* Author(s): Pavol "PM OnoTo" Marko
|
|
* ============================
|
|
*/
|
|
|
|
#ifndef __SH_STACK_H__
|
|
#define __SH_STACK_H__
|
|
|
|
#include <stddef.h>
|
|
|
|
#define SH_STACK_DEFAULT_SIZE 4
|
|
|
|
namespace SourceHook
|
|
{
|
|
// Vector
|
|
template <class T> class CStack
|
|
{
|
|
T *m_Elements;
|
|
size_t m_AllocatedSize;
|
|
size_t m_UsedSize;
|
|
public:
|
|
friend class iterator;
|
|
class iterator
|
|
{
|
|
CStack<T> *m_pParent;
|
|
size_t m_Index;
|
|
public:
|
|
iterator(CStack<T> *pParent, size_t id) : m_pParent(pParent), m_Index(id)
|
|
{
|
|
}
|
|
|
|
iterator(CStack<T> *pParent) : m_pParent(pParent), m_Index(0)
|
|
{
|
|
}
|
|
|
|
iterator() : m_pParent(NULL), m_Index(0)
|
|
{
|
|
}
|
|
|
|
T &operator *()
|
|
{
|
|
return m_pParent->m_Elements[m_Index];
|
|
}
|
|
const T &operator *() const
|
|
{
|
|
return m_pParent->m_Elements[m_Index];
|
|
}
|
|
|
|
T * operator->()
|
|
{
|
|
return m_pParent->m_Elements + m_Index;
|
|
}
|
|
|
|
const T * operator->() const
|
|
{
|
|
return m_pParent->m_Elements + m_Index;
|
|
}
|
|
|
|
iterator & operator++() // preincrement
|
|
{
|
|
++m_Index;
|
|
return (*this);
|
|
}
|
|
|
|
iterator operator++(int) // postincrement
|
|
{
|
|
iterator tmp = *this;
|
|
++m_Index;
|
|
return tmp;
|
|
}
|
|
|
|
iterator & operator--() // predecrement
|
|
{
|
|
--m_Index;
|
|
return (*this);
|
|
}
|
|
|
|
iterator operator--(int) // postdecrememnt
|
|
{
|
|
iterator tmp = *this;
|
|
--m_Index;
|
|
return tmp;
|
|
}
|
|
|
|
bool operator==(const iterator & right) const
|
|
{
|
|
return (m_pParent == right.m_pParent && m_Index == right.m_Index);
|
|
}
|
|
|
|
bool operator!=(const iterator & right) const
|
|
{
|
|
return !(*this == right);
|
|
}
|
|
};
|
|
CStack() : m_Elements(new T[SH_STACK_DEFAULT_SIZE]),
|
|
m_AllocatedSize(SH_STACK_DEFAULT_SIZE),
|
|
m_UsedSize(0)
|
|
{
|
|
}
|
|
CStack(size_t size) : m_Elements(new T[size]),
|
|
m_AllocatedSize(size),
|
|
m_UsedSize(0)
|
|
{
|
|
}
|
|
|
|
CStack(const CStack &other) : m_Elements(NULL),
|
|
m_AllocatedSize(0),
|
|
m_UsedSize(0)
|
|
{
|
|
reserve(other.m_AllocatedSize);
|
|
m_UsedSize = other.m_UsedSize;
|
|
for (size_t i = 0; i < m_UsedSize; ++i)
|
|
m_Elements[i] = other.m_Elements[i];
|
|
}
|
|
|
|
~CStack()
|
|
{
|
|
if (m_Elements)
|
|
delete [] m_Elements;
|
|
}
|
|
|
|
void operator=(const CStack &other)
|
|
{
|
|
if (m_AllocatedSize < other.m_AllocatedSize)
|
|
{
|
|
if (m_Elements)
|
|
delete [] m_Elements;
|
|
m_Elements = new T[other.m_AllocatedSize];
|
|
m_AllocatedSize = other.m_AllocatedSize;
|
|
}
|
|
m_UsedSize = other.m_UsedSize;
|
|
for (size_t i = 0; i < m_UsedSize; ++i)
|
|
m_Elements[i] = other.m_Elements[i];
|
|
}
|
|
|
|
bool push(const T &val)
|
|
{
|
|
if (m_UsedSize + 1 == m_AllocatedSize)
|
|
{
|
|
// zOHNOES! REALLOCATE!
|
|
m_AllocatedSize *= 2;
|
|
T *newElements = new T[m_AllocatedSize];
|
|
if (!newElements)
|
|
{
|
|
m_AllocatedSize /= 2;
|
|
return false;
|
|
}
|
|
if (m_Elements)
|
|
{
|
|
for (size_t i = 0; i < m_UsedSize; ++i)
|
|
newElements[i] = m_Elements[i];
|
|
delete [] m_Elements;
|
|
}
|
|
m_Elements = newElements;
|
|
}
|
|
m_Elements[m_UsedSize++] = val;
|
|
return true;
|
|
}
|
|
|
|
void pop()
|
|
{
|
|
--m_UsedSize;
|
|
}
|
|
|
|
void popall()
|
|
{
|
|
m_UsedSize = 0;
|
|
}
|
|
|
|
T &front()
|
|
{
|
|
return m_Elements[m_UsedSize - 1];
|
|
}
|
|
|
|
const T &front() const
|
|
{
|
|
return m_Elements[m_UsedSize - 1];
|
|
}
|
|
|
|
T &second()
|
|
{
|
|
return m_Elements[m_UsedSize - 2];
|
|
}
|
|
|
|
const T &second() const
|
|
{
|
|
return m_Elements[m_UsedSize - 2];
|
|
}
|
|
|
|
iterator begin()
|
|
{
|
|
return iterator(this, 0);
|
|
}
|
|
iterator end()
|
|
{
|
|
return iterator(this, m_UsedSize);
|
|
}
|
|
|
|
size_t size()
|
|
{
|
|
return m_UsedSize;
|
|
}
|
|
size_t capacity()
|
|
{
|
|
return m_AllocatedSize;
|
|
}
|
|
bool empty()
|
|
{
|
|
return m_UsedSize == 0 ? true : false;
|
|
}
|
|
bool reserve(size_t size)
|
|
{
|
|
if (size > m_AllocatedSize)
|
|
{
|
|
T *newElements = new T[size];
|
|
if (!newElements)
|
|
return false;
|
|
if (m_Elements)
|
|
{
|
|
for (size_t i = 0; i < m_UsedSize; ++i)
|
|
newElements[i] = m_Elements[i];
|
|
delete [] m_Elements;
|
|
}
|
|
m_Elements = newElements;
|
|
m_AllocatedSize = size;
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
}; //namespace SourceHook
|
|
|
|
#endif
|