core/systems/CFunction.h
author David Anderson <dvander@alliedmods.net>
Sun Nov 12 09:51:39 2006 +0000 (2006-11-12)
changeset 183 78488edd8873
parent 177 d29ade52d953
child 185 5e0987d38ee0
permissions -rw-r--r--
rewrote forward API to use cached parameter pushing instead of immediate pushing
removed copy back cruft since it's no longer needed
removed PushCells() from API requirements, not needed
adjusted documentation and added TODO list to ForwardSys.cpp
various internal improvements
dvander@177
     1
#ifndef _INCLUDE_SOURCEMOD_BASEFUNCTION_H_
dvander@177
     2
#define _INCLUDE_SOURCEMOD_BASEFUNCTION_H_
dvander@177
     3
dvander@177
     4
#include <IPluginFunction.h>
dvander@177
     5
#include "sm_globals.h"
dvander@177
     6
dvander@177
     7
struct ParamInfo
dvander@177
     8
{
dvander@177
     9
	int flags;			/* Copy-back flags */
dvander@177
    10
	bool marked;		/* Whether this is marked as being used */
dvander@177
    11
	cell_t local_addr;	/* Local address to free */
dvander@177
    12
	cell_t *phys_addr;	/* Physical address of our copy */
dvander@177
    13
	cell_t *orig_addr;	/* Original address to copy back to */
dvander@177
    14
	ucell_t size;		/* Size of array in cells */
dvander@177
    15
};
dvander@177
    16
dvander@177
    17
class CPlugin;
dvander@177
    18
dvander@177
    19
class CFunction : public IPluginFunction
dvander@177
    20
{
dvander@177
    21
public:
dvander@177
    22
	CFunction(funcid_t funcid, CPlugin *plugin);
dvander@177
    23
public:
dvander@177
    24
	virtual int PushCell(cell_t cell);
dvander@177
    25
	virtual int PushCellByRef(cell_t *cell, int flags);
dvander@177
    26
	virtual int PushFloat(float number);
dvander@177
    27
	virtual int PushFloatByRef(float *number, int flags);
dvander@177
    28
	virtual int PushCells(cell_t array[], unsigned int numcells, bool each);
dvander@177
    29
	virtual int PushArray(cell_t *inarray, unsigned int cells, cell_t **phys_addr, int copyback);
dvander@177
    30
	virtual int PushString(const char *string);
dvander@183
    31
	virtual int PushStringEx(char *string, int flags);
dvander@177
    32
	virtual cell_t *GetAddressOfPushedParam(unsigned int param);
dvander@183
    33
	virtual int Execute(cell_t *result);
dvander@177
    34
	virtual void Cancel();
dvander@177
    35
	virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result);
dvander@177
    36
	virtual IPlugin *GetParentPlugin();
dvander@177
    37
public:
dvander@177
    38
	void Set(funcid_t funcid, CPlugin *plugin);
dvander@177
    39
private:
dvander@177
    40
	int _PushString(const char *string, int flags);
dvander@177
    41
	inline int SetError(int err)
dvander@177
    42
	{
dvander@177
    43
		m_errorstate = err;
dvander@177
    44
		return err;
dvander@177
    45
	}
dvander@177
    46
private:
dvander@177
    47
	funcid_t m_funcid;
dvander@177
    48
	CPlugin *m_pPlugin;
dvander@177
    49
	cell_t m_params[SP_MAX_EXEC_PARAMS];
dvander@177
    50
	ParamInfo m_info[SP_MAX_EXEC_PARAMS];
dvander@177
    51
	unsigned int m_curparam;
dvander@177
    52
	int m_errorstate;
dvander@177
    53
};
dvander@177
    54
dvander@177
    55
#endif //_INCLUDE_SOURCEMOD_BASEFUNCTION_H_