core/systems/ForwardSys.h
author Borja Ferrer <faluco@alliedmods.net>
Sun Feb 04 22:41:44 2007 +0000 (2007-02-04)
changeset 430 ed37e9767ed4
parent 370 d3a484f98f6d
child 464 765517f654a5
permissions -rw-r--r--
Optimized forwards, now paused functions are stored in a temp list so we dont have to check if they're runnable on each function execution.
dvander@370
     1
/**
dvander@370
     2
 * ===============================================================
dvander@370
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     4
 * ===============================================================
dvander@370
     5
 *
dvander@370
     6
 * This file is not open source and may not be copied without explicit
dvander@370
     7
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     8
 * in whole or significant part.
dvander@370
     9
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    10
 *
dvander@370
    11
 * Version: $Id$
dvander@370
    12
 */
dvander@370
    13
dvander@180
    14
#ifndef _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
    15
#define _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
    16
dvander@180
    17
#include <IForwardSys.h>
dvander@180
    18
#include <IPluginSys.h>
dvander@180
    19
#include "sm_globals.h"
dvander@180
    20
#include <sh_list.h>
dvander@180
    21
#include <sh_stack.h>
dvander@211
    22
#include "sourcemod.h"
dvander@180
    23
dvander@180
    24
using namespace SourceHook;
dvander@180
    25
dvander@180
    26
typedef List<IPluginFunction *>::iterator FuncIter;
dvander@180
    27
dvander@180
    28
//:TODO: a global name max define for sourcepawn, should mirror compiler's sNAMEMAX
dvander@180
    29
#define FORWARDS_NAME_MAX		64
dvander@180
    30
dvander@183
    31
struct ByrefInfo
dvander@180
    32
{
dvander@183
    33
	unsigned int cells;
dvander@183
    34
	cell_t *orig_addr;
dvander@183
    35
	int flags;
faluco@192
    36
	int sz_flags;
dvander@180
    37
};
dvander@180
    38
dvander@183
    39
struct FwdParamInfo
dvander@183
    40
{
dvander@183
    41
	cell_t val;
dvander@183
    42
	ByrefInfo byref;
dvander@183
    43
	ParamType pushedas;
dvander@183
    44
};
dvander@183
    45
dvander@183
    46
class CForward : public IChangeableForward
dvander@180
    47
{
dvander@180
    48
public: //ICallable
dvander@180
    49
	virtual int PushCell(cell_t cell);
dvander@180
    50
	virtual int PushCellByRef(cell_t *cell, int flags);
dvander@180
    51
	virtual int PushFloat(float number);
dvander@180
    52
	virtual int PushFloatByRef(float *number, int flags);
dvander@180
    53
	virtual int PushArray(cell_t *inarray, unsigned int cells, cell_t **phys_addr, int flags);
dvander@180
    54
	virtual int PushString(const char *string);
faluco@192
    55
	virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags);
dvander@180
    56
	virtual void Cancel();
dvander@180
    57
public: //IForward
faluco@430
    58
	virtual const char *GetForwardName() const;
faluco@430
    59
	virtual unsigned int GetFunctionCount() const;
faluco@430
    60
	virtual ExecType GetExecType() const;
dvander@180
    61
	virtual int Execute(cell_t *result, IForwardFilter *filter);
dvander@180
    62
public: //IChangeableForward
dvander@180
    63
	virtual bool RemoveFunction(IPluginFunction *func);
dvander@180
    64
	virtual unsigned int RemoveFunctionsOfPlugin(IPlugin *plugin);
dvander@180
    65
	virtual bool AddFunction(IPluginFunction *func);
dvander@327
    66
	virtual bool AddFunction(IPluginContext *ctx, funcid_t index);
dvander@180
    67
public:
dvander@180
    68
	static CForward *CreateForward(const char *name, 
dvander@180
    69
								   ExecType et, 
dvander@180
    70
								   unsigned int num_params, 
dvander@180
    71
								   ParamType *types, 
dvander@180
    72
								   va_list ap);
faluco@430
    73
	void PushPausedFunctions(IPlugin *plugin);
faluco@430
    74
	void PopPausedFunctions(IPlugin *plugin);
dvander@180
    75
private:
dvander@180
    76
	void _Int_PushArray(cell_t *inarray, unsigned int cells, int flags);
faluco@192
    77
	void _Int_PushString(cell_t *inarray, unsigned int cells, int sz_flags, int cp_flags);
dvander@180
    78
	inline int SetError(int err)
dvander@180
    79
	{
dvander@180
    80
		m_errstate = err;
dvander@180
    81
		return err;
dvander@180
    82
	}
dvander@180
    83
protected:
dvander@180
    84
	/* :TODO: I want a caching list type here.
dvander@180
    85
	 * Destroying these things and using new/delete for their members feels bad.
dvander@180
    86
	 */
dvander@180
    87
	List<IPluginFunction *> m_functions;
faluco@430
    88
	List<IPluginFunction *> m_paused;
dvander@180
    89
dvander@180
    90
	/* Type and name information */
dvander@183
    91
	FwdParamInfo m_params[SP_MAX_EXEC_PARAMS];
dvander@180
    92
	ParamType m_types[SP_MAX_EXEC_PARAMS];
dvander@180
    93
	char m_name[FORWARDS_NAME_MAX+1];
dvander@180
    94
	unsigned int m_numparams;
dvander@183
    95
	unsigned int m_varargs;
dvander@180
    96
	ExecType m_ExecType;
dvander@180
    97
dvander@180
    98
	/* State information */
dvander@180
    99
	unsigned int m_curparam;
dvander@180
   100
	int m_errstate;
dvander@180
   101
};
dvander@180
   102
dvander@211
   103
class CForwardManager : 
dvander@211
   104
	public IForwardManager,
dvander@211
   105
	public IPluginsListener,
dvander@211
   106
	public SMGlobalClass
dvander@186
   107
{
dvander@186
   108
	friend class CForward;
dvander@211
   109
public: //IForwardManager
faluco@430
   110
	IForward *CreateForward(const char *name, 
dvander@186
   111
		ExecType et, 
dvander@186
   112
		unsigned int num_params, 
dvander@186
   113
		ParamType *types, 
dvander@186
   114
		...);
faluco@430
   115
	IChangeableForward *CreateForwardEx(const char *name, 
dvander@186
   116
		ExecType et, 
dvander@186
   117
		int num_params, 
dvander@186
   118
		ParamType *types, 
dvander@186
   119
		...);
faluco@430
   120
	IForward *FindForward(const char *name, IChangeableForward **ifchng);
faluco@430
   121
	void ReleaseForward(IForward *forward);
dvander@211
   122
public: //IPluginsListener
faluco@430
   123
	void OnPluginLoaded(IPlugin *plugin);
faluco@430
   124
	void OnPluginUnloaded(IPlugin *plugin);
faluco@430
   125
	void OnPluginPauseChange(IPlugin *plugin, bool paused);
dvander@211
   126
public: //SMGlobalClass
faluco@430
   127
	void OnSourceModAllInitialized();
faluco@430
   128
	void OnSourceModShutdown();
dvander@186
   129
protected:
dvander@186
   130
	CForward *ForwardMake();
dvander@186
   131
	void ForwardFree(CForward *fwd);
dvander@186
   132
private:
dvander@186
   133
	CStack<CForward *> m_FreeForwards;
dvander@186
   134
	List<CForward *> m_managed;
dvander@186
   135
	List<CForward *> m_unmanaged;
dvander@186
   136
};
dvander@186
   137
dvander@186
   138
extern CForwardManager g_Forwards;
dvander@186
   139
dvander@180
   140
#endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_