diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-06-09 11:34:21 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-06-09 13:44:59 -0700 |
| commit | fcf83dbf9effab3bd98bad2b83b2468b7eb05cfd (patch) | |
| tree | 41047c94883b86ec085a81597391ce3ef557cd43 /source/core/func.h | |
| parent | 52e8d4b9a27ab0060f874c3a63ab531847be35c0 (diff) | |
Initial import of code.
Diffstat (limited to 'source/core/func.h')
| -rw-r--r-- | source/core/func.h | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/source/core/func.h b/source/core/func.h new file mode 100644 index 000000000..8ec2ba8a5 --- /dev/null +++ b/source/core/func.h @@ -0,0 +1,216 @@ +#ifndef CORELIB_FUNC_H +#define CORELIB_FUNC_H + +#if 0 + +#include "SmartPointer.h" + +namespace CoreLib +{ + namespace Basic + { + template<typename TResult, typename... Arguments> + class FuncPtr + { + public: + virtual TResult operator()(Arguments...) = 0; + virtual bool operator == (const FuncPtr<TResult, Arguments...> *) + { + return false; + } + virtual ~FuncPtr() {} + }; + + template<typename TResult, typename... Arguments> + class CdeclFuncPtr : public FuncPtr<TResult, Arguments...> + { + public: + typedef TResult (*FuncType)(Arguments...); + private: + FuncType funcPtr; + public: + CdeclFuncPtr(FuncType func) + :funcPtr(func) + { + } + + virtual TResult operator()(Arguments... params) override + { + return funcPtr(params...); + } + + virtual bool operator == (const FuncPtr<TResult, Arguments...> * ptr) override + { + auto cptr = dynamic_cast<const CdeclFuncPtr<TResult, Arguments...>*>(ptr); + if (cptr) + return funcPtr == cptr->funcPtr; + else + return false; + } + }; + + template<typename Class, typename TResult, typename... Arguments> + class MemberFuncPtr : public FuncPtr<TResult, Arguments...> + { + public: + typedef TResult (Class::*FuncType)(Arguments...); + private: + FuncType funcPtr; + Class * object; + public: + MemberFuncPtr(Class * obj, FuncType func) + : funcPtr(func), object(obj) + { + } + + virtual TResult operator()(Arguments... params) override + { + return (object->*funcPtr)(params...); + } + + virtual bool operator == (const FuncPtr<TResult, Arguments...> * ptr) override + { + auto cptr = dynamic_cast<const MemberFuncPtr<Class, TResult, Arguments...>*>(ptr); + if (cptr) + return funcPtr == cptr->funcPtr && object == cptr->object; + else + return false; + } + }; + + template<typename F, typename TResult, typename... Arguments> + class LambdaFuncPtr : public FuncPtr<TResult, Arguments...> + { + private: + F func; + public: + LambdaFuncPtr(const F & _func) + : func(_func) + {} + virtual TResult operator()(Arguments... params) override + { + return func(params...); + } + virtual bool operator == (const FuncPtr<TResult, Arguments...> * /*ptr*/) override + { + return false; + } + }; + + template<typename TResult, typename... Arguments> + class Func + { + private: + RefPtr<FuncPtr<TResult, Arguments...>> funcPtr; + public: + Func(){} + Func(typename CdeclFuncPtr<TResult, Arguments...>::FuncType func) + { + funcPtr = new CdeclFuncPtr<TResult, Arguments...>(func); + } + template<typename Class> + Func(Class * object, typename MemberFuncPtr<Class, TResult, Arguments...>::FuncType func) + { + funcPtr = new MemberFuncPtr<Class, TResult, Arguments...>(object, func); + } + template<typename TFuncObj> + Func(const TFuncObj & func) + { + funcPtr = new LambdaFuncPtr<TFuncObj, TResult, Arguments...>(func); + } + Func & operator = (typename CdeclFuncPtr<TResult, Arguments...>::FuncType func) + { + funcPtr = new CdeclFuncPtr<TResult, Arguments...>(func); + return *this; + } + template<typename Class> + Func & operator = (const MemberFuncPtr<Class, TResult, Arguments...> & func) + { + funcPtr = new MemberFuncPtr<Class, TResult, Arguments...>(func); + return *this; + } + template<typename TFuncObj> + Func & operator = (const TFuncObj & func) + { + funcPtr = new LambdaFuncPtr<TFuncObj, TResult, Arguments...>(func); + return *this; + } + bool operator == (const Func & f) + { + return *funcPtr == f.funcPtr.Ptr(); + } + bool operator != (const Func & f) + { + return !(*this == f); + } + TResult operator()(Arguments... params) + { + return (*funcPtr)(params...); + } + }; + + // template<typename... Arguments> + // using Procedure = Func<void, Arguments...>; + + template<typename... Arguments> + class Procedure : public Func<void, Arguments...> + { + private: + RefPtr<FuncPtr<void, Arguments...>> funcPtr; + public: + Procedure(){} + Procedure(const Procedure & proc) + { + funcPtr = proc.funcPtr; + } + Procedure(typename CdeclFuncPtr<void, Arguments...>::FuncType func) + { + funcPtr = new CdeclFuncPtr<void, Arguments...>(func); + } + template<typename Class> + Procedure(Class * object, typename MemberFuncPtr<Class, void, Arguments...>::FuncType func) + { + funcPtr = new MemberFuncPtr<Class, void, Arguments...>(object, func); + } + template<typename TFuncObj> + Procedure(const TFuncObj & func) + { + funcPtr = new LambdaFuncPtr<TFuncObj, void, Arguments...>(func); + } + Procedure & operator = (typename CdeclFuncPtr<void, Arguments...>::FuncType func) + { + funcPtr = new CdeclFuncPtr<void, Arguments...>(func); + return *this; + } + template<typename Class> + Procedure & operator = (const MemberFuncPtr<Class, void, Arguments...> & func) + { + funcPtr = new MemberFuncPtr<Class, void, Arguments...>(func); + return *this; + } + template<typename TFuncObj> + Procedure & operator = (const TFuncObj & func) + { + funcPtr = new LambdaFuncPtr<TFuncObj, void, Arguments...>(func); + return *this; + } + Procedure & operator = (const Procedure & proc) + { + funcPtr = proc.funcPtr; + } + void Clear() + { + funcPtr = nullptr; + } + void operator()(Arguments... params) + { + if (funcPtr) + (*funcPtr)(params...); + } + }; + } +} + +#endif + +#endif
\ No newline at end of file |
