bbdeclinfo.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. #ifndef BB_DECLINFO_H
  2. #define BB_DECLINFO_H
  3. #include "bbtypeinfo.h"
  4. #include "bbvariant.h"
  5. #define BB_DECL_PUBLIC 0x000001
  6. #define BB_DECL_PRIVATE 0x000002
  7. #define BB_DECL_PROTECTED 0x000004
  8. #define BB_DECL_INTERNAL 0x000008
  9. #define BB_DECL_VIRTUAL 0x000100
  10. #define BB_DECL_OVERRIDE 0x000200
  11. #define BB_DECL_ABSTRACT 0x000400
  12. #define BB_DECL_FINAL 0x000800
  13. #define BB_DECL_EXTERN 0x001000
  14. #define BB_DECL_EXTENSION 0x002000
  15. #define BB_DECL_DEFAULT 0x004000
  16. #define BB_DECL_GETTER 0x010000
  17. #define BB_DECL_SETTER 0x020000
  18. #define BB_DECL_OPERATOR 0x040000
  19. #define BB_DECL_IFACEMEMBER 0x080000
  20. #define BB_DECL_GETTABLE 0x10000000
  21. #define BB_DECL_SETTABLE 0x20000000
  22. #define BB_DECL_INVOKABLE 0x40000000
  23. struct bbDeclInfo{
  24. bbString name;
  25. bbString meta;
  26. bbString kind;
  27. bbTypeInfo *type;
  28. int flags=0;
  29. bbString getName(){
  30. return name;
  31. }
  32. bbString getKind(){
  33. return kind;
  34. }
  35. bbTypeInfo *getType(){
  36. return type;
  37. }
  38. bbBool gettable(){ return flags & BB_DECL_GETTABLE; }
  39. bbBool settable(){ return flags & BB_DECL_SETTABLE; }
  40. bbBool invokable(){ return flags & BB_DECL_INVOKABLE; }
  41. bbArray<bbString> getMetaKeys();
  42. bbArray<bbString> getMetaData();
  43. bbString getMetaValue( bbString key );
  44. virtual bbString toString();
  45. virtual bbVariant get( bbVariant instance );
  46. virtual void set( bbVariant instance,bbVariant value );
  47. virtual bbVariant invoke( bbVariant instance,bbArray<bbVariant> params );
  48. };
  49. /*
  50. // ***** Global *****
  51. //
  52. template<class T> struct bbGlobalDeclInfo : public bbDeclInfo{
  53. T *ptr;
  54. bbGlobalDeclInfo( bbString name,T *ptr,bbString meta,bool isconst ):ptr( ptr ){
  55. this->name=name;
  56. this->meta=meta;
  57. this->kind=isconst ? "Const" : "Global";
  58. this->type=bbGetType<T>();
  59. this->flags=BB_DECL_GETTABLE|(isconst ? 0 : BB_DECL_SETTABLE);
  60. }
  61. bbVariant get( bbVariant instance ){
  62. return bbVariant( *ptr );
  63. }
  64. void set( bbVariant instance,bbVariant value ){
  65. *ptr=value.get<T>();
  66. }
  67. };
  68. template<class T> struct bbGlobalVarDeclInfo : public bbDeclInfo{
  69. bbGCVar<T> *ptr;
  70. bbGlobalVarDeclInfo( bbString name,bbGCVar<T> *ptr,bbString meta,bool isconst ):ptr( ptr ){
  71. this->name=name;
  72. this->meta=meta;
  73. this->kind=isconst ? "Const" : "Global";
  74. this->type=bbGetType<T>();
  75. this->flags=BB_DECL_GETTABLE|(isconst ? 0 : BB_DECL_SETTABLE);
  76. }
  77. bbVariant get( bbVariant instance ){
  78. return bbVariant( ptr->get() );
  79. }
  80. void set( bbVariant instance,bbVariant value ){
  81. *ptr=value.get<T*>();
  82. }
  83. };
  84. template<class T> bbDeclInfo *bbGlobalDecl( bbString name,T *ptr,bbString meta="" ){
  85. return new bbGlobalDeclInfo<T>( name,ptr,meta,false );
  86. }
  87. template<class T> bbDeclInfo *bbGlobalDecl( bbString name,bbGCVar<T> *ptr,bbString meta="" ){
  88. return new bbGlobalVarDeclInfo<T>( name,ptr,meta,false );
  89. }
  90. template<class T> bbDeclInfo *bbConstDecl( bbString name,T *ptr,bbString meta="" ){
  91. return new bbGlobalDeclInfo<T>( name,ptr,meta,true );
  92. }
  93. template<class T> bbDeclInfo *bbConstDecl( bbString name,bbGCVar<T> *ptr,bbString meta="" ){
  94. return new bbGlobalVarDeclInfo<T>( name,ptr,meta,true );
  95. }
  96. // ***** Field *****
  97. //
  98. template<class C,class T> struct bbFieldDeclInfo : public bbDeclInfo{
  99. T C::*ptr;
  100. bbFieldDeclInfo( bbString name,bbString meta,T C::*ptr ):ptr( ptr ){
  101. this->name=name;
  102. this->meta=meta;
  103. this->kind="Field";
  104. this->type=bbGetType<T>();
  105. this->flags=BB_DECL_GETTABLE|BB_DECL_SETTABLE;
  106. }
  107. bbVariant get( bbVariant instance ){
  108. // C *p=instance.get<C*>();
  109. C *p=instance.ref<C>();
  110. return bbVariant( p->*ptr );
  111. }
  112. void set( bbVariant instance,bbVariant value ){
  113. // C *p=instance.get<C*>();
  114. C *p=instance.ref<C>();
  115. p->*ptr=value.get<T>();
  116. }
  117. };
  118. template<class C,class T> struct bbFieldVarDeclInfo : public bbDeclInfo{
  119. bbGCVar<T> C::*ptr;
  120. bbFieldVarDeclInfo( bbString name,bbString meta,bbGCVar<T> C::*ptr ):ptr( ptr ){
  121. this->name=name;
  122. this->meta=meta;
  123. this->kind="Field";
  124. this->type=bbGetType<T*>();
  125. this->flags=BB_DECL_GETTABLE|BB_DECL_SETTABLE;
  126. }
  127. bbVariant get( bbVariant instance ){
  128. // C *p=instance.get<C*>();
  129. C *p=instance.ref<C>();
  130. return bbVariant( (p->*ptr).get() );
  131. }
  132. void set( bbVariant instance,bbVariant value ){
  133. // C *p=instance.get<C*>();
  134. C *p=instance.ref<C>();
  135. p->*ptr=value.get<T*>();
  136. }
  137. };
  138. template<class C,class T> bbDeclInfo *bbFieldDecl( bbString name,T C::*ptr,bbString meta="" ){
  139. return new bbFieldDeclInfo<C,T>( name,meta,ptr );
  140. }
  141. template<class C,class T> bbDeclInfo *bbFieldDecl( bbString name,bbGCVar<T> C::*ptr,bbString meta="" ){
  142. return new bbFieldVarDeclInfo<C,T>( name,meta,ptr );
  143. }
  144. // ***** Constructor *****
  145. //
  146. template<class C,class...A> struct bbCtorDeclInfo : public bbDeclInfo{
  147. bbCtorDeclInfo( bbString meta ){
  148. this->name="New";
  149. this->meta=meta;
  150. this->kind="Constructor";
  151. this->type=bbGetType<bbFunction<void(A...)>>();
  152. this->flags=BB_DECL_INVOKABLE;
  153. }
  154. template<int...I> C *invoke( bbArray<bbVariant> params,detail::seq<I...> ){
  155. return bbGCNew<C>( params[I].get<A>()... );
  156. }
  157. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  158. return bbVariant( invoke( params,detail::gen_seq<sizeof...(A)>{} ) );
  159. }
  160. };
  161. template<class C,class...A> bbDeclInfo *bbCtorDecl( bbString meta="" ){
  162. return new bbCtorDeclInfo<C,A...>( meta );
  163. }
  164. // ***** Method *****
  165. //
  166. template<class C,class R,class...A> struct bbMethodDeclInfo : public bbDeclInfo{
  167. R (C::*ptr)(A...);
  168. bbMethodDeclInfo( bbString name,bbString meta,R (C::*ptr)(A...) ):ptr( ptr ){
  169. this->name=name;
  170. this->meta=meta;
  171. this->kind="Method";
  172. this->type=bbGetType<bbFunction<R(A...)>>();
  173. this->flags=BB_DECL_INVOKABLE;
  174. }
  175. template<int...I> R invoke( C *p,bbArray<bbVariant> params,detail::seq<I...> ){
  176. return (p->*ptr)( params[I].get<A>()... );
  177. }
  178. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  179. // C *p=instance.get<C*>();
  180. C *p=instance.ref<C>();
  181. return bbVariant( invoke( p,params,detail::gen_seq<sizeof...(A)>{} ) );
  182. }
  183. };
  184. template<class C,class...A> struct bbMethodDeclInfo<C,void,A...> : public bbDeclInfo{
  185. typedef void R;
  186. R (C::*ptr)(A...);
  187. bbMethodDeclInfo( bbString name,bbString meta,R (C::*ptr)(A...) ):ptr( ptr ){
  188. this->name=name;
  189. this->meta=meta;
  190. this->kind="Method";
  191. this->type=bbGetType<bbFunction<R(A...)>>();
  192. this->flags=BB_DECL_INVOKABLE;
  193. }
  194. template<int...I> R invoke( C *p,bbArray<bbVariant> params,detail::seq<I...> ){
  195. return (p->*ptr)( params[I].get<A>()... );
  196. }
  197. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  198. // C *p=instance.get<C*>();
  199. C *p=instance.ref<C>();
  200. invoke( p,params,detail::gen_seq<sizeof...(A)>{} );
  201. return {};
  202. }
  203. };
  204. template<class C,class R,class...A> bbDeclInfo *bbMethodDecl( bbString name,R (C::*ptr)(A...),bbString meta="" ){
  205. return new bbMethodDeclInfo<C,R,A...>( name,meta,ptr );
  206. }
  207. // ***** Property *****
  208. //
  209. template<class C,class T> struct bbPropertyDeclInfo : public bbDeclInfo{
  210. T (C::*getter)();
  211. void (C::*setter)(T);
  212. bbPropertyDeclInfo( bbString name,bbString meta,T(C::*getter)(),void(C::*setter)(T) ):getter( getter ),setter( setter ){
  213. this->name=name;
  214. this->meta=meta;
  215. this->kind="Property";
  216. this->type=bbGetType<T>();
  217. this->flags=(getter ? BB_DECL_GETTABLE : 0) | (setter ? BB_DECL_SETTABLE : 0);
  218. }
  219. bbVariant get( bbVariant instance ){
  220. if( !getter ) bbRuntimeError( "Property has not getter" );
  221. // C *p=instance.get<C*>();
  222. C *p=instance.ref<C>();
  223. return bbVariant( (p->*getter)() );
  224. }
  225. void set( bbVariant instance,bbVariant value ){
  226. if( !setter ) bbRuntimeError( "Property has not setter" );
  227. // C *p=instance.get<C*>();
  228. C *p=instance.ref<C>();
  229. (p->*setter)( value.get<T>() );
  230. }
  231. };
  232. template<class C,class T> struct bbExtPropertyDeclInfo : public bbDeclInfo{
  233. T (*getter)(C*);
  234. void (*setter)(C*,T);
  235. bbExtPropertyDeclInfo( bbString name,bbString meta,T(*getter)(C*),void(*setter)(C*,T) ):getter( getter ),setter( setter ){
  236. this->name=name;
  237. this->meta=meta;
  238. this->kind="Property";
  239. this->type=bbGetType<T>();
  240. this->flags=(getter ? BB_DECL_GETTABLE : 0) | (setter ? BB_DECL_SETTABLE : 0);
  241. }
  242. bbVariant get( bbVariant instance ){
  243. if( !getter ) bbRuntimeError( "Property has no getter" );
  244. C *p=instance.ref<C>();
  245. return bbVariant( getter(p) );
  246. }
  247. void set( bbVariant instance,bbVariant value ){
  248. if( !setter ) bbRuntimeError( "Property has no setter" );
  249. C *p=instance.ref<C>();
  250. setter(p,value.get<T>() );
  251. }
  252. };
  253. template<class C,class T> bbDeclInfo *bbPropertyDecl( bbString name,T(C::*getter)(),void(C::*setter)(T),bbString meta="" ){
  254. return new bbPropertyDeclInfo<C,T>( name,meta,getter,setter );
  255. }
  256. template<class C,class T> bbDeclInfo *bbExtPropertyDecl( bbString name,T(*getter)(C*),void(*setter)(C*,T),bbString meta="" ){
  257. return new bbExtPropertyDeclInfo<C,T>( name,meta,getter,setter );
  258. }
  259. // ***** Function *****
  260. //
  261. template<class R,class...A> struct bbFunctionDeclInfo : public bbDeclInfo{
  262. R (*ptr)(A...);
  263. bbFunctionDeclInfo( bbString name,bbString meta,R (*ptr)(A...) ):ptr( ptr ){
  264. this->name=name;
  265. this->meta=meta;
  266. this->kind="Function";
  267. this->type=bbGetType<bbFunction<R(A...)>>();
  268. this->flags=BB_DECL_INVOKABLE;
  269. }
  270. template<int...I> R invoke( bbArray<bbVariant> params,detail::seq<I...> ){
  271. return (*ptr)( params[I].get<A>()... );
  272. }
  273. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  274. return bbVariant( invoke( params,detail::gen_seq<sizeof...(A)>{} ) );
  275. }
  276. };
  277. template<class...A> struct bbFunctionDeclInfo<void,A...> : public bbDeclInfo{
  278. typedef void R;
  279. R (*ptr)(A...);
  280. bbFunctionDeclInfo( bbString name,bbString meta,R (*ptr)(A...) ):ptr( ptr ){
  281. this->name=name;
  282. this->meta=meta;
  283. this->kind="Function";
  284. this->type=bbGetType<bbFunction<R(A...)>>();
  285. this->flags=BB_DECL_INVOKABLE;
  286. }
  287. template<int...I> R invoke( bbArray<bbVariant> params,detail::seq<I...> ){
  288. return (*ptr)( params[I].get<A>()... );
  289. }
  290. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  291. invoke( params,detail::gen_seq<sizeof...(A)>{} );
  292. return {};
  293. }
  294. };
  295. template<class R,class...A> bbDeclInfo *bbFunctionDecl( bbString name,R (*ptr)(A...),bbString meta="" ){
  296. return new bbFunctionDeclInfo<R,A...>( name,meta,ptr );
  297. }
  298. template<class...Ds> bbDeclInfo **bbMembers( Ds...ds ){
  299. int n=sizeof...(Ds);
  300. bbDeclInfo *ts[]={ ds...,0 };
  301. bbDeclInfo **ps=new bbDeclInfo*[n+1];
  302. for( int i=0;i<n;++i ) ps[i]=ts[i];
  303. ps[n]=0;
  304. return ps;
  305. }
  306. */
  307. #endif