engineFunctions.h 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #ifndef _ENGINEFUNCTIONS_H_
  23. #define _ENGINEFUNCTIONS_H_
  24. #ifndef _ENGINEEXPORTS_H_
  25. #include "console/engineExports.h"
  26. #endif
  27. #ifndef _ENGINETYPEINFO_H_
  28. #include "console/engineTypeInfo.h"
  29. #endif
  30. /// @file
  31. /// Structures for function-type engine export information.
  32. #ifdef TORQUE_COMPILER_VISUALC
  33. #define TORQUE_API extern "C" __declspec( dllexport )
  34. #elif defined( TORQUE_COMPILER_GCC )
  35. #define TORQUE_API extern "C" __attribute__( ( visibility( "default" ) ) )
  36. #else
  37. #error Unsupported compiler.
  38. #endif
  39. // #pragma pack is bugged in GCC in that the packing in place at the template instantiation
  40. // sites rather than their definition sites is used. Enable workarounds.
  41. #ifdef TORQUE_COMPILER_GCC
  42. #define _PACK_BUG_WORKAROUNDS
  43. #endif
  44. /// Structure storing the default argument values for a function invocation
  45. /// frame.
  46. struct EngineFunctionDefaultArguments
  47. {
  48. /// Number of default arguments for the function call frame.
  49. ///
  50. /// @warn This is @b NOT the size of the memory block returned by getArgs() and also
  51. /// not the number of elements it contains.
  52. U32 mNumDefaultArgs;
  53. /// Return a pointer to the variable-sized array of default argument values.
  54. ///
  55. /// @warn The arguments must be stored @b IMMEDIATELY after #mNumDefaultArgs.
  56. /// @warn This is a @b FULL frame and not just the default arguments, i.e. it starts with the
  57. /// first argument that the function takes and ends with the last argument it takes.
  58. /// @warn If the compiler's #pragma pack is buggy, the elements in this structure are allowed
  59. /// to be 4-byte aligned rather than byte-aligned as they should be.
  60. const U8* getArgs() const
  61. {
  62. return ( const U8* ) &( mNumDefaultArgs ) + sizeof( mNumDefaultArgs );
  63. }
  64. };
  65. // Need byte-aligned packing for the default argument structures.
  66. #pragma pack( push, 1 )
  67. // Structure encapsulating default arguments to an engine API function.
  68. template< typename T >
  69. struct _EngineFunctionDefaultArguments {};
  70. template<>
  71. struct _EngineFunctionDefaultArguments< void() > : public EngineFunctionDefaultArguments
  72. {
  73. _EngineFunctionDefaultArguments()
  74. { mNumDefaultArgs = 0; }
  75. };
  76. template< typename A >
  77. struct _EngineFunctionDefaultArguments< void( A ) > : public EngineFunctionDefaultArguments
  78. {
  79. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  80. _EngineFunctionDefaultArguments()
  81. { mNumDefaultArgs = 0; }
  82. _EngineFunctionDefaultArguments( A a )
  83. : a( a )
  84. { mNumDefaultArgs = 1; }
  85. };
  86. template< typename A, typename B >
  87. struct _EngineFunctionDefaultArguments< void( A, B ) > : public EngineFunctionDefaultArguments
  88. {
  89. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  90. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  91. _EngineFunctionDefaultArguments()
  92. { mNumDefaultArgs = 0; }
  93. _EngineFunctionDefaultArguments( B b )
  94. : b( b )
  95. { mNumDefaultArgs = 1; }
  96. _EngineFunctionDefaultArguments( A a, B b )
  97. : a( a ),
  98. b( b )
  99. { mNumDefaultArgs = 2; }
  100. };
  101. template< typename A, typename B, typename C >
  102. struct _EngineFunctionDefaultArguments< void( A, B, C ) > : public EngineFunctionDefaultArguments
  103. {
  104. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  105. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  106. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  107. _EngineFunctionDefaultArguments()
  108. { mNumDefaultArgs = 0; }
  109. _EngineFunctionDefaultArguments( C c )
  110. : c( c )
  111. { mNumDefaultArgs = 1; }
  112. _EngineFunctionDefaultArguments( B b, C c )
  113. : b( b ),
  114. c( c )
  115. { mNumDefaultArgs = 2; }
  116. _EngineFunctionDefaultArguments( A a, B b, C c )
  117. : a( a ),
  118. b( b ),
  119. c( c )
  120. { mNumDefaultArgs = 3; }
  121. };
  122. template< typename A, typename B, typename C, typename D >
  123. struct _EngineFunctionDefaultArguments< void( A, B, C, D ) > : public EngineFunctionDefaultArguments
  124. {
  125. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  126. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  127. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  128. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  129. _EngineFunctionDefaultArguments()
  130. { mNumDefaultArgs = 0; }
  131. _EngineFunctionDefaultArguments( D d )
  132. : d( d )
  133. { mNumDefaultArgs = 1; }
  134. _EngineFunctionDefaultArguments( C c, D d )
  135. : c( c ),
  136. d( d )
  137. { mNumDefaultArgs = 2; }
  138. _EngineFunctionDefaultArguments( B b, C c, D d )
  139. : b( b ),
  140. c( c ),
  141. d( d )
  142. { mNumDefaultArgs = 3; }
  143. _EngineFunctionDefaultArguments( A a, B b, C c, D d )
  144. : a( a ),
  145. b( b ),
  146. c( c ),
  147. d( d )
  148. { mNumDefaultArgs = 4; }
  149. };
  150. template< typename A, typename B, typename C, typename D, typename E >
  151. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E ) > : public EngineFunctionDefaultArguments
  152. {
  153. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  154. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  155. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  156. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  157. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  158. _EngineFunctionDefaultArguments()
  159. { mNumDefaultArgs = 0; }
  160. _EngineFunctionDefaultArguments( E e )
  161. : e( e )
  162. { mNumDefaultArgs = 1; }
  163. _EngineFunctionDefaultArguments( D d, E e )
  164. : d( d ),
  165. e( e )
  166. { mNumDefaultArgs = 2; }
  167. _EngineFunctionDefaultArguments( C c, D d, E e )
  168. : c( c ),
  169. d( d ),
  170. e( e )
  171. { mNumDefaultArgs = 3; }
  172. _EngineFunctionDefaultArguments( B b, C c, D d, E e )
  173. : b( b ),
  174. c( c ),
  175. d( d ),
  176. e( e )
  177. { mNumDefaultArgs = 4; }
  178. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e )
  179. : a( a ),
  180. b( b ),
  181. c( c ),
  182. d( d ),
  183. e( e )
  184. { mNumDefaultArgs = 5; }
  185. };
  186. template< typename A, typename B, typename C, typename D, typename E, typename F >
  187. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) > : public EngineFunctionDefaultArguments
  188. {
  189. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  190. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  191. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  192. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  193. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  194. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  195. _EngineFunctionDefaultArguments()
  196. { mNumDefaultArgs = 0; }
  197. _EngineFunctionDefaultArguments( F f )
  198. : f( f )
  199. { mNumDefaultArgs = 1; }
  200. _EngineFunctionDefaultArguments( E e, F f )
  201. : e( e ),
  202. f( f )
  203. { mNumDefaultArgs = 2; }
  204. _EngineFunctionDefaultArguments( D d, E e, F f )
  205. : d( d ),
  206. e( e ),
  207. f( f )
  208. { mNumDefaultArgs = 3; }
  209. _EngineFunctionDefaultArguments( C c, D d, E e, F f )
  210. : c( c ),
  211. d( d ),
  212. e( e ),
  213. f( f )
  214. { mNumDefaultArgs = 4; }
  215. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f )
  216. : b( b ),
  217. c( c ),
  218. d( d ),
  219. e( e ),
  220. f( f )
  221. { mNumDefaultArgs = 5; }
  222. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f )
  223. : a( a ),
  224. b( b ),
  225. c( c ),
  226. d( d ),
  227. e( e ),
  228. f( f )
  229. { mNumDefaultArgs = 6; }
  230. };
  231. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  232. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) > : public EngineFunctionDefaultArguments
  233. {
  234. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  235. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  236. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  237. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  238. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  239. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  240. typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
  241. _EngineFunctionDefaultArguments()
  242. { mNumDefaultArgs = 0; }
  243. _EngineFunctionDefaultArguments( G g )
  244. : g( g )
  245. { mNumDefaultArgs = 1; }
  246. _EngineFunctionDefaultArguments( F f, G g )
  247. : f( f ),
  248. g( g )
  249. { mNumDefaultArgs = 2; }
  250. _EngineFunctionDefaultArguments( E e, F f, G g )
  251. : e( e ),
  252. f( f ),
  253. g( g )
  254. { mNumDefaultArgs = 3; }
  255. _EngineFunctionDefaultArguments( D d, E e, F f, G g )
  256. : d( d ),
  257. e( e ),
  258. f( f ),
  259. g( g )
  260. { mNumDefaultArgs = 4; }
  261. _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g )
  262. : c( c ),
  263. d( d ),
  264. e( e ),
  265. f( f ),
  266. g( g )
  267. { mNumDefaultArgs = 5; }
  268. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g )
  269. : b( b ),
  270. c( c ),
  271. d( d ),
  272. e( e ),
  273. f( f ),
  274. g( g )
  275. { mNumDefaultArgs = 6; }
  276. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g )
  277. : a( a ),
  278. b( b ),
  279. c( c ),
  280. d( d ),
  281. e( e ),
  282. f( f ),
  283. g( g )
  284. { mNumDefaultArgs = 7; }
  285. };
  286. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  287. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) > : public EngineFunctionDefaultArguments
  288. {
  289. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  290. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  291. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  292. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  293. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  294. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  295. typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
  296. typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
  297. _EngineFunctionDefaultArguments()
  298. { mNumDefaultArgs = 0; }
  299. _EngineFunctionDefaultArguments( H h )
  300. : h( h )
  301. { mNumDefaultArgs = 1; }
  302. _EngineFunctionDefaultArguments( G g, H h )
  303. : g( g ),
  304. h( h )
  305. { mNumDefaultArgs = 2; }
  306. _EngineFunctionDefaultArguments( F f, G g, H h )
  307. : f( f ),
  308. g( g ),
  309. h( h )
  310. { mNumDefaultArgs = 3; }
  311. _EngineFunctionDefaultArguments( E e, F f, G g, H h )
  312. : e( e ),
  313. f( f ),
  314. g( g ),
  315. h( h )
  316. { mNumDefaultArgs = 4; }
  317. _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h )
  318. : d( d ),
  319. e( e ),
  320. f( f ),
  321. g( g ),
  322. h( h )
  323. { mNumDefaultArgs = 5; }
  324. _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h )
  325. : c( c ),
  326. d( d ),
  327. e( e ),
  328. f( f ),
  329. g( g ),
  330. h( h )
  331. { mNumDefaultArgs = 6; }
  332. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h )
  333. : b( b ),
  334. c( c ),
  335. d( d ),
  336. e( e ),
  337. f( f ),
  338. g( g ),
  339. h( h )
  340. { mNumDefaultArgs = 7; }
  341. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h )
  342. : a( a ),
  343. b( b ),
  344. c( c ),
  345. d( d ),
  346. e( e ),
  347. f( f ),
  348. g( g ),
  349. h( h )
  350. { mNumDefaultArgs = 8; }
  351. };
  352. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  353. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) > : public EngineFunctionDefaultArguments
  354. {
  355. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  356. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  357. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  358. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  359. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  360. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  361. typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
  362. typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
  363. typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
  364. _EngineFunctionDefaultArguments()
  365. { mNumDefaultArgs = 0; }
  366. _EngineFunctionDefaultArguments( I i )
  367. : i( i )
  368. { mNumDefaultArgs = 1; }
  369. _EngineFunctionDefaultArguments( H h, I i )
  370. : h( h ),
  371. i( i )
  372. { mNumDefaultArgs = 2; }
  373. _EngineFunctionDefaultArguments( G g, H h, I i )
  374. : g( g ),
  375. h( h ),
  376. i( i )
  377. { mNumDefaultArgs = 3; }
  378. _EngineFunctionDefaultArguments( F f, G g, H h, I i )
  379. : f( f ),
  380. g( g ),
  381. h( h ),
  382. i( i )
  383. { mNumDefaultArgs = 4; }
  384. _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i )
  385. : e( e ),
  386. f( f ),
  387. g( g ),
  388. h( h ),
  389. i( i )
  390. { mNumDefaultArgs = 5; }
  391. _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i )
  392. : d( d ),
  393. e( e ),
  394. f( f ),
  395. g( g ),
  396. h( h ),
  397. i( i )
  398. { mNumDefaultArgs = 6; }
  399. _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i )
  400. : c( c ),
  401. d( d ),
  402. e( e ),
  403. f( f ),
  404. g( g ),
  405. h( h ),
  406. i( i )
  407. { mNumDefaultArgs = 7; }
  408. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i )
  409. : b( b ),
  410. c( c ),
  411. d( d ),
  412. e( e ),
  413. f( f ),
  414. g( g ),
  415. h( h ),
  416. i( i )
  417. { mNumDefaultArgs = 8; }
  418. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  419. : a( a ),
  420. b( b ),
  421. c( c ),
  422. d( d ),
  423. e( e ),
  424. f( f ),
  425. g( g ),
  426. h( h ),
  427. i( i )
  428. { mNumDefaultArgs = 9; }
  429. };
  430. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  431. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) > : public EngineFunctionDefaultArguments
  432. {
  433. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  434. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  435. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  436. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  437. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  438. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  439. typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
  440. typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
  441. typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
  442. typename EngineTypeTraits< J >::DefaultArgumentValueStoreType j;
  443. _EngineFunctionDefaultArguments()
  444. { mNumDefaultArgs = 0; }
  445. _EngineFunctionDefaultArguments( J j )
  446. : j( j )
  447. { mNumDefaultArgs = 1; }
  448. _EngineFunctionDefaultArguments( I i, J j )
  449. : i( i ),
  450. j( j )
  451. { mNumDefaultArgs = 2; }
  452. _EngineFunctionDefaultArguments( H h, I i, J j )
  453. : h( h ),
  454. i( i ),
  455. j( j )
  456. { mNumDefaultArgs = 3; }
  457. _EngineFunctionDefaultArguments( G g, H h, I i, J j )
  458. : g( g ),
  459. h( h ),
  460. i( i ),
  461. j( j )
  462. { mNumDefaultArgs = 4; }
  463. _EngineFunctionDefaultArguments( F f, G g, H h, I i, J j )
  464. : f( f ),
  465. g( g ),
  466. h( h ),
  467. i( i ),
  468. j( j )
  469. { mNumDefaultArgs = 5; }
  470. _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i, J j )
  471. : e( e ),
  472. f( f ),
  473. g( g ),
  474. h( h ),
  475. i( i ),
  476. j( j )
  477. { mNumDefaultArgs = 6; }
  478. _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i, J j )
  479. : d( d ),
  480. e( e ),
  481. f( f ),
  482. g( g ),
  483. h( h ),
  484. i( i ),
  485. j( j )
  486. { mNumDefaultArgs = 7; }
  487. _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i, J j )
  488. : c( c ),
  489. d( d ),
  490. e( e ),
  491. f( f ),
  492. g( g ),
  493. h( h ),
  494. i( i ),
  495. j( j )
  496. { mNumDefaultArgs = 8; }
  497. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i, J j )
  498. : b( b ),
  499. c( c ),
  500. d( d ),
  501. e( e ),
  502. f( f ),
  503. g( g ),
  504. h( h ),
  505. i( i ),
  506. j( j )
  507. { mNumDefaultArgs = 9; }
  508. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  509. : a( a ),
  510. b( b ),
  511. c( c ),
  512. d( d ),
  513. e( e ),
  514. f( f ),
  515. g( g ),
  516. h( h ),
  517. i( i ),
  518. j( j )
  519. { mNumDefaultArgs = 10; }
  520. };
  521. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  522. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) > : public EngineFunctionDefaultArguments
  523. {
  524. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  525. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  526. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  527. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  528. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  529. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  530. typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
  531. typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
  532. typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
  533. typename EngineTypeTraits< J >::DefaultArgumentValueStoreType j;
  534. typename EngineTypeTraits< K >::DefaultArgumentValueStoreType k;
  535. _EngineFunctionDefaultArguments()
  536. { mNumDefaultArgs = 0; }
  537. _EngineFunctionDefaultArguments( K k )
  538. : k( k )
  539. { mNumDefaultArgs = 1; }
  540. _EngineFunctionDefaultArguments( J j, K k )
  541. : j( j ),
  542. k( k )
  543. { mNumDefaultArgs = 2; }
  544. _EngineFunctionDefaultArguments( I i, J j, K k )
  545. : i( i ),
  546. j( j ),
  547. k( k )
  548. { mNumDefaultArgs = 3; }
  549. _EngineFunctionDefaultArguments( H h, I i, J j, K k )
  550. : h( h ),
  551. i( i ),
  552. j( j ),
  553. k( k )
  554. { mNumDefaultArgs = 4; }
  555. _EngineFunctionDefaultArguments( G g, H h, I i, J j, K k )
  556. : g( g ),
  557. h( h ),
  558. i( i ),
  559. j( j ),
  560. k( k )
  561. { mNumDefaultArgs = 5; }
  562. _EngineFunctionDefaultArguments( F f, G g, H h, I i, J j, K k )
  563. : f( f ),
  564. g( g ),
  565. h( h ),
  566. i( i ),
  567. j( j ),
  568. k( k )
  569. { mNumDefaultArgs = 6; }
  570. _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i, J j, K k )
  571. : e( e ),
  572. f( f ),
  573. g( g ),
  574. h( h ),
  575. i( i ),
  576. j( j ),
  577. k( k )
  578. { mNumDefaultArgs = 7; }
  579. _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i, J j, K k )
  580. : d( d ),
  581. e( e ),
  582. f( f ),
  583. g( g ),
  584. h( h ),
  585. i( i ),
  586. j( j ),
  587. k( k )
  588. { mNumDefaultArgs = 8; }
  589. _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i, J j, K k )
  590. : c( c ),
  591. d( d ),
  592. e( e ),
  593. f( f ),
  594. g( g ),
  595. h( h ),
  596. i( i ),
  597. j( j ),
  598. k( k )
  599. { mNumDefaultArgs = 9; }
  600. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  601. : b( b ),
  602. c( c ),
  603. d( d ),
  604. e( e ),
  605. f( f ),
  606. g( g ),
  607. h( h ),
  608. i( i ),
  609. j( j ),
  610. k( k )
  611. { mNumDefaultArgs = 10; }
  612. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  613. : a( a ),
  614. b( b ),
  615. c( c ),
  616. d( d ),
  617. e( e ),
  618. f( f ),
  619. g( g ),
  620. h( h ),
  621. i( i ),
  622. j( j ),
  623. k( k )
  624. { mNumDefaultArgs = 11; }
  625. };
  626. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
  627. struct _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K, L ) > : public EngineFunctionDefaultArguments
  628. {
  629. typename EngineTypeTraits< A >::DefaultArgumentValueStoreType a;
  630. typename EngineTypeTraits< B >::DefaultArgumentValueStoreType b;
  631. typename EngineTypeTraits< C >::DefaultArgumentValueStoreType c;
  632. typename EngineTypeTraits< D >::DefaultArgumentValueStoreType d;
  633. typename EngineTypeTraits< E >::DefaultArgumentValueStoreType e;
  634. typename EngineTypeTraits< F >::DefaultArgumentValueStoreType f;
  635. typename EngineTypeTraits< G >::DefaultArgumentValueStoreType g;
  636. typename EngineTypeTraits< H >::DefaultArgumentValueStoreType h;
  637. typename EngineTypeTraits< I >::DefaultArgumentValueStoreType i;
  638. typename EngineTypeTraits< J >::DefaultArgumentValueStoreType j;
  639. typename EngineTypeTraits< K >::DefaultArgumentValueStoreType k;
  640. typename EngineTypeTraits< L >::DefaultArgumentValueStoreType l;
  641. _EngineFunctionDefaultArguments()
  642. { mNumDefaultArgs = 0; }
  643. _EngineFunctionDefaultArguments( L l )
  644. : l( l )
  645. { mNumDefaultArgs = 1; }
  646. _EngineFunctionDefaultArguments( K k, L l )
  647. : k( k ),
  648. l( l )
  649. { mNumDefaultArgs = 2; }
  650. _EngineFunctionDefaultArguments( J j, K k, L l )
  651. : j( j ),
  652. k( k ),
  653. l( l )
  654. { mNumDefaultArgs = 3; }
  655. _EngineFunctionDefaultArguments( I i, J j, K k, L l )
  656. : i( i ),
  657. j( j ),
  658. k( k ),
  659. l( l )
  660. { mNumDefaultArgs = 4; }
  661. _EngineFunctionDefaultArguments( H h, I i, J j, K k, L l )
  662. : h( h ),
  663. i( i ),
  664. j( j ),
  665. k( k ),
  666. l( l )
  667. { mNumDefaultArgs = 5; }
  668. _EngineFunctionDefaultArguments( G g, H h, I i, J j, K k, L l )
  669. : g( g ),
  670. h( h ),
  671. i( i ),
  672. j( j ),
  673. k( k ),
  674. l( l )
  675. { mNumDefaultArgs = 6; }
  676. _EngineFunctionDefaultArguments( F f, G g, H h, I i, J j, K k, L l )
  677. : f( f ),
  678. g( g ),
  679. h( h ),
  680. i( i ),
  681. j( j ),
  682. k( k ),
  683. l( l )
  684. { mNumDefaultArgs = 7; }
  685. _EngineFunctionDefaultArguments( E e, F f, G g, H h, I i, J j, K k, L l )
  686. : e( e ),
  687. f( f ),
  688. g( g ),
  689. h( h ),
  690. i( i ),
  691. j( j ),
  692. k( k ),
  693. l( l )
  694. { mNumDefaultArgs = 8; }
  695. _EngineFunctionDefaultArguments( D d, E e, F f, G g, H h, I i, J j, K k, L l )
  696. : d( d ),
  697. e( e ),
  698. f( f ),
  699. g( g ),
  700. h( h ),
  701. i( i ),
  702. j( j ),
  703. k( k ),
  704. l( l )
  705. { mNumDefaultArgs = 9; }
  706. _EngineFunctionDefaultArguments( C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
  707. : c( c ),
  708. d( d ),
  709. e( e ),
  710. f( f ),
  711. g( g ),
  712. h( h ),
  713. i( i ),
  714. j( j ),
  715. k( k ),
  716. l( l )
  717. { mNumDefaultArgs = 10; }
  718. _EngineFunctionDefaultArguments( B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
  719. : b( b ),
  720. c( c ),
  721. d( d ),
  722. e( e ),
  723. f( f ),
  724. g( g ),
  725. h( h ),
  726. i( i ),
  727. j( j ),
  728. k( k ),
  729. l( l )
  730. { mNumDefaultArgs = 11; }
  731. _EngineFunctionDefaultArguments( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
  732. : a( a ),
  733. b( b ),
  734. c( c ),
  735. d( d ),
  736. e( e ),
  737. f( f ),
  738. g( g ),
  739. h( h ),
  740. i( i ),
  741. j( j ),
  742. k( k ),
  743. l( l )
  744. { mNumDefaultArgs = 12; }
  745. };
  746. #pragma pack( pop )
  747. // Helper to allow flags argument to DEFINE_FUNCTION to be empty.
  748. struct _EngineFunctionFlags
  749. {
  750. U32 val;
  751. _EngineFunctionFlags()
  752. : val( 0 ) {}
  753. _EngineFunctionFlags( U32 val )
  754. : val( val ) {}
  755. operator U32() const { return val; }
  756. };
  757. ///
  758. enum EngineFunctionFlags
  759. {
  760. /// Function is a callback into the control layer. If this flag is not set,
  761. /// the function is a call-in.
  762. EngineFunctionCallout = BIT( 0 ),
  763. };
  764. /// A function exported by the engine for interfacing with the control layer.
  765. ///
  766. /// A function can either be a call-in, transfering control flow from the control layer to the engine, or a call-out,
  767. /// transfering control flow from the engine to the control layer.
  768. ///
  769. /// All engine API functions use the native C (@c cdecl) calling convention.
  770. ///
  771. /// Be aware that there a no implicit parameters to functions. This, for example, means that methods will simply
  772. /// list an object type parameter as their first argument but otherwise be indistinguishable from other functions.
  773. ///
  774. /// Variadic functions are supported.
  775. ///
  776. /// @section engineFunction_strings String Arguments and Return Values
  777. ///
  778. /// Strings passed through the API are assumed to be owned by the caller. They must persist for the entire duration
  779. /// of a call.
  780. ///
  781. /// Strings returned by a function are assumed to be in transient storage that will be overwritten by subsequent API
  782. /// calls. If the caller wants to preserve a string, it is responsible to copying strings to its own memory. This will
  783. /// happen with most higher-level control layers anyway.
  784. ///
  785. /// @section engineFunction_defaultargs Default Arguments
  786. ///
  787. /// As the engine API export system is set up to not require hand-written code in generated wrappers per se, the
  788. /// export system seeks to include a maximum possible amount of information in the export structures.
  789. /// To this end, where applicable, information about suggested default values for arguments to the engine API
  790. /// functions is stored in the export structures. It is up to the wrapper generator if and how it makes use of
  791. /// this information.
  792. ///
  793. /// Default arguments are represented by capturing raw stack frame vectors of the arguments to functions. These
  794. /// frames could be used as default images for passing arguments in stack frames, though wrapper generators
  795. /// may actually want to read out individual argument values and include them in function prototypes within
  796. /// the generated code.
  797. ///
  798. /// @section engineFunction_callin Call-ins
  799. ///
  800. /// Call-ins are exposed as native entry points. The control layer must be able to natively
  801. /// marshall arguments and call DLL function exports using C calling conventions.
  802. ///
  803. /// @section engineFunction_callout Call-outs
  804. ///
  805. /// Call-outs are exposed as pointer-sized memory locations into which the control layer needs
  806. /// to install addresses of functions that receive the call from the engine back into the control
  807. /// layer. The function has to follow C calling conventions and
  808. ///
  809. /// A call-out will initially be set to NULL and while being NULL, will simply cause the engine
  810. /// to skip and ignore the call-out. This allows the control layer to only install call-outs
  811. /// it is actually interested in.
  812. ///
  813. class EngineFunctionInfo : public EngineExport
  814. {
  815. public:
  816. DECLARE_CLASS( EngineFunctionInfo, EngineExport );
  817. protected:
  818. /// A combination of EngineFunctionFlags.
  819. BitSet32 mFunctionFlags;
  820. /// The type of the function.
  821. const EngineTypeInfo* mFunctionType;
  822. /// Default values for the function arguments.
  823. const EngineFunctionDefaultArguments* mDefaultArgumentValues;
  824. /// Name of the DLL symbol denoting the address of the exported entity.
  825. const char* mBindingName;
  826. /// Full function prototype string. Useful for quick printing and most importantly,
  827. /// this will be the only place containing information about the argument names.
  828. const char* mPrototypeString;
  829. /// Address of either the function implementation or the variable taking the address
  830. /// of a call-out.
  831. void* mAddress;
  832. /// Next function in the global link chain of engine functions.
  833. EngineFunctionInfo* mNextFunction;
  834. /// First function in the global link chain of engine functions.
  835. static EngineFunctionInfo* smFirstFunction;
  836. public:
  837. ///
  838. EngineFunctionInfo( const char* name,
  839. EngineExportScope* scope,
  840. const char* docString,
  841. const char* protoypeString,
  842. const char* bindingName,
  843. const EngineTypeInfo* functionType,
  844. const EngineFunctionDefaultArguments* defaultArgs,
  845. void* address,
  846. U32 flags );
  847. /// Return the name of the function.
  848. const char* getFunctionName() const { return getExportName(); }
  849. /// Return the function's full prototype string including the return type, function name,
  850. /// and argument list.
  851. const char* getPrototypeString() const { return mPrototypeString; }
  852. /// Return the DLL export symbol name.
  853. const char* getBindingName() const { return mBindingName; }
  854. /// Test whether this is a callout function.
  855. bool isCallout() const { return mFunctionFlags.test( EngineFunctionCallout ); }
  856. /// Test whether the function is variadic, i.e. takes a variable number of arguments.
  857. bool isVariadic() const { return mFunctionType->isVariadic(); }
  858. /// Return the type of this function.
  859. const EngineTypeInfo* getFunctionType() const { return mFunctionType; }
  860. /// Return the return type of the function.
  861. const EngineTypeInfo* getReturnType() const { return getFunctionType()->getArgumentTypeTable()->getReturnType(); }
  862. /// Return the number of arguments that this function takes. If the function is variadic,
  863. /// this is the number of fixed arguments.
  864. U32 getNumArguments() const { return getFunctionType()->getArgumentTypeTable()->getNumArguments(); }
  865. ///
  866. const EngineTypeInfo* getArgumentType( U32 index ) const { return ( *( getFunctionType()->getArgumentTypeTable() ) )[ index ]; }
  867. /// Return the vector storing the default argument values.
  868. const EngineFunctionDefaultArguments* getDefaultArguments() const { return mDefaultArgumentValues; }
  869. /// Reset all callout function pointers back to NULL. This deactivates all callbacks.
  870. static void resetAllCallouts();
  871. };
  872. ///
  873. ///
  874. /// Due to the given argument types and return type being directly used as is, it is not possible
  875. /// to use this macro with engine types that have more complex value passing semantics (like e.g.
  876. /// String). Use engineAPI in this case.
  877. ///
  878. /// @note The method of defining functions exposed by this macro is very low-level. To more
  879. /// conveniently define API functions and methods, use the facilities provided in engineAPI.h.
  880. ///
  881. /// @see engineAPI.h
  882. #define DEFINE_CALLIN( bindingName, exportName, scope, returnType, args, defaultArgs, flags, doc ) \
  883. TORQUE_API returnType bindingName args; \
  884. namespace { namespace _ ## bindingName { \
  885. _EngineFunctionDefaultArguments< void args > sDefaultArgs defaultArgs; \
  886. EngineFunctionInfo sFunctionInfo( \
  887. #exportName, \
  888. &_SCOPE< scope >()(), \
  889. doc, \
  890. #returnType " " #exportName #args, \
  891. #bindingName, \
  892. TYPE< returnType args >(), \
  893. &sDefaultArgs, \
  894. ( void* ) &bindingName, \
  895. _EngineFunctionFlags( flags ) \
  896. ); \
  897. } } \
  898. TORQUE_API returnType bindingName args
  899. ///
  900. ///
  901. /// Not all control layers may be able to access data variables in a DLL so this macro exposes
  902. /// both the variable and a set_XXX function to set the variable programmatically.
  903. #define DEFINE_CALLOUT( bindingName, exportName, scope, returnType, args, flags, doc ) \
  904. TORQUE_API returnType ( *bindingName ) args; \
  905. TORQUE_API void set_ ## bindingName( returnType ( *fn ) args ) \
  906. { bindingName = fn; } \
  907. returnType ( *bindingName ) args; \
  908. namespace { \
  909. ::EngineFunctionInfo _cb ## bindingName( \
  910. #exportName, \
  911. &::_SCOPE< scope >()(), \
  912. doc, \
  913. #returnType " " #exportName #args, \
  914. #bindingName, \
  915. ::TYPE< returnType args >(), \
  916. NULL, \
  917. ( void* ) &bindingName, \
  918. EngineFunctionCallout | EngineFunctionFlags( flags ) \
  919. ); \
  920. }
  921. #endif // !_ENGINEFUNCTIONS_H_