vmd_empty_ppdata.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Functionality for "empty" seqs and tuples</title>
  5. <link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;The Variadic Macro Data Library 1.9">
  8. <link rel="up" href="../vmd_useful.html" title="Useful variadic macros not in Boost PP">
  9. <link rel="prev" href="vmd_identity.html" title="Generating emptiness and identity">
  10. <link rel="next" href="../vmd_internal_macros.html" title="Controlling internal usage">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="vmd_identity.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../vmd_useful.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../vmd_internal_macros.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h3 class="title">
  27. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata"></a><a class="link" href="vmd_empty_ppdata.html" title='Functionality for "empty" seqs and tuples'>Functionality
  28. for "empty" seqs and tuples</a>
  29. </h3></div></div></div>
  30. <p>
  31. Boost PP arrays and lists can be empty but seqs and tuples cannot. The form
  32. of an empty array is '(0,())' and the form of an empty list is 'BOOST_PP_NIL'.
  33. But the form of '()' does not represent an empty seq or an empty tuple. Instead
  34. for a seq it represents a one element seq whose data is empty, while for
  35. a tuple it represents a tuple with a size of 1 whose single element is empty.
  36. </p>
  37. <p>
  38. Not having a way to represent an empty seq or tuple represents a small problem
  39. for Boost PP users. For a tuple, especially, not being able to be "empty"
  40. is the only reason, when variadic macros are supported, why an end-user might
  41. prefer to use an array rather than a tuple as Boost PP preprocessor data.
  42. Otherwise, when using variadic macros, using a tuple is easier to notate
  43. and subsequently use than an array since no effort is needed to specify the
  44. number of elements of a tuple.
  45. </p>
  46. <p>
  47. VMD as we have seen has functionality to tell when preprocessor data is "empty"
  48. through its BOOST_VMD_IS_EMPTY macro. Because of this it is possible to treat
  49. emptiness, when applied to a seq or tuple, as an empty seq or an empty tuple
  50. respectively, thus allowing seqs and tuples to be empty, just as arrays and
  51. lists are.
  52. </p>
  53. <p>
  54. However there is one large problem when treating emptiness as an empty seq
  55. or empty tuple; Boost PP functionality for a seq or tuple knows nothing about
  56. it. In other words if you passed emptiness to a Boost PP macro which expects
  57. a seq or tuple, such as:
  58. </p>
  59. <pre class="programlisting"><span class="identifier">BOOST_PP_SEQ_SIZE</span><span class="special">()</span>
  60. </pre>
  61. <p>
  62. or
  63. </p>
  64. <pre class="programlisting"><span class="identifier">BOOST_PP_TUPLE_PUSH_BACK</span><span class="special">(,</span><span class="number">1</span><span class="special">)</span>
  65. </pre>
  66. <p>
  67. you would get UB, undefined behavior.
  68. </p>
  69. <p>
  70. In order to use seqs and tuples which can be empty VMD defines a number of
  71. macros which mimic many of those in Boost PP, but begin with BOOST_VMD_ rather
  72. than BOOST_PP_. The VMD macros work with what I will call a 'VMD seq' or
  73. a 'VMD tuple', while the Boost PP equivalents work with the traditional seq
  74. or tuple. A VMD seq is a seq which may be empty and a VMD tuple is a tuple
  75. which may be empty. A VMD seq is therefore a superset of a normal seq and
  76. a VMD tuple is therefore a superset of a normal tuple. The VMD functionality
  77. therefore can accept a VMD seq or tuple or a normal seq or tuple whereas
  78. the equivalent Boost PP functionality only accepts a normal seq or tuple.
  79. To be more more precise the Boost PP functionality can accept a VMD seq or
  80. a VMD tuple as long as it is not empty. In other words there is no difference
  81. between a non-empty VMD seq or a Boost PP seq, or between a non-empty VMD
  82. tuple and a Boost PP tuple.
  83. </p>
  84. <p>
  85. The particular macros which VMD supplies, supporting VMD seqs and VMD tuples,
  86. are divided between array, list, seq, and tuple functionality. The actual
  87. header files for these macros are in sub-directories of the VMD directory,
  88. which start respectively with 'array','list','seq' and 'tuple'. The header
  89. files are all also included in the general boost/vmd/vmd.hpp header file.
  90. </p>
  91. <h5>
  92. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.h0"></a>
  93. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.array_macros"></a></span><a class="link" href="vmd_empty_ppdata.html#variadic_macro_data.vmd_useful.vmd_empty_ppdata.array_macros">Array
  94. macros</a>
  95. </h5>
  96. <p>
  97. The array macros provide conversions from an array to a VMD seq or a VMD
  98. tuple. The array macros are:
  99. </p>
  100. <div class="table">
  101. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.vpp_array"></a><p class="title"><b>Table&#160;1.2.&#160;Array macros</b></p>
  102. <div class="table-contents"><table class="table" summary="Array macros">
  103. <colgroup>
  104. <col>
  105. <col>
  106. <col>
  107. <col>
  108. <col>
  109. </colgroup>
  110. <thead><tr>
  111. <th>
  112. <p>
  113. Macro
  114. </p>
  115. </th>
  116. <th>
  117. <p>
  118. Parameter
  119. </p>
  120. </th>
  121. <th>
  122. <p>
  123. Return
  124. </p>
  125. </th>
  126. <th>
  127. <p>
  128. Functionality
  129. </p>
  130. </th>
  131. <th>
  132. <p>
  133. Header
  134. </p>
  135. </th>
  136. </tr></thead>
  137. <tbody>
  138. <tr>
  139. <td>
  140. <p>
  141. BOOST_VMD_ARRAY_TO_SEQ
  142. </p>
  143. </td>
  144. <td>
  145. <p>
  146. array = a Boost PP array
  147. </p>
  148. </td>
  149. <td>
  150. <p>
  151. A VMD seq
  152. </p>
  153. </td>
  154. <td>
  155. <p>
  156. Converts an array to a VMD seq. If the array is empty the seq is
  157. empty, otherwise the conversion is the same as BOOST_PP_ARRAY_TO_SEQ
  158. </p>
  159. </td>
  160. <td>
  161. <p>
  162. boost/vmd/array/to_seq.hpp
  163. </p>
  164. </td>
  165. </tr>
  166. <tr>
  167. <td>
  168. <p>
  169. BOOST_VMD_ARRAY_TO_TUPLE
  170. </p>
  171. </td>
  172. <td>
  173. <p>
  174. array = a Boost PP array
  175. </p>
  176. </td>
  177. <td>
  178. <p>
  179. A VMD tuple
  180. </p>
  181. </td>
  182. <td>
  183. <p>
  184. Converts an array to a VMD tuple. If the array is empty the tuple
  185. is empty, otherwise the conversion is the same as BOOST_PP_ARRAY_TO_TUPLE
  186. </p>
  187. </td>
  188. <td>
  189. <p>
  190. boost/vmd/array/to_tuple.hpp
  191. </p>
  192. </td>
  193. </tr>
  194. </tbody>
  195. </table></div>
  196. </div>
  197. <br class="table-break"><p>
  198. The difference between the array conversion macros and their equivalent ones
  199. in Boost PP is that if the array is empty the VMD macros return emptiness
  200. whereas the Boost PP macros have UB.
  201. </p>
  202. <p>
  203. You can include the array macros either using their individual header files,
  204. the general 'boost/vmd/array.hpp' header file for all array macros, or the
  205. general header file 'boost/vmd/vmd.hpp' for all macros.
  206. </p>
  207. <h5>
  208. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.h1"></a>
  209. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.list_macros"></a></span><a class="link" href="vmd_empty_ppdata.html#variadic_macro_data.vmd_useful.vmd_empty_ppdata.list_macros">List
  210. macros</a>
  211. </h5>
  212. <p>
  213. The list macros provide conversions from a list to a VMD seq or a VMD tuple.
  214. The list macros are:
  215. </p>
  216. <div class="table">
  217. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.vpp_list"></a><p class="title"><b>Table&#160;1.3.&#160;List macros</b></p>
  218. <div class="table-contents"><table class="table" summary="List macros">
  219. <colgroup>
  220. <col>
  221. <col>
  222. <col>
  223. <col>
  224. <col>
  225. </colgroup>
  226. <thead><tr>
  227. <th>
  228. <p>
  229. Macro
  230. </p>
  231. </th>
  232. <th>
  233. <p>
  234. Parameter
  235. </p>
  236. </th>
  237. <th>
  238. <p>
  239. Return
  240. </p>
  241. </th>
  242. <th>
  243. <p>
  244. Functionality
  245. </p>
  246. </th>
  247. <th>
  248. <p>
  249. Header
  250. </p>
  251. </th>
  252. </tr></thead>
  253. <tbody>
  254. <tr>
  255. <td>
  256. <p>
  257. BOOST_VMD_LIST_TO_SEQ
  258. </p>
  259. </td>
  260. <td>
  261. <p>
  262. list = a Boost PP list
  263. </p>
  264. </td>
  265. <td>
  266. <p>
  267. A VMD seq
  268. </p>
  269. </td>
  270. <td>
  271. <p>
  272. Converts a list to a VMD seq. If the list is empty the seq is empty,
  273. otherwise the conversion is the same as BOOST_PP_LIST_TO_SEQ
  274. </p>
  275. </td>
  276. <td>
  277. <p>
  278. boost/vmd/list/to_seq.hpp
  279. </p>
  280. </td>
  281. </tr>
  282. <tr>
  283. <td>
  284. <p>
  285. BOOST_VMD_LIST_TO_TUPLE
  286. </p>
  287. </td>
  288. <td>
  289. <p>
  290. list = a Boost PP list
  291. </p>
  292. </td>
  293. <td>
  294. <p>
  295. A VMD tuple
  296. </p>
  297. </td>
  298. <td>
  299. <p>
  300. Converts a list to a VMD tuple. If the list is empty the tuple
  301. is empty, otherwise the conversion is the same as BOOST_PP_LIST_TO_TUPLE
  302. </p>
  303. </td>
  304. <td>
  305. <p>
  306. boost/vmd/list/to_tuple.hpp
  307. </p>
  308. </td>
  309. </tr>
  310. </tbody>
  311. </table></div>
  312. </div>
  313. <br class="table-break"><p>
  314. The difference between the list conversion macros and their equivalent ones
  315. in Boost PP is that if the list is empty the VMD macros return emptiness
  316. whereas the Boost PP macros have UB.
  317. </p>
  318. <p>
  319. You can include the list macros either using their individual header files,
  320. the general 'boost/vmd/list.hpp' header file for all list macros, or the
  321. general header file 'boost/vmd/vmd.hpp' for all macros.
  322. </p>
  323. <h5>
  324. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.h2"></a>
  325. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.seq_macros"></a></span><a class="link" href="vmd_empty_ppdata.html#variadic_macro_data.vmd_useful.vmd_empty_ppdata.seq_macros">Seq
  326. macros</a>
  327. </h5>
  328. <p>
  329. The seq macros either work with a VMD seq or return A VMD seq. The seq macros
  330. are:
  331. </p>
  332. <div class="table">
  333. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.vpp_seq"></a><p class="title"><b>Table&#160;1.4.&#160;Seq macros</b></p>
  334. <div class="table-contents"><table class="table" summary="Seq macros">
  335. <colgroup>
  336. <col>
  337. <col>
  338. <col>
  339. <col>
  340. <col>
  341. </colgroup>
  342. <thead><tr>
  343. <th>
  344. <p>
  345. Macro
  346. </p>
  347. </th>
  348. <th>
  349. <p>
  350. Parameter
  351. </p>
  352. </th>
  353. <th>
  354. <p>
  355. Return
  356. </p>
  357. </th>
  358. <th>
  359. <p>
  360. Functionality
  361. </p>
  362. </th>
  363. <th>
  364. <p>
  365. Header
  366. </p>
  367. </th>
  368. </tr></thead>
  369. <tbody>
  370. <tr>
  371. <td>
  372. <p>
  373. BOOST_VMD_IS_VMD_SEQ
  374. </p>
  375. </td>
  376. <td>
  377. <p>
  378. sequence = a VMD sequence
  379. </p>
  380. </td>
  381. <td>
  382. <p>
  383. 1 if the VMD sequence is a VMD seq, else 0
  384. </p>
  385. </td>
  386. <td>
  387. <p>
  388. Tests a sequence as a VMD seq. If the sequence is empty returns
  389. 1, otherwise returns the same as BOOST_VMD_IS_SEQ
  390. </p>
  391. </td>
  392. <td>
  393. <p>
  394. boost/vmd/seq/is_vmd_seq.hpp
  395. </p>
  396. </td>
  397. </tr>
  398. <tr>
  399. <td>
  400. <p>
  401. BOOST_VMD_SEQ_POP_BACK
  402. </p>
  403. </td>
  404. <td>
  405. <p>
  406. seq = a Boost PP seq
  407. </p>
  408. </td>
  409. <td>
  410. <p>
  411. A VMD seq
  412. </p>
  413. </td>
  414. <td>
  415. <p>
  416. Pops an element from the end of a seq. If the seq has a single
  417. element returns an empty seq, otherwise works exactly the same
  418. as BOOST_PP_SEQ_POP_BACK
  419. </p>
  420. </td>
  421. <td>
  422. <p>
  423. boost/vmd/seq/pop_back.hpp
  424. </p>
  425. </td>
  426. </tr>
  427. <tr>
  428. <td>
  429. <p>
  430. BOOST_VMD_SEQ_POP_FRONT
  431. </p>
  432. </td>
  433. <td>
  434. <p>
  435. seq = a Boost PP seq
  436. </p>
  437. </td>
  438. <td>
  439. <p>
  440. A VMD seq
  441. </p>
  442. </td>
  443. <td>
  444. <p>
  445. Pops an element from the beginning of a seq. If the seq has a single
  446. element returns an empty seq, otherwise works exactly the same
  447. as BOOST_PP_SEQ_POP_FRONT
  448. </p>
  449. </td>
  450. <td>
  451. <p>
  452. boost/vmd/seq/pop_front.hpp
  453. </p>
  454. </td>
  455. </tr>
  456. <tr>
  457. <td>
  458. <p>
  459. BOOST_VMD_SEQ_PUSH_BACK
  460. </p>
  461. </td>
  462. <td>
  463. <p>
  464. seq = a VMD seq, elem = element to push onto the end of the VMD
  465. seq
  466. </p>
  467. </td>
  468. <td>
  469. <p>
  470. A Boost PP seq
  471. </p>
  472. </td>
  473. <td>
  474. <p>
  475. Pushes an element onto the end of a VMD seq. If the VMD seq is
  476. empty the returned seq consists of that element, otherwise works
  477. exactly the same as BOOST_PP_SEQ_PUSH_BACK
  478. </p>
  479. </td>
  480. <td>
  481. <p>
  482. boost/vmd/seq/push_back.hpp
  483. </p>
  484. </td>
  485. </tr>
  486. <tr>
  487. <td>
  488. <p>
  489. BOOST_VMD_SEQ_PUSH_FRONT
  490. </p>
  491. </td>
  492. <td>
  493. <p>
  494. seq = a VMD seq, elem = element to push onto the beginning of the
  495. VMD seq
  496. </p>
  497. </td>
  498. <td>
  499. <p>
  500. A Boost PP seq
  501. </p>
  502. </td>
  503. <td>
  504. <p>
  505. Pushes an element onto the beginning of a VMD seq. If the VMD seq
  506. is empty the returned seq consists of that element, otherwise works
  507. exactly the same as BOOST_PP_SEQ_PUSH_FRONT
  508. </p>
  509. </td>
  510. <td>
  511. <p>
  512. boost/vmd/seq/push_front.hpp
  513. </p>
  514. </td>
  515. </tr>
  516. <tr>
  517. <td>
  518. <p>
  519. BOOST_VMD_SEQ_REMOVE
  520. </p>
  521. </td>
  522. <td>
  523. <p>
  524. seq = a Boost PP seq, i = index of element to remove
  525. </p>
  526. </td>
  527. <td>
  528. <p>
  529. A VMD seq
  530. </p>
  531. </td>
  532. <td>
  533. <p>
  534. Removes an element from a Boost PP seq. If the seq has a single
  535. element and the index to be removed is 0 returns an empty seq,
  536. otherwise works exactly the same as BOOST_PP_SEQ_REMOVE
  537. </p>
  538. </td>
  539. <td>
  540. <p>
  541. boost/vmd/seq/remove.hpp
  542. </p>
  543. </td>
  544. </tr>
  545. <tr>
  546. <td>
  547. <p>
  548. BOOST_VMD_SEQ_SIZE
  549. </p>
  550. </td>
  551. <td>
  552. <p>
  553. seq = a VMD seq
  554. </p>
  555. </td>
  556. <td>
  557. <p>
  558. The number of elements in the VMD seq
  559. </p>
  560. </td>
  561. <td>
  562. <p>
  563. Returns the number of elements in the VMD seq. If the seq is empty
  564. returns 0, otherwise works exactly the same as BOOST_PP_SEQ_SIZE
  565. </p>
  566. </td>
  567. <td>
  568. <p>
  569. boost/vmd/seq/size.hpp
  570. </p>
  571. </td>
  572. </tr>
  573. <tr>
  574. <td>
  575. <p>
  576. BOOST_VMD_SEQ_TO_ARRAY
  577. </p>
  578. </td>
  579. <td>
  580. <p>
  581. seq = a VMD seq
  582. </p>
  583. </td>
  584. <td>
  585. <p>
  586. A Boost PP array
  587. </p>
  588. </td>
  589. <td>
  590. <p>
  591. Converts a VMD seq to a Boost PP array. If the seq is empty returns
  592. an empty array whose form is '(0,())', otherwise works exactly
  593. the same as BOOST_PP_SEQ_TO_ARRAY
  594. </p>
  595. </td>
  596. <td>
  597. <p>
  598. boost/vmd/seq/to_array.hpp
  599. </p>
  600. </td>
  601. </tr>
  602. <tr>
  603. <td>
  604. <p>
  605. BOOST_VMD_SEQ_TO_LIST
  606. </p>
  607. </td>
  608. <td>
  609. <p>
  610. seq = a VMD seq
  611. </p>
  612. </td>
  613. <td>
  614. <p>
  615. A Boost PP list
  616. </p>
  617. </td>
  618. <td>
  619. <p>
  620. Converts a VMD seq to a Boost PP list. If the seq is empty returns
  621. an empty list whose form is 'BOOST_PP_NIL', otherwise works exactly
  622. the same as BOOST_PP_SEQ_TO_LIST
  623. </p>
  624. </td>
  625. <td>
  626. <p>
  627. boost/vmd/seq/to_list.hpp
  628. </p>
  629. </td>
  630. </tr>
  631. <tr>
  632. <td>
  633. <p>
  634. BOOST_VMD_SEQ_TO_TUPLE
  635. </p>
  636. </td>
  637. <td>
  638. <p>
  639. seq = a VMD seq
  640. </p>
  641. </td>
  642. <td>
  643. <p>
  644. A VMD tuple
  645. </p>
  646. </td>
  647. <td>
  648. <p>
  649. Converts a VMD seq to a VMD tuple. If the seq is empty returns
  650. an empty tuple, otherwise works exactly the same as BOOST_PP_SEQ_TO_TUPLE
  651. </p>
  652. </td>
  653. <td>
  654. <p>
  655. boost/vmd/seq/to_tuple.hpp
  656. </p>
  657. </td>
  658. </tr>
  659. </tbody>
  660. </table></div>
  661. </div>
  662. <br class="table-break"><p>
  663. The difference between the seq macros and their equivalent ones in Boost
  664. PP is that working with a VMD seq or returning a VMD seq is valid with the
  665. seq macros but with the Boost PP equivalent macros working with an empty
  666. seq causes UB and returning an empty seq can never occur.
  667. </p>
  668. <p>
  669. You can include the seq macros either using their individual header files,
  670. the general 'boost/vmd/seq.hpp' header file for all seq macros, or the general
  671. header file 'boost/vmd/vmd.hpp' for all macros.
  672. </p>
  673. <h5>
  674. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.h3"></a>
  675. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.tuple_macros"></a></span><a class="link" href="vmd_empty_ppdata.html#variadic_macro_data.vmd_useful.vmd_empty_ppdata.tuple_macros">Tuple
  676. macros</a>
  677. </h5>
  678. <p>
  679. The tuple macros either work with a VMD tuple or return a VMD tuple. The
  680. tuple macros are:
  681. </p>
  682. <div class="table">
  683. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.vpp_tuple"></a><p class="title"><b>Table&#160;1.5.&#160;Tuple macros</b></p>
  684. <div class="table-contents"><table class="table" summary="Tuple macros">
  685. <colgroup>
  686. <col>
  687. <col>
  688. <col>
  689. <col>
  690. <col>
  691. </colgroup>
  692. <thead><tr>
  693. <th>
  694. <p>
  695. Macro
  696. </p>
  697. </th>
  698. <th>
  699. <p>
  700. Parameter
  701. </p>
  702. </th>
  703. <th>
  704. <p>
  705. Return
  706. </p>
  707. </th>
  708. <th>
  709. <p>
  710. Functionality
  711. </p>
  712. </th>
  713. <th>
  714. <p>
  715. Header
  716. </p>
  717. </th>
  718. </tr></thead>
  719. <tbody>
  720. <tr>
  721. <td>
  722. <p>
  723. BOOST_VMD_IS_VMD_TUPLE
  724. </p>
  725. </td>
  726. <td>
  727. <p>
  728. sequence = a VMD sequence
  729. </p>
  730. </td>
  731. <td>
  732. <p>
  733. 1 if the VMD sequence is a VMD tuple, else 0
  734. </p>
  735. </td>
  736. <td>
  737. <p>
  738. Tests a sequence as a VMD tuple. If the sequence is empty returns
  739. 1, otherwise returns the same as BOOST_VMD_IS_TUPLE
  740. </p>
  741. </td>
  742. <td>
  743. <p>
  744. boost/vmd/tuple/is_vmd_tuple.hpp
  745. </p>
  746. </td>
  747. </tr>
  748. <tr>
  749. <td>
  750. <p>
  751. BOOST_VMD_TUPLE_POP_BACK
  752. </p>
  753. </td>
  754. <td>
  755. <p>
  756. tuple = a Boost PP tuple
  757. </p>
  758. </td>
  759. <td>
  760. <p>
  761. A VMD tuple
  762. </p>
  763. </td>
  764. <td>
  765. <p>
  766. Pops an element from the end of a tuple. If the tuple's size is
  767. 1 returns an empty tuple, otherwise works exactly the same as BOOST_PP_TUPLE_POP_BACK
  768. </p>
  769. </td>
  770. <td>
  771. <p>
  772. boost/vmd/tuple/pop_back.hpp
  773. </p>
  774. </td>
  775. </tr>
  776. <tr>
  777. <td>
  778. <p>
  779. BOOST_VMD_TUPLE_POP_FRONT
  780. </p>
  781. </td>
  782. <td>
  783. <p>
  784. tuple = a Boost PP tuple
  785. </p>
  786. </td>
  787. <td>
  788. <p>
  789. A VMD tuple
  790. </p>
  791. </td>
  792. <td>
  793. <p>
  794. Pops an element from the beginning of a tuple. If the tuple's size
  795. is 1 returns an empty tuple, otherwise works exactly the same as
  796. BOOST_PP_TUPLE_POP_FRONT
  797. </p>
  798. </td>
  799. <td>
  800. <p>
  801. boost/vmd/tuple/pop_front.hpp
  802. </p>
  803. </td>
  804. </tr>
  805. <tr>
  806. <td>
  807. <p>
  808. BOOST_VMD_TUPLE_PUSH_BACK
  809. </p>
  810. </td>
  811. <td>
  812. <p>
  813. tuple = a VMD tuple, elem = element to push onto the end of the
  814. VMD tuple
  815. </p>
  816. </td>
  817. <td>
  818. <p>
  819. A Boost PP tuple
  820. </p>
  821. </td>
  822. <td>
  823. <p>
  824. Pushes an element onto the end of a VMD tuple. If the VMD tuple
  825. is empty the returned tuple consists of that element, otherwise
  826. works exactly the same as BOOST_PP_TUPLE_PUSH_BACK
  827. </p>
  828. </td>
  829. <td>
  830. <p>
  831. boost/vmd/tuple/push_back.hpp
  832. </p>
  833. </td>
  834. </tr>
  835. <tr>
  836. <td>
  837. <p>
  838. BOOST_VMD_TUPLE_PUSH_FRONT
  839. </p>
  840. </td>
  841. <td>
  842. <p>
  843. tuple = a VMD tuple, elem = element to push onto the beginning
  844. of the VMD tuple
  845. </p>
  846. </td>
  847. <td>
  848. <p>
  849. A Boost PP tuple
  850. </p>
  851. </td>
  852. <td>
  853. <p>
  854. Pushes an element onto the beginning of a VMD tuple. If the VMD
  855. tuple is empty the returned tuple consists of that element, otherwise
  856. works exactly the same as BOOST_PP_TUPLE_PUSH_FRONT
  857. </p>
  858. </td>
  859. <td>
  860. <p>
  861. boost/vmd/tuple/push_front.hpp
  862. </p>
  863. </td>
  864. </tr>
  865. <tr>
  866. <td>
  867. <p>
  868. BOOST_VMD_TUPLE_REMOVE
  869. </p>
  870. </td>
  871. <td>
  872. <p>
  873. tuple = a Boost PP tuple, i = index of element to remove
  874. </p>
  875. </td>
  876. <td>
  877. <p>
  878. A VMD tuple
  879. </p>
  880. </td>
  881. <td>
  882. <p>
  883. Removes an element from a Boost PP tuple. If the tuple has a single
  884. element and the index to be removed is 0 returns an empty tuple,
  885. otherwise works exactly the same as BOOST_PP_TUPLE_REMOVE
  886. </p>
  887. </td>
  888. <td>
  889. <p>
  890. boost/vmd/tuple/remove.hpp
  891. </p>
  892. </td>
  893. </tr>
  894. <tr>
  895. <td>
  896. <p>
  897. BOOST_VMD_TUPLE_SIZE
  898. </p>
  899. </td>
  900. <td>
  901. <p>
  902. tuple = a VMD tuple
  903. </p>
  904. </td>
  905. <td>
  906. <p>
  907. The number of elements in the VMD tuple
  908. </p>
  909. </td>
  910. <td>
  911. <p>
  912. Returns the number of elements in the VMD tuple. If the tuple is
  913. empty returns 0, otherwise works exactly the same as BOOST_PP_TUPLE_SIZE
  914. </p>
  915. </td>
  916. <td>
  917. <p>
  918. boost/vmd/tuple/size.hpp
  919. </p>
  920. </td>
  921. </tr>
  922. <tr>
  923. <td>
  924. <p>
  925. BOOST_VMD_TUPLE_TO_ARRAY
  926. </p>
  927. </td>
  928. <td>
  929. <p>
  930. tuple = a VMD tuple
  931. </p>
  932. </td>
  933. <td>
  934. <p>
  935. A Boost PP array
  936. </p>
  937. </td>
  938. <td>
  939. <p>
  940. Converts a VMD tuple to a Boost PP array. If the tuple is empty
  941. returns an empty array whose form is '(0,())', otherwise works
  942. exactly the same as BOOST_PP_TUPLE_TO_ARRAY
  943. </p>
  944. </td>
  945. <td>
  946. <p>
  947. boost/vmd/tuple/to_array.hpp
  948. </p>
  949. </td>
  950. </tr>
  951. <tr>
  952. <td>
  953. <p>
  954. BOOST_VMD_TUPLE_TO_LIST
  955. </p>
  956. </td>
  957. <td>
  958. <p>
  959. tuple = a VMD tuple
  960. </p>
  961. </td>
  962. <td>
  963. <p>
  964. A Boost PP list
  965. </p>
  966. </td>
  967. <td>
  968. <p>
  969. Converts a VMD tuple to a Boost PP list. If the tuple is empty
  970. returns an empty list whose form is 'BOOST_PP_NIL', otherwise works
  971. exactly the same as BOOST_PP_TUPLE_TO_LIST
  972. </p>
  973. </td>
  974. <td>
  975. <p>
  976. boost/vmd/tuple/to_list.hpp
  977. </p>
  978. </td>
  979. </tr>
  980. <tr>
  981. <td>
  982. <p>
  983. BOOST_VMD_TUPLE_TO_SEQ
  984. </p>
  985. </td>
  986. <td>
  987. <p>
  988. tuple = a VMD tuple
  989. </p>
  990. </td>
  991. <td>
  992. <p>
  993. A VMD seq
  994. </p>
  995. </td>
  996. <td>
  997. <p>
  998. Converts a VMD tuple to a VMD seq. If the tuple is empty returns
  999. an empty seq, otherwise works exactly the same as BOOST_PP_TUPLE_TO_SEQ
  1000. </p>
  1001. </td>
  1002. <td>
  1003. <p>
  1004. boost/vmd/tuple/to_seq.hpp
  1005. </p>
  1006. </td>
  1007. </tr>
  1008. </tbody>
  1009. </table></div>
  1010. </div>
  1011. <br class="table-break"><p>
  1012. The difference between the tuple macros and their equivalent ones in Boost
  1013. PP is that working with a VMD tuple or returning a VMD tuple is valid with
  1014. the tuple macros but with the Boost PP equivalent macros working with an
  1015. empty tuple causes UB and returning an empty tuple can never occur.
  1016. </p>
  1017. <p>
  1018. You can include the tuple macros either using their individual header files,
  1019. the general 'boost/vmd/tuple.hpp' header file for all tuple macros, or the
  1020. general header file 'boost/vmd/vmd.hpp' for all macros.
  1021. </p>
  1022. <h5>
  1023. <a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.h4"></a>
  1024. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_empty_ppdata.seq_and_tuple_functionality"></a></span><a class="link" href="vmd_empty_ppdata.html#variadic_macro_data.vmd_useful.vmd_empty_ppdata.seq_and_tuple_functionality">Seq
  1025. and tuple functionality</a>
  1026. </h5>
  1027. <p>
  1028. The set of macros for seq and tuple functionality which work with VMD seqs
  1029. and VMD tuples are largely only a subset of the seq and tuple functionality
  1030. in Boost PP. This reflects the fact that a number of macros in Boost PP for
  1031. working with a seq or tuple make no sense when extended to work with a possible
  1032. empty seq or empty tuple. For instance BOOST_PP_SEQ_FIRST_N could not mean
  1033. anything when passed an empty seq and BOOST_PP_TUPLE_REM_CTOR could not mean
  1034. anything when passed an empty tuple. Likewise for other Boost PP seq and
  1035. tuple macros which do not have a VMD equivalent.
  1036. </p>
  1037. <p>
  1038. The set of functionality in VMD for working with a possibly empty seq or
  1039. empty tuple makes it possible to add or remove elements in a seq or tuple
  1040. which could start out or end up empty, take the seq or tuple size even when
  1041. the seq or tuple is empty, convert between arrays, lists, seqs, or tuples
  1042. which could start out or end up empty, and test for a VMD seq or a VMD tuple.
  1043. This functionality should allow macro programmers the ability to work with
  1044. empty seqs and tuples while still using other Boost PP seq and tuple functuionality
  1045. to work with non-empty seqs and tuples. The easiest way to do this is to
  1046. use the VMD seq and VMD tuple equivalent functions when choosing between
  1047. VMD and Boost PP, and use the Boost PP seq and tuple functionality otherwise.
  1048. Just remember that Boost PP seq and tuple functionality can never work with
  1049. empty seqs or empty tuples.
  1050. </p>
  1051. </div>
  1052. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  1053. <td align="left"></td>
  1054. <td align="right"><div class="copyright-footer">Copyright &#169; 2010-2017 Tropic Software
  1055. East Inc</div></td>
  1056. </tr></table>
  1057. <hr>
  1058. <div class="spirit-nav">
  1059. <a accesskey="p" href="vmd_identity.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../vmd_useful.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../vmd_internal_macros.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  1060. </div>
  1061. </body>
  1062. </html>