yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
1#ifndef SLANG_CORE_FUNC_PTR_H 2#define SLANG_CORE_FUNC_PTR_H 3 4#include "slang-smart-pointer.h" 5 6namespace Slang 7{ 8 9template < typename TResult ,typename ...Arguments > 10class FuncPtr :public RefObject 11{ 12public : 13virtual TResult operator ()(Arguments ...)const = 0 ; 14virtual bool operator == (const FuncPtr < TResult ,Arguments ...>* ) {return false; } 15virtual FuncPtr < TResult ,Arguments ...>* clone ()= 0 ; 16virtual ~FuncPtr () {} 17}; 18 19template < typename TResult ,typename ...Arguments > 20class CdeclFuncPtr :public FuncPtr < TResult ,Arguments ...> 21{ 22public : 23typedef TResult (* FuncType )(Arguments ...); 24 25private : 26FuncType funcPtr ; 27 28public : 29CdeclFuncPtr (FuncType func ) 30 :funcPtr (func ) 31 { 32 } 33virtual FuncPtr < TResult ,Arguments ...>* clone ()override 34 { 35 autors = new CdeclFuncPtr < TResult ,Arguments ...> (funcPtr ); 36return rs ; 37 } 38 39virtual TResult operator ()(Arguments ...params )const override {return funcPtr (params ...); } 40 41virtual bool operator == (const FuncPtr < TResult ,Arguments ...>* ptr )override 42 { 43 autocptr = dynamic_cast < const CdeclFuncPtr < TResult, Arguments... >*> (ptr); 44if (cptr) 45return funcPtr == cptr -> funcPtr ; 46else 47return false; 48} 49}; 50 51template < typename Class, typename TResult, typename... Arguments > 52class MemberFuncPtr : public FuncPtr < TResult, Arguments... > 53{ 54public : 55typedef TResult ( Class :: * FuncType)( Arguments ...); 56 57private : 58FuncType funcPtr; 59Class * object; 60 61public : 62MemberFuncPtr (Class * obj, FuncType func) 63: funcPtr (func), object (obj) 64{ 65} 66virtual FuncPtr < TResult, Arguments... >* clone () override 67{ 68auto rs = new MemberFuncPtr < Class, TResult, Arguments... > (object, funcPtr); 69return rs; 70} 71virtual TResult operator ()( Arguments ... params) const override 72{ 73return (object ->* funcPtr )(params...); 74} 75 76virtual bool operator == ( const FuncPtr < TResult, Arguments... >* ptr) override 77{ 78auto cptr = dynamic_cast < const MemberFuncPtr < Class, TResult, Arguments... >*> (ptr); 79if (cptr) 80return funcPtr == cptr -> funcPtr && object == cptr -> object ; 81else 82return false; 83} 84}; 85 86template < typename F , typename TResult, typename... Arguments > 87class LambdaFuncPtr : public FuncPtr < TResult, Arguments... > 88{ 89private : 90F func; 91 92public : 93LambdaFuncPtr( const F & _func) 94: func ( _func ) 95{ 96} 97virtual TResult operator ()( Arguments ... params) const override { return func (params...); } 98virtual FuncPtr < TResult, Arguments... >* clone () override 99{ 100auto rs = new LambdaFuncPtr < F , TResult, Arguments... > (func); 101return rs; 102} 103virtual bool operator == ( const FuncPtr < TResult, Arguments... >* /*ptr*/ ) override 104{ 105return false; 106} 107}; 108 109template < typename TResult, typename... Arguments > 110class Func 111{ 112private : 113RefPtr < FuncPtr < TResult, Arguments...>> funcPtr; 114 115public : 116Func () {} 117Func( typename CdeclFuncPtr < TResult, Arguments... > :: FuncType func) 118{ 119funcPtr = new CdeclFuncPtr < TResult, Arguments... > (func); 120} 121template < typename Class > 122Func (Class * object, typename MemberFuncPtr < Class, TResult, Arguments... > ::FuncType func) 123{ 124funcPtr = new MemberFuncPtr < Class, TResult, Arguments... > (object, func); 125} 126template < typename TFuncObj > 127Func (const TFuncObj & func) 128{ 129funcPtr = new LambdaFuncPtr < TFuncObj, TResult, Arguments... > (func); 130} 131Func & operator = (typename CdeclFuncPtr < TResult, Arguments... > ::FuncType func ) 132{ 133funcPtr = new CdeclFuncPtr < TResult, Arguments... > (func); 134return * this; 135} 136template < typename Class > 137Func & operator = ( const MemberFuncPtr < Class, TResult, Arguments... >& func) 138{ 139funcPtr = new MemberFuncPtr < Class, TResult, Arguments... > (func); 140return * this; 141} 142template < typename TFuncObj > 143Func & operator = ( const TFuncObj & func) 144{ 145funcPtr = new LambdaFuncPtr < TFuncObj, TResult, Arguments... > (func); 146return * this; 147} 148bool operator == ( const Func & f) { return * funcPtr == f. funcPtr . Ptr (); } 149bool operator != ( const Func & f) { return !( * this == f); } 150TResult operator ()( Arguments ... params) const { return ( * funcPtr)(params...); } 151}; 152 153// template<typename... Arguments> 154// using Action = Func<void, Arguments...>; 155 156template < typename... Arguments > 157class Action : public Func < void , Arguments... > 158{ 159private : 160RefPtr < FuncPtr < void, Arguments...>> funcPtr; 161 162public : 163Action () {} 164Action( const Action & proc) { funcPtr = proc. funcPtr ; } 165Action( typename CdeclFuncPtr < void, Arguments... > :: FuncType func) 166{ 167funcPtr = new CdeclFuncPtr < void, Arguments... > (func); 168} 169template < typename Class > 170Action (Class * object, typename MemberFuncPtr < Class, void, Arguments... > ::FuncType func) 171{ 172funcPtr = new MemberFuncPtr < Class, void, Arguments... > (object, func); 173} 174template < typename TFuncObj > 175Action (const TFuncObj & func) 176{ 177funcPtr = new LambdaFuncPtr < TFuncObj, void, Arguments... > (func); 178} 179Action & operator = (typename CdeclFuncPtr < void, Arguments... > ::FuncType func ) 180{ 181funcPtr = new CdeclFuncPtr < void, Arguments... > (func); 182return * this; 183} 184template < typename Class > 185Action & operator = ( const MemberFuncPtr < Class, void, Arguments... >& func) 186{ 187funcPtr = new MemberFuncPtr < Class, void, Arguments... > (func); 188return * this; 189} 190template < typename TFuncObj > 191Action & operator = ( const TFuncObj & func) 192{ 193funcPtr = new LambdaFuncPtr < TFuncObj, void, Arguments... > (func); 194return * this; 195} 196Action & operator = ( const Action & proc) 197{ 198funcPtr = proc. funcPtr ; 199return * this; 200} 201void clear () { funcPtr = nullptr ; } 202void operator ()( Arguments ... params) const 203{ 204if (funcPtr) 205( * funcPtr)(params...); 206} 207}; 208 209} // namespace Slang 210 211#endif