added implementation to the forward manager
authorDavid Anderson <dvander@alliedmods.net>
Tue Nov 14 08:45:21 2006 +0000 (2006-11-14)
changeset 186eebc5de63141
parent 185 5e0987d38ee0
child 187 b93ea22fafe4
added implementation to the forward manager
core/interfaces/IForwardSys.h
core/systems/ForwardSys.cpp
core/systems/ForwardSys.h
     1.1 --- a/core/interfaces/IForwardSys.h	Mon Nov 13 13:55:44 2006 +0000
     1.2 +++ b/core/interfaces/IForwardSys.h	Tue Nov 14 08:45:21 2006 +0000
     1.3 @@ -99,6 +99,10 @@
     1.4  	class IForward : public ICallable
     1.5  	{
     1.6  	public:
     1.7 +		virtual ~IForward()
     1.8 +		{
     1.9 +		}
    1.10 +	public:
    1.11  		/**
    1.12  		 * @brief Returns the name of the forward.
    1.13  		 *
    1.14 @@ -271,6 +275,13 @@
    1.15  		 * @return				IForward pointer, or NULL if none found matching the name.
    1.16  		 */
    1.17  		virtual IForward *FindForward(const char *name, IChangeableForward **ifchng) =0;
    1.18 +
    1.19 +		/**
    1.20 +		 * @brief Frees and destroys a forward object.
    1.21 +		 *
    1.22 +		 * @param forward		An IForward created by CreateForward() or CreateForwardEx().
    1.23 +		 */
    1.24 +		virtual void ReleaseForward(IForward *forward) =0;
    1.25  	};
    1.26  };
    1.27  
     2.1 --- a/core/systems/ForwardSys.cpp	Mon Nov 13 13:55:44 2006 +0000
     2.2 +++ b/core/systems/ForwardSys.cpp	Tue Nov 14 08:45:21 2006 +0000
     2.3 @@ -2,6 +2,8 @@
     2.4  #include "ForwardSys.h"
     2.5  #include "PluginSys.h"
     2.6  
     2.7 +CForwardManager g_Forwards;
     2.8 +
     2.9  /**
    2.10   * Gensis turns to its source, reduction occurs stepwise although the essence is all one.
    2.11   * End of line.  FTL system check.
    2.12 @@ -12,7 +14,7 @@
    2.13   * NORMAL FUNCTIONS:
    2.14   * X Push cells
    2.15   * X Push cells byref (copyback tested = yes)
    2.16 - * - Push floats (copyback tested = ??)
    2.17 + * - Push floats
    2.18   * - Push floats byref (copyback tested = ??)
    2.19   * - Push arrays  (copyback tested = ??)
    2.20   * - Push strings (copyback tested = ??)
    2.21 @@ -26,6 +28,98 @@
    2.22   * - Push vararg strings (copyback tested = ??)
    2.23   */
    2.24  
    2.25 +IForward *CForwardManager::CreateForward(const char *name, ExecType et, unsigned int num_params, ParamType *types, ...)
    2.26 +{
    2.27 +	CForward *fwd;
    2.28 +	va_list ap;
    2.29 +	va_start(ap, types);
    2.30 +	
    2.31 +	fwd = CForward::CreateForward(name, et, num_params, types, ap);
    2.32 +
    2.33 +	va_end(ap);
    2.34 +
    2.35 +	return fwd;
    2.36 +}
    2.37 +
    2.38 +IChangeableForward *CForwardManager::CreateForwardEx(const char *name, ExecType et, int num_params, ParamType *types, ...)
    2.39 +{
    2.40 +	CForward *fwd;
    2.41 +	va_list ap;
    2.42 +	va_start(ap, types);
    2.43 +
    2.44 +	fwd = CForward::CreateForward(name, et, num_params, types, ap);
    2.45 +
    2.46 +	va_end(ap);
    2.47 +
    2.48 +	return fwd;
    2.49 +}
    2.50 +
    2.51 +IForward *CForwardManager::FindForward(const char *name, IChangeableForward **ifchng)
    2.52 +{
    2.53 +	List<CForward *>::iterator iter;
    2.54 +	CForward *fwd;
    2.55 +
    2.56 +	for (iter=m_managed.begin(); iter!=m_managed.end(); iter++)
    2.57 +	{
    2.58 +		fwd = (*iter);
    2.59 +		if (strcmp(fwd->GetForwardName(), name) == 0)
    2.60 +		{
    2.61 +			if (ifchng)
    2.62 +			{
    2.63 +				*ifchng = NULL;
    2.64 +			}
    2.65 +			return fwd;
    2.66 +		}
    2.67 +	}
    2.68 +
    2.69 +	for (iter=m_unmanaged.begin(); iter!=m_unmanaged.end(); iter++)
    2.70 +	{
    2.71 +		fwd = (*iter);
    2.72 +		if (strcmp(fwd->GetForwardName(), name) == 0)
    2.73 +		{
    2.74 +			if (ifchng)
    2.75 +			{
    2.76 +				*ifchng = fwd;
    2.77 +			}
    2.78 +			return fwd;
    2.79 +		}
    2.80 +	}
    2.81 +
    2.82 +	if (ifchng)
    2.83 +	{
    2.84 +		*ifchng = NULL;
    2.85 +	}
    2.86 +
    2.87 +	return NULL;
    2.88 +}
    2.89 +
    2.90 +void CForwardManager::ReleaseForward(IForward *forward)
    2.91 +{
    2.92 +	ForwardFree(static_cast<CForward *>(forward));
    2.93 +}
    2.94 +
    2.95 +void CForwardManager::ForwardFree(CForward *fwd)
    2.96 +{
    2.97 +	m_FreeForwards.push(fwd);
    2.98 +}
    2.99 +
   2.100 +CForward *CForwardManager::ForwardMake()
   2.101 +{
   2.102 +	CForward *fwd;
   2.103 +	if (m_FreeForwards.empty())
   2.104 +	{
   2.105 +		fwd = new CForward;
   2.106 +	} else {
   2.107 +		fwd = m_FreeForwards.front();
   2.108 +		m_FreeForwards.pop();
   2.109 +	}
   2.110 +	return fwd;
   2.111 +}
   2.112 +
   2.113 +/*************************************
   2.114 + * ACTUAL FORWARD API IMPLEMENTATION *
   2.115 + *************************************/
   2.116 +
   2.117  CForward *CForward::CreateForward(const char *name, ExecType et, unsigned int num_params, ParamType *types, va_list ap)
   2.118  {
   2.119  	ParamType _types[SP_MAX_EXEC_PARAMS];
   2.120 @@ -62,7 +156,7 @@
   2.121  		return NULL;
   2.122  	}
   2.123  
   2.124 -	CForward *pForward = new CForward;
   2.125 +	CForward *pForward = g_Forwards.ForwardMake();
   2.126  	pForward->m_curparam = 0;
   2.127  	pForward->m_ExecType = et;
   2.128  	snprintf(pForward->m_name, FORWARDS_NAME_MAX, "%s", name ? name : "");
     3.1 --- a/core/systems/ForwardSys.h	Mon Nov 13 13:55:44 2006 +0000
     3.2 +++ b/core/systems/ForwardSys.h	Tue Nov 14 08:45:21 2006 +0000
     3.3 @@ -81,4 +81,31 @@
     3.4  	int m_errstate;
     3.5  };
     3.6  
     3.7 +class CForwardManager : public IForwardManager
     3.8 +{
     3.9 +	friend class CForward;
    3.10 +public:
    3.11 +	virtual IForward *CreateForward(const char *name, 
    3.12 +		ExecType et, 
    3.13 +		unsigned int num_params, 
    3.14 +		ParamType *types, 
    3.15 +		...);
    3.16 +	virtual IChangeableForward *CreateForwardEx(const char *name, 
    3.17 +		ExecType et, 
    3.18 +		int num_params, 
    3.19 +		ParamType *types, 
    3.20 +		...);
    3.21 +	virtual IForward *FindForward(const char *name, IChangeableForward **ifchng);
    3.22 +	virtual void ReleaseForward(IForward *forward);
    3.23 +protected:
    3.24 +	CForward *ForwardMake();
    3.25 +	void ForwardFree(CForward *fwd);
    3.26 +private:
    3.27 +	CStack<CForward *> m_FreeForwards;
    3.28 +	List<CForward *> m_managed;
    3.29 +	List<CForward *> m_unmanaged;
    3.30 +};
    3.31 +
    3.32 +extern CForwardManager g_Forwards;
    3.33 +
    3.34  #endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_