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_