engineFunctions.h 35 KB

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