bbdeclinfo_r.h 11 KB

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