bbdeclinfo.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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. // ***** Global *****
  50. //
  51. template<class T> struct bbGlobalDeclInfo : public bbDeclInfo{
  52. T *ptr;
  53. bbGlobalDeclInfo( bbString name,T *ptr,bbString meta,bool isconst ):ptr( ptr ){
  54. this->name=name;
  55. this->meta=meta;
  56. this->kind=isconst ? "Const" : "Global";
  57. this->type=bbGetType<T>();
  58. this->flags=BB_DECL_GETTABLE|(isconst ? 0 : BB_DECL_SETTABLE);
  59. }
  60. bbVariant get( bbVariant instance ){
  61. return bbVariant( *ptr );
  62. }
  63. void set( bbVariant instance,bbVariant value ){
  64. *ptr=value.get<T>();
  65. }
  66. };
  67. template<class T> struct bbGlobalVarDeclInfo : public bbDeclInfo{
  68. bbGCVar<T> *ptr;
  69. bbGlobalVarDeclInfo( bbString name,bbGCVar<T> *ptr,bbString meta,bool isconst ):ptr( ptr ){
  70. this->name=name;
  71. this->meta=meta;
  72. this->kind=isconst ? "Const" : "Global";
  73. this->type=bbGetType<T>();
  74. this->flags=BB_DECL_GETTABLE|(isconst ? 0 : BB_DECL_SETTABLE);
  75. }
  76. bbVariant get( bbVariant instance ){
  77. return bbVariant( ptr->get() );
  78. }
  79. void set( bbVariant instance,bbVariant value ){
  80. *ptr=value.get<T*>();
  81. }
  82. };
  83. template<class T> bbDeclInfo *bbGlobalDecl( bbString name,T *ptr,bbString meta="" ){
  84. return new bbGlobalDeclInfo<T>( name,ptr,meta,false );
  85. }
  86. template<class T> bbDeclInfo *bbGlobalDecl( bbString name,bbGCVar<T> *ptr,bbString meta="" ){
  87. return new bbGlobalVarDeclInfo<T>( name,ptr,meta,false );
  88. }
  89. template<class T> bbDeclInfo *bbConstDecl( bbString name,T *ptr,bbString meta="" ){
  90. return new bbGlobalDeclInfo<T>( name,ptr,meta,true );
  91. }
  92. template<class T> bbDeclInfo *bbConstDecl( bbString name,bbGCVar<T> *ptr,bbString meta="" ){
  93. return new bbGlobalVarDeclInfo<T>( name,ptr,meta,true );
  94. }
  95. // ***** Field *****
  96. //
  97. template<class C,class T> struct bbFieldDeclInfo : public bbDeclInfo{
  98. T C::*ptr;
  99. bbFieldDeclInfo( bbString name,bbString meta,T C::*ptr ):ptr( ptr ){
  100. this->name=name;
  101. this->meta=meta;
  102. this->kind="Field";
  103. this->type=bbGetType<T>();
  104. this->flags=BB_DECL_GETTABLE|BB_DECL_SETTABLE;
  105. }
  106. bbVariant get( bbVariant instance ){
  107. C *p=instance.get<C*>();
  108. return bbVariant( p->*ptr );
  109. }
  110. void set( bbVariant instance,bbVariant value ){
  111. C *p=instance.get<C*>();
  112. p->*ptr=value.get<T>();
  113. }
  114. };
  115. template<class C,class T> struct bbFieldVarDeclInfo : public bbDeclInfo{
  116. bbGCVar<T> C::*ptr;
  117. bbFieldVarDeclInfo( bbString name,bbString meta,bbGCVar<T> C::*ptr ):ptr( ptr ){
  118. this->name=name;
  119. this->meta=meta;
  120. this->kind="Field";
  121. this->type=bbGetType<T*>();
  122. this->flags=BB_DECL_GETTABLE|BB_DECL_SETTABLE;
  123. }
  124. bbVariant get( bbVariant instance ){
  125. C *p=instance.get<C*>();
  126. return bbVariant( (p->*ptr).get() );
  127. }
  128. void set( bbVariant instance,bbVariant value ){
  129. C *p=instance.get<C*>();
  130. p->*ptr=value.get<T*>();
  131. }
  132. };
  133. template<class C,class T> bbDeclInfo *bbFieldDecl( bbString name,T C::*ptr,bbString meta="" ){
  134. return new bbFieldDeclInfo<C,T>( name,meta,ptr );
  135. }
  136. template<class C,class T> bbDeclInfo *bbFieldDecl( bbString name,bbGCVar<T> C::*ptr,bbString meta="" ){
  137. return new bbFieldVarDeclInfo<C,T>( name,meta,ptr );
  138. }
  139. // ***** Constructor *****
  140. //
  141. template<class C,class...A> struct bbCtorDeclInfo : public bbDeclInfo{
  142. bbCtorDeclInfo( bbString meta ){
  143. this->name="New";
  144. this->meta=meta;
  145. this->kind="Constructor";
  146. this->type=bbGetType<bbFunction<void(A...)>>();
  147. this->flags=BB_DECL_INVOKABLE;
  148. }
  149. template<int...I> C *invoke( bbArray<bbVariant> params,detail::seq<I...> ){
  150. return bbGCNew<C>( params[I].get<A>()... );
  151. }
  152. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  153. return bbVariant( invoke( params,detail::gen_seq<sizeof...(A)>{} ) );
  154. }
  155. };
  156. template<class C,class...A> bbDeclInfo *bbCtorDecl( bbString meta="" ){
  157. return new bbCtorDeclInfo<C,A...>( meta );
  158. }
  159. // ***** Method *****
  160. //
  161. template<class C,class R,class...A> struct bbMethodDeclInfo : public bbDeclInfo{
  162. R (C::*ptr)(A...);
  163. bbMethodDeclInfo( bbString name,bbString meta,R (C::*ptr)(A...) ):ptr( ptr ){
  164. this->name=name;
  165. this->meta=meta;
  166. this->kind="Method";
  167. this->type=bbGetType<bbFunction<R(A...)>>();
  168. this->flags=BB_DECL_INVOKABLE;
  169. }
  170. template<int...I> R invoke( C *p,bbArray<bbVariant> params,detail::seq<I...> ){
  171. return (p->*ptr)( params[I].get<A>()... );
  172. }
  173. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  174. C *p=instance.get<C*>();
  175. return bbVariant( invoke( p,params,detail::gen_seq<sizeof...(A)>{} ) );
  176. }
  177. };
  178. template<class C,class...A> struct bbMethodDeclInfo<C,void,A...> : public bbDeclInfo{
  179. typedef void R;
  180. R (C::*ptr)(A...);
  181. bbMethodDeclInfo( bbString name,bbString meta,R (C::*ptr)(A...) ):ptr( ptr ){
  182. this->name=name;
  183. this->meta=meta;
  184. this->kind="Method";
  185. this->type=bbGetType<bbFunction<R(A...)>>();
  186. this->flags=BB_DECL_INVOKABLE;
  187. }
  188. template<int...I> R invoke( C *p,bbArray<bbVariant> params,detail::seq<I...> ){
  189. return (p->*ptr)( params[I].get<A>()... );
  190. }
  191. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  192. C *p=instance.get<C*>();
  193. invoke( p,params,detail::gen_seq<sizeof...(A)>{} );
  194. return {};
  195. }
  196. };
  197. template<class C,class R,class...A> bbDeclInfo *bbMethodDecl( bbString name,R (C::*ptr)(A...),bbString meta="" ){
  198. return new bbMethodDeclInfo<C,R,A...>( name,meta,ptr );
  199. }
  200. // ***** Property *****
  201. //
  202. template<class C,class T> struct bbPropertyDeclInfo : public bbDeclInfo{
  203. T (C::*getter)();
  204. void (C::*setter)(T);
  205. bbPropertyDeclInfo( bbString name,bbString meta,T(C::*getter)(),void(C::*setter)(T) ):getter( getter ),setter( setter ){
  206. this->name=name;
  207. this->meta=meta;
  208. this->kind="Property";
  209. this->type=bbGetType<T>();
  210. this->flags=(getter ? BB_DECL_GETTABLE : 0) | (setter ? BB_DECL_SETTABLE : 0);
  211. }
  212. bbVariant get( bbVariant instance ){
  213. if( !getter ) bbRuntimeError( "Property has not getter" );
  214. C *p=instance.get<C*>();
  215. return bbVariant( (p->*getter)() );
  216. }
  217. void set( bbVariant instance,bbVariant value ){
  218. if( !setter ) bbRuntimeError( "Property has not setter" );
  219. C *p=instance.get<C*>();
  220. (p->*setter)( value.get<T>() );
  221. }
  222. };
  223. template<class C,class T> bbDeclInfo *bbPropertyDecl( bbString name,T(C::*getter)(),void(C::*setter)(T),bbString meta="" ){
  224. return new bbPropertyDeclInfo<C,T>( name,meta,getter,setter );
  225. }
  226. // ***** Function *****
  227. //
  228. template<class R,class...A> struct bbFunctionDeclInfo : public bbDeclInfo{
  229. R (*ptr)(A...);
  230. bbFunctionDeclInfo( bbString name,bbString meta,R (*ptr)(A...) ):ptr( ptr ){
  231. this->name=name;
  232. this->meta=meta;
  233. this->kind="Function";
  234. this->type=bbGetType<bbFunction<R(A...)>>();
  235. this->flags=BB_DECL_INVOKABLE;
  236. }
  237. template<int...I> R invoke( bbArray<bbVariant> params,detail::seq<I...> ){
  238. return (*ptr)( params[I].get<A>()... );
  239. }
  240. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  241. return bbVariant( invoke( params,detail::gen_seq<sizeof...(A)>{} ) );
  242. }
  243. };
  244. template<class...A> struct bbFunctionDeclInfo<void,A...> : public bbDeclInfo{
  245. typedef void R;
  246. R (*ptr)(A...);
  247. bbFunctionDeclInfo( bbString name,bbString meta,R (*ptr)(A...) ):ptr( ptr ){
  248. this->name=name;
  249. this->meta=meta;
  250. this->kind="Function";
  251. this->type=bbGetType<bbFunction<R(A...)>>();
  252. this->flags=BB_DECL_INVOKABLE;
  253. }
  254. template<int...I> R invoke( bbArray<bbVariant> params,detail::seq<I...> ){
  255. return (*ptr)( params[I].get<A>()... );
  256. }
  257. bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
  258. invoke( params,detail::gen_seq<sizeof...(A)>{} );
  259. return {};
  260. }
  261. };
  262. template<class R,class...A> bbDeclInfo *bbFunctionDecl( bbString name,R (*ptr)(A...),bbString meta="" ){
  263. return new bbFunctionDeclInfo<R,A...>( name,meta,ptr );
  264. }
  265. template<class...Ds> bbDeclInfo **bbMembers( Ds...ds ){
  266. int n=sizeof...(Ds);
  267. bbDeclInfo *ts[]={ ds... };
  268. bbDeclInfo **ps=new bbDeclInfo*[n+1];
  269. for( int i=0;i<n;++i ) ps[i]=ts[i];
  270. ps[n]=0;
  271. return ps;
  272. }
  273. #endif