indexing_support.html 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Indexing support</title>
  5. <link rel="stylesheet" href="../../boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../index.html" title="Boost.Python Reference Manual">
  8. <link rel="up" href="../topics.html" title="Chapter&#160;8.&#160;Topics">
  9. <link rel="prev" href="pickle_support.html" title="Pickle support">
  10. <link rel="next" href="../glossary.html" title="Chapter&#160;9.&#160;Glossary">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr><td valign="top"><img alt="" width="" height="" src="../../images/boost.png"></td></tr></table>
  14. <hr>
  15. <div class="spirit-nav">
  16. <a accesskey="p" href="pickle_support.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../topics.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../glossary.html"><img src="../../images/next.png" alt="Next"></a>
  17. </div>
  18. <div class="section">
  19. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  20. <a name="topics.indexing_support"></a><a class="link" href="indexing_support.html" title="Indexing support">Indexing support</a>
  21. </h2></div></div></div>
  22. <div class="toc"><dl class="toc">
  23. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.introduction">Introduction</a></span></dt>
  24. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.the_indexing_interface">The
  25. Indexing Interface</a></span></dt>
  26. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.index_suite_sub_classes">index_suite
  27. sub-classes</a></span></dt>
  28. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.indexing_suite_class"><code class="computeroutput"><span class="identifier">indexing_suite</span></code> class</a></span></dt>
  29. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.class_vector_indexing_suite">class
  30. <code class="computeroutput"><span class="identifier">vector_indexing_suite</span></code></a></span></dt>
  31. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.class_map_indexing_suite">class
  32. <code class="computeroutput"><span class="identifier">map_indexing_suite</span></code></a></span></dt>
  33. </dl></div>
  34. <div class="section">
  35. <div class="titlepage"><div><div><h3 class="title">
  36. <a name="topics.indexing_support.introduction"></a><a class="link" href="indexing_support.html#topics.indexing_support.introduction" title="Introduction">Introduction</a>
  37. </h3></div></div></div>
  38. <p>
  39. Indexing is a <code class="computeroutput"><span class="identifier">Boost</span> <span class="identifier">Python</span></code>
  40. facility for easy exportation of indexable C++ containers to Python. Indexable
  41. containers are containers that allow random access through the <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code>
  42. (e.g. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>).
  43. </p>
  44. <p>
  45. While <code class="computeroutput"><span class="identifier">Boost</span> <span class="identifier">Python</span></code>
  46. has all the facilities needed to expose indexable C++ containers such as
  47. the ubiquitous std::vector to Python, the procedure is not as straightforward
  48. as we'd like it to be. Python containers do not map easily to C++ containers.
  49. Emulating Python containers in C++ (see Python Reference Manual, <a href="http://www.python.org/doc/current/ref/sequence-types.html" target="_top">Emulating
  50. container types</a>) using <code class="computeroutput"><span class="identifier">Boost</span><span class="special">.</span><span class="identifier">Python</span></code>
  51. is non trivial. There are a lot of issues to consider before we can map
  52. a C++ container to Python. These involve implementing wrapper functions
  53. for the methods <code class="computeroutput"><span class="identifier">__len__</span></code>,
  54. <code class="computeroutput"><span class="identifier">__getitem__</span></code>, <code class="computeroutput"><span class="identifier">__setitem__</span></code>, <code class="computeroutput"><span class="identifier">__delitem__</span></code>,
  55. <code class="computeroutput"><span class="identifier">__iter__</span></code> and <code class="computeroutput"><span class="identifier">__contains__</span></code>.
  56. </p>
  57. <p>
  58. The goals:
  59. </p>
  60. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  61. <li class="listitem">
  62. Make indexable C++ containers behave exactly as one would expect a
  63. Python container to behave.
  64. </li>
  65. <li class="listitem">
  66. <p class="simpara">
  67. Provide default reference semantics for container element indexing
  68. (<code class="computeroutput"><span class="identifier">__getitem__</span></code>) such
  69. that c[i] can be mutable. Require:
  70. </p>
  71. <pre class="programlisting"><span class="identifier">val</span> <span class="special">=</span> <span class="identifier">c</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span>
  72. <span class="identifier">c</span><span class="special">[</span><span class="identifier">i</span><span class="special">].</span><span class="identifier">m</span><span class="special">()</span>
  73. <span class="identifier">val</span> <span class="special">==</span> <span class="identifier">c</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span>
  74. </pre>
  75. <p class="simpara">
  76. where m is a non-const (mutating) member function (method).
  77. </p>
  78. </li>
  79. <li class="listitem">
  80. Return safe references from <code class="computeroutput"><span class="identifier">__getitem__</span></code>
  81. such that subsequent adds and deletes to and from the container will
  82. not result in dangling references (will not crash Python).
  83. </li>
  84. <li class="listitem">
  85. Support slice indexes.
  86. </li>
  87. <li class="listitem">
  88. Accept Python container arguments (e.g. <code class="computeroutput"><span class="identifier">lists</span></code>,
  89. <code class="computeroutput"><span class="identifier">tuples</span></code>) wherever appropriate.
  90. </li>
  91. <li class="listitem">
  92. Allow for extensibility through re-definable policy classes.
  93. </li>
  94. <li class="listitem">
  95. Provide predefined support for the most common STL and STL-like indexable
  96. containers.
  97. </li>
  98. </ul></div>
  99. </div>
  100. <div class="section">
  101. <div class="titlepage"><div><div><h3 class="title">
  102. <a name="topics.indexing_support.the_indexing_interface"></a><a class="link" href="indexing_support.html#topics.indexing_support.the_indexing_interface" title="The Indexing Interface">The
  103. Indexing Interface</a>
  104. </h3></div></div></div>
  105. <p>
  106. The <code class="computeroutput"><span class="identifier">indexing_suite</span></code> class
  107. is the base class for the management of C++ containers intended to be integrated
  108. to Python. The objective is make a C++ container look and feel and behave
  109. exactly as we'd expect a Python container. The class automatically wraps
  110. these special Python methods (taken from the Python reference: Emulating
  111. container types):
  112. </p>
  113. <div class="variablelist">
  114. <p class="title"><b></b></p>
  115. <dl class="variablelist">
  116. <dt><span class="term">__len__(self)</span></dt>
  117. <dd><p>
  118. Called to implement the built-in function <code class="computeroutput"><span class="identifier">len</span><span class="special">()</span></code>. Should return the length of the
  119. object, an integer <code class="computeroutput"><span class="special">&gt;=</span> <span class="number">0</span></code>. Also, an object that doesn't define
  120. a <code class="computeroutput"><span class="identifier">__nonzero__</span><span class="special">()</span></code>
  121. method and whose <code class="computeroutput"><span class="identifier">__len__</span><span class="special">()</span></code> method returns zero is considered
  122. to be false in a Boolean context.
  123. </p></dd>
  124. <dt><span class="term">__getitem__(self, key)</span></dt>
  125. <dd><p>
  126. Called to implement evaluation of <code class="computeroutput"><span class="identifier">self</span><span class="special">[</span><span class="identifier">key</span><span class="special">]</span></code>. For sequence types, the accepted
  127. keys should be integers and slice objects. Note that the special
  128. interpretation of negative indexes (if the class wishes to emulate
  129. a sequence type) is up to the <code class="computeroutput"><span class="identifier">__getitem__</span><span class="special">()</span></code> method. If key is of an inappropriate
  130. type, <code class="computeroutput"><span class="identifier">TypeError</span></code> may
  131. be raised; if of a value outside the set of indexes for the sequence
  132. (after any special interpretation of negative values), IndexError
  133. should be raised. [Note: for loops expect that an IndexError will
  134. be raised for illegal indexes to allow proper detection of the end
  135. of the sequence.]
  136. </p></dd>
  137. <dt><span class="term">__setitem__(self, key, value)</span></dt>
  138. <dd><p>
  139. Called to implement assignment to self[key]. Same note as for __getitem__().
  140. This should only be implemented for mappings if the objects support
  141. changes to the values for keys, or if new keys can be added, or for
  142. sequences if elements can be replaced. The same exceptions should
  143. be raised for improper key values as for the __getitem__() method.
  144. </p></dd>
  145. <dt><span class="term">__delitem__(self, key)</span></dt>
  146. <dd><p>
  147. Called to implement deletion of self[key]. Same note as for __getitem__().
  148. This should only be implemented for mappings if the objects support
  149. removal of keys, or for sequences if elements can be removed from
  150. the sequence. The same exceptions should be raised for improper key
  151. values as for the __getitem__() method.
  152. </p></dd>
  153. <dt><span class="term">__iter__(self)</span></dt>
  154. <dd>
  155. <p>
  156. This method is called when an iterator is required for a container.
  157. This method should return a new iterator object that can iterate
  158. over all the objects in the container. For mappings, it should iterate
  159. over the keys of the container, and should also be made available
  160. as the method iterkeys().
  161. </p>
  162. <p>
  163. Iterator objects also need to implement this method; they are required
  164. to return themselves. For more information on iterator objects, see
  165. <a href="https://docs.python.org/3/library/stdtypes.html#iterator-types" target="_top">Iterator
  166. Types</a> in the <a href="https://docs.python.org/3/library/index.html" target="_top">Python
  167. Library Reference</a>.
  168. </p>
  169. </dd>
  170. <dt><span class="term">__contains__(self, item)</span></dt>
  171. <dd><p>
  172. Called to implement membership test operators. Should return true
  173. if item is in self, false otherwise. For mapping objects, this should
  174. consider the keys of the mapping rather than the values or the key-item
  175. pairs.
  176. </p></dd>
  177. </dl>
  178. </div>
  179. </div>
  180. <div class="section">
  181. <div class="titlepage"><div><div><h3 class="title">
  182. <a name="topics.indexing_support.index_suite_sub_classes"></a><a class="link" href="indexing_support.html#topics.indexing_support.index_suite_sub_classes" title="index_suite sub-classes">index_suite
  183. sub-classes</a>
  184. </h3></div></div></div>
  185. <div class="toc"><dl class="toc">
  186. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.index_suite_sub_classes.vector_index_suite">vector_index_suite</a></span></dt>
  187. <dt><span class="section"><a href="indexing_support.html#topics.indexing_support.index_suite_sub_classes.map_index_suite">map_index_suite</a></span></dt>
  188. </dl></div>
  189. <p>
  190. The <code class="computeroutput"><span class="identifier">indexing_suite</span></code> is not
  191. meant to be used as is. A couple of policy functions must be supplied by
  192. subclasses of <code class="computeroutput"><span class="identifier">indexing_suite</span></code>.
  193. However, a set of indexing_suite subclasses for the standard indexable
  194. STL containers will be provided, In most cases, we can simply use the available
  195. predefined suites. In some cases, we can refine the predefined suites to
  196. suit our needs.
  197. </p>
  198. <div class="section">
  199. <div class="titlepage"><div><div><h4 class="title">
  200. <a name="topics.indexing_support.index_suite_sub_classes.vector_index_suite"></a><a class="link" href="indexing_support.html#topics.indexing_support.index_suite_sub_classes.vector_index_suite" title="vector_index_suite">vector_index_suite</a>
  201. </h4></div></div></div>
  202. <p>
  203. The <code class="computeroutput"><span class="identifier">vector_indexing_suite</span></code>
  204. class is a predefined <code class="computeroutput"><span class="identifier">indexing_suite</span></code>
  205. derived class designed to wrap <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>
  206. (and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>-like [i.e. a class with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code> interface]) classes. It provides
  207. all the policies required by the <code class="computeroutput"><span class="identifier">indexing_suite</span></code>.
  208. </p>
  209. <p>
  210. Example usage:
  211. </p>
  212. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{...};</span>
  213. <span class="special">...</span>
  214. <span class="identifier">class_</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="special">&gt;(</span><span class="string">"XVec"</span><span class="special">)</span>
  215. <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="identifier">vector_indexing_suite</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="special">&gt;())</span>
  216. <span class="special">;</span>
  217. </pre>
  218. <p>
  219. XVec is now a full-fledged Python container (see the example in full,
  220. along with its python test).
  221. </p>
  222. </div>
  223. <div class="section">
  224. <div class="titlepage"><div><div><h4 class="title">
  225. <a name="topics.indexing_support.index_suite_sub_classes.map_index_suite"></a><a class="link" href="indexing_support.html#topics.indexing_support.index_suite_sub_classes.map_index_suite" title="map_index_suite">map_index_suite</a>
  226. </h4></div></div></div>
  227. <p>
  228. The <code class="computeroutput"><span class="identifier">map_indexing_suite</span></code>
  229. class is a predefined <code class="computeroutput"><span class="identifier">indexing_suite</span></code>
  230. derived class designed to wrap <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span></code>
  231. (and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span></code>-like [i.e. a class with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span></code> interface]) classes. It provides
  232. all the policies required by the <code class="computeroutput"><span class="identifier">indexing_suite</span></code>.
  233. </p>
  234. <p>
  235. Example usage:
  236. </p>
  237. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{...};</span>
  238. <span class="special">...</span>
  239. <span class="identifier">class_</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="special">&gt;(</span><span class="string">"XMap"</span><span class="special">)</span>
  240. <span class="special">.</span><span class="identifier">def</span><span class="special">(</span><span class="identifier">map_indexing_suite</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="special">&gt;())</span>
  241. <span class="special">;</span>
  242. </pre>
  243. <p>
  244. By default indexed elements are returned by proxy. This can be disabled
  245. by supplying <code class="computeroutput"><span class="keyword">true</span></code> in the
  246. <code class="computeroutput"><span class="identifier">NoProxy</span></code> template parameter.
  247. XMap is now a full-fledged Python container (see the example in full,
  248. along with its python test).
  249. </p>
  250. </div>
  251. </div>
  252. <div class="section">
  253. <div class="titlepage"><div><div><h3 class="title">
  254. <a name="topics.indexing_support.indexing_suite_class"></a><a class="link" href="indexing_support.html#topics.indexing_support.indexing_suite_class" title="indexing_suite class"><code class="computeroutput"><span class="identifier">indexing_suite</span></code> class</a>
  255. </h3></div></div></div>
  256. <div class="toc"><dl class="toc"><dt><span class="section"><a href="indexing_support.html#topics.indexing_support.indexing_suite_class.derivedpolicies">DerivedPolicies</a></span></dt></dl></div>
  257. <div class="informaltable"><table class="table">
  258. <colgroup>
  259. <col>
  260. <col>
  261. <col>
  262. <col>
  263. </colgroup>
  264. <thead><tr>
  265. <th>
  266. <p>
  267. Template Parameter
  268. </p>
  269. </th>
  270. <th>
  271. <p>
  272. Requirements
  273. </p>
  274. </th>
  275. <th>
  276. <p>
  277. Semantics
  278. </p>
  279. </th>
  280. <th>
  281. <p>
  282. Default
  283. </p>
  284. </th>
  285. </tr></thead>
  286. <tbody>
  287. <tr>
  288. <td>
  289. <p>
  290. Container
  291. </p>
  292. </td>
  293. <td>
  294. <p>
  295. A class type
  296. </p>
  297. </td>
  298. <td>
  299. <p>
  300. The container type to be wrapped to Python.
  301. </p>
  302. </td>
  303. <td>
  304. </td>
  305. </tr>
  306. <tr>
  307. <td>
  308. <p>
  309. DerivedPolicies
  310. </p>
  311. </td>
  312. <td>
  313. <p>
  314. A subclass of indexing_suite
  315. </p>
  316. </td>
  317. <td>
  318. <p>
  319. Derived classes provide the policy hooks. See DerivedPolicies
  320. below.
  321. </p>
  322. </td>
  323. <td>
  324. </td>
  325. </tr>
  326. <tr>
  327. <td>
  328. <p>
  329. NoProxy
  330. </p>
  331. </td>
  332. <td>
  333. <p>
  334. A boolean
  335. </p>
  336. </td>
  337. <td>
  338. <p>
  339. By default indexed elements have Python reference semantics and
  340. are returned by proxy. This can be disabled by supplying true
  341. in the NoProxy template parameter.
  342. </p>
  343. </td>
  344. <td>
  345. <p>
  346. false
  347. </p>
  348. </td>
  349. </tr>
  350. <tr>
  351. <td>
  352. <p>
  353. NoSlice
  354. </p>
  355. </td>
  356. <td>
  357. <p>
  358. A boolean
  359. </p>
  360. </td>
  361. <td>
  362. <p>
  363. Do not allow slicing.
  364. </p>
  365. </td>
  366. <td>
  367. <p>
  368. false
  369. </p>
  370. </td>
  371. </tr>
  372. <tr>
  373. <td>
  374. <p>
  375. Data
  376. </p>
  377. </td>
  378. <td>
  379. </td>
  380. <td>
  381. <p>
  382. The container's data type.
  383. </p>
  384. </td>
  385. <td>
  386. <p>
  387. Container::value_type
  388. </p>
  389. </td>
  390. </tr>
  391. <tr>
  392. <td>
  393. <p>
  394. Index
  395. </p>
  396. </td>
  397. <td>
  398. </td>
  399. <td>
  400. <p>
  401. The container's index type.
  402. </p>
  403. </td>
  404. <td>
  405. <p>
  406. Container::size_type
  407. </p>
  408. </td>
  409. </tr>
  410. <tr>
  411. <td>
  412. <p>
  413. Key
  414. </p>
  415. </td>
  416. <td>
  417. </td>
  418. <td>
  419. <p>
  420. The container's key type.
  421. </p>
  422. </td>
  423. <td>
  424. <p>
  425. Container::value_type
  426. </p>
  427. </td>
  428. </tr>
  429. </tbody>
  430. </table></div>
  431. <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Container</span><span class="special">,</span>
  432. <span class="keyword">class</span> <span class="identifier">DerivedPolicies</span><span class="special">,</span>
  433. <span class="keyword">bool</span> <span class="identifier">NoProxy</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">,</span>
  434. <span class="keyword">bool</span> <span class="identifier">NoSlice</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">,</span>
  435. <span class="keyword">class</span> <span class="identifier">Data</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">,</span>
  436. <span class="keyword">class</span> <span class="identifier">Index</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">size_type</span><span class="special">,</span>
  437. <span class="keyword">class</span> <span class="identifier">Key</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&gt;</span>
  438. <span class="keyword">class</span> <span class="identifier">indexing_suite</span> <span class="special">:</span> <span class="identifier">unspecified</span>
  439. <span class="special">{</span>
  440. <span class="keyword">public</span><span class="special">:</span>
  441. <span class="identifier">indexing_suite</span><span class="special">();</span> <span class="comment">// default constructor</span>
  442. <span class="special">}</span>
  443. </pre>
  444. <div class="section">
  445. <div class="titlepage"><div><div><h4 class="title">
  446. <a name="topics.indexing_support.indexing_suite_class.derivedpolicies"></a><a class="link" href="indexing_support.html#topics.indexing_support.indexing_suite_class.derivedpolicies" title="DerivedPolicies">DerivedPolicies</a>
  447. </h4></div></div></div>
  448. <p>
  449. Derived classes provide the hooks needed by the indexing_suite:
  450. </p>
  451. <pre class="programlisting"><span class="identifier">data_type</span><span class="special">&amp;</span>
  452. <span class="identifier">get_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">);</span>
  453. <span class="keyword">static</span> <span class="identifier">object</span>
  454. <span class="identifier">get_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">);</span>
  455. <span class="keyword">static</span> <span class="keyword">void</span>
  456. <span class="identifier">set_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">data_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span>
  457. <span class="keyword">static</span> <span class="keyword">void</span>
  458. <span class="identifier">set_slice</span><span class="special">(</span>
  459. <span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span>
  460. <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">,</span> <span class="identifier">data_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span>
  461. <span class="special">);</span>
  462. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Iter</span><span class="special">&gt;</span>
  463. <span class="keyword">static</span> <span class="keyword">void</span>
  464. <span class="identifier">set_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span>
  465. <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">last</span>
  466. <span class="special">);</span>
  467. <span class="keyword">static</span> <span class="keyword">void</span>
  468. <span class="identifier">delete_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">);</span>
  469. <span class="keyword">static</span> <span class="keyword">void</span>
  470. <span class="identifier">delete_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">);</span>
  471. <span class="keyword">static</span> <span class="identifier">size_t</span>
  472. <span class="identifier">size</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">);</span>
  473. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  474. <span class="keyword">static</span> <span class="keyword">bool</span>
  475. <span class="identifier">contains</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
  476. <span class="keyword">static</span> <span class="identifier">index_type</span>
  477. <span class="identifier">convert_index</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">i</span><span class="special">);</span>
  478. <span class="keyword">static</span> <span class="identifier">index_type</span>
  479. <span class="identifier">adjust_index</span><span class="special">(</span><span class="identifier">index_type</span> <span class="identifier">current</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span>
  480. <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">,</span> <span class="identifier">size_type</span> <span class="identifier">len</span><span class="special">);</span>
  481. </pre>
  482. <p>
  483. Most of these policies are self explanatory. However, convert_index and
  484. adjust_index deserve some explanation.
  485. </p>
  486. <p>
  487. convert_index converts a Python index into a C++ index that the container
  488. can handle. For instance, negative indexes in Python, by convention,
  489. start counting from the right(e.g. C<span class="strikethrough">1</span>
  490. indexes the rightmost element in C). convert_index should handle the
  491. necessary conversion for the C++ container (e.g. convert -1 to C.size()-1).
  492. convert_index should also be able to convert the type of the index (A
  493. dynamic Python type) to the actual type that the C++ container expects.
  494. </p>
  495. <p>
  496. When a container expands or contracts, held indexes to its elements must
  497. be adjusted to follow the movement of data. For instance, if we erase
  498. 3 elements, starting from index 0 from a 5 element vector, what used
  499. to be at index 4 will now be at index 1:
  500. </p>
  501. <pre class="programlisting"><span class="special">[</span><span class="identifier">a</span><span class="special">][</span><span class="identifier">b</span><span class="special">][</span><span class="identifier">c</span><span class="special">][</span><span class="identifier">d</span><span class="special">][</span><span class="identifier">e</span><span class="special">]</span> <span class="special">---&gt;</span> <span class="special">[</span><span class="identifier">d</span><span class="special">][</span><span class="identifier">e</span><span class="special">]</span>
  502. <span class="special">^</span> <span class="special">^</span>
  503. <span class="number">4</span> <span class="number">1</span>
  504. </pre>
  505. <p>
  506. adjust_index takes care of the adjustment. Given a current index, the
  507. function should return the adjusted index when data in the container
  508. at index from..to is replaced by len elements.
  509. </p>
  510. </div>
  511. </div>
  512. <div class="section">
  513. <div class="titlepage"><div><div><h3 class="title">
  514. <a name="topics.indexing_support.class_vector_indexing_suite"></a><a class="link" href="indexing_support.html#topics.indexing_support.class_vector_indexing_suite" title="class vector_indexing_suite">class
  515. <code class="computeroutput"><span class="identifier">vector_indexing_suite</span></code></a>
  516. </h3></div></div></div>
  517. <div class="informaltable"><table class="table">
  518. <colgroup>
  519. <col>
  520. <col>
  521. <col>
  522. <col>
  523. </colgroup>
  524. <thead><tr>
  525. <th>
  526. <p>
  527. Template Parameter
  528. </p>
  529. </th>
  530. <th>
  531. <p>
  532. Requirements
  533. </p>
  534. </th>
  535. <th>
  536. <p>
  537. Semantics
  538. </p>
  539. </th>
  540. <th>
  541. <p>
  542. Default
  543. </p>
  544. </th>
  545. </tr></thead>
  546. <tbody>
  547. <tr>
  548. <td>
  549. <p>
  550. Container
  551. </p>
  552. </td>
  553. <td>
  554. <p>
  555. A class type
  556. </p>
  557. </td>
  558. <td>
  559. <p>
  560. The container type to be wrapped to Python.
  561. </p>
  562. </td>
  563. <td>
  564. </td>
  565. </tr>
  566. <tr>
  567. <td>
  568. <p>
  569. NoProxy
  570. </p>
  571. </td>
  572. <td>
  573. <p>
  574. A boolean
  575. </p>
  576. </td>
  577. <td>
  578. <p>
  579. By default indexed elements have Python reference semantics and
  580. are returned by proxy. This can be disabled by supplying true
  581. in the NoProxy template parameter.
  582. </p>
  583. </td>
  584. <td>
  585. <p>
  586. false
  587. </p>
  588. </td>
  589. </tr>
  590. <tr>
  591. <td>
  592. <p>
  593. DerivedPolicies
  594. </p>
  595. </td>
  596. <td>
  597. <p>
  598. A subclass of indexing_suite
  599. </p>
  600. </td>
  601. <td>
  602. <p>
  603. The vector_indexing_suite may still be derived to further tweak
  604. any of the predefined policies. Static polymorphism through CRTP
  605. (James Coplien. "Curiously Recurring Template Pattern".
  606. C++ Report, Feb. 1995) enables the base indexing_suite class
  607. to call policy function of the most derived class
  608. </p>
  609. </td>
  610. <td>
  611. </td>
  612. </tr>
  613. </tbody>
  614. </table></div>
  615. <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Container</span><span class="special">,</span>
  616. <span class="keyword">bool</span> <span class="identifier">NoProxy</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">,</span>
  617. <span class="keyword">class</span> <span class="identifier">DerivedPolicies</span> <span class="special">=</span> <span class="identifier">unspecified_default</span><span class="special">&gt;</span>
  618. <span class="keyword">class</span> <span class="identifier">vector_indexing_suite</span> <span class="special">:</span> <span class="identifier">unspecified_base</span>
  619. <span class="special">{</span>
  620. <span class="keyword">public</span><span class="special">:</span>
  621. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">data_type</span><span class="special">;</span>
  622. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">key_type</span><span class="special">;</span>
  623. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">index_type</span><span class="special">;</span>
  624. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
  625. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">difference_type</span> <span class="identifier">difference_type</span><span class="special">;</span>
  626. <span class="identifier">data_type</span><span class="special">&amp;</span>
  627. <span class="identifier">get_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">);</span>
  628. <span class="keyword">static</span> <span class="identifier">object</span>
  629. <span class="identifier">get_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">);</span>
  630. <span class="keyword">static</span> <span class="keyword">void</span>
  631. <span class="identifier">set_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">data_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span>
  632. <span class="keyword">static</span> <span class="keyword">void</span>
  633. <span class="identifier">set_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span>
  634. <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">,</span> <span class="identifier">data_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span>
  635. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Iter</span><span class="special">&gt;</span>
  636. <span class="keyword">static</span> <span class="keyword">void</span>
  637. <span class="identifier">set_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span>
  638. <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">last</span><span class="special">);</span>
  639. <span class="keyword">static</span> <span class="keyword">void</span>
  640. <span class="identifier">delete_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">);</span>
  641. <span class="keyword">static</span> <span class="keyword">void</span>
  642. <span class="identifier">delete_slice</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">);</span>
  643. <span class="keyword">static</span> <span class="identifier">size_t</span>
  644. <span class="identifier">size</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">);</span>
  645. <span class="keyword">static</span> <span class="keyword">bool</span>
  646. <span class="identifier">contains</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">key_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">key</span><span class="special">);</span>
  647. <span class="keyword">static</span> <span class="identifier">index_type</span>
  648. <span class="identifier">convert_index</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">i</span><span class="special">);</span>
  649. <span class="keyword">static</span> <span class="identifier">index_type</span>
  650. <span class="identifier">adjust_index</span><span class="special">(</span><span class="identifier">index_type</span> <span class="identifier">current</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">from</span><span class="special">,</span>
  651. <span class="identifier">index_type</span> <span class="identifier">to</span><span class="special">,</span> <span class="identifier">size_type</span> <span class="identifier">len</span><span class="special">);</span>
  652. <span class="special">};</span>
  653. </pre>
  654. </div>
  655. <div class="section">
  656. <div class="titlepage"><div><div><h3 class="title">
  657. <a name="topics.indexing_support.class_map_indexing_suite"></a><a class="link" href="indexing_support.html#topics.indexing_support.class_map_indexing_suite" title="class map_indexing_suite">class
  658. <code class="computeroutput"><span class="identifier">map_indexing_suite</span></code></a>
  659. </h3></div></div></div>
  660. <div class="informaltable"><table class="table">
  661. <colgroup>
  662. <col>
  663. <col>
  664. <col>
  665. <col>
  666. </colgroup>
  667. <thead><tr>
  668. <th>
  669. <p>
  670. Template Parameter
  671. </p>
  672. </th>
  673. <th>
  674. <p>
  675. Requirements
  676. </p>
  677. </th>
  678. <th>
  679. <p>
  680. Semantics
  681. </p>
  682. </th>
  683. <th>
  684. <p>
  685. Default
  686. </p>
  687. </th>
  688. </tr></thead>
  689. <tbody>
  690. <tr>
  691. <td>
  692. <p>
  693. Container
  694. </p>
  695. </td>
  696. <td>
  697. <p>
  698. A class type
  699. </p>
  700. </td>
  701. <td>
  702. <p>
  703. The container type to be wrapped to Python.
  704. </p>
  705. </td>
  706. <td>
  707. </td>
  708. </tr>
  709. <tr>
  710. <td>
  711. <p>
  712. NoProxy
  713. </p>
  714. </td>
  715. <td>
  716. <p>
  717. A boolean
  718. </p>
  719. </td>
  720. <td>
  721. <p>
  722. By default indexed elements have Python reference semantics and
  723. are returned by proxy. This can be disabled by supplying true
  724. in the NoProxy template parameter.
  725. </p>
  726. </td>
  727. <td>
  728. <p>
  729. false
  730. </p>
  731. </td>
  732. </tr>
  733. <tr>
  734. <td>
  735. <p>
  736. DerivedPolicies
  737. </p>
  738. </td>
  739. <td>
  740. <p>
  741. A subclass of indexing_suite
  742. </p>
  743. </td>
  744. <td>
  745. <p>
  746. The vector_indexing_suite may still be derived to further tweak
  747. any of the predefined policies. Static polymorphism through CRTP
  748. (James Coplien. "Curiously Recurring Template Pattern".
  749. C++ Report, Feb. 1995) enables the base indexing_suite class
  750. to call policy function of the most derived class
  751. </p>
  752. </td>
  753. <td>
  754. </td>
  755. </tr>
  756. </tbody>
  757. </table></div>
  758. <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Container</span><span class="special">,</span>
  759. <span class="keyword">bool</span> <span class="identifier">NoProxy</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">,</span>
  760. <span class="keyword">class</span> <span class="identifier">DerivedPolicies</span> <span class="special">=</span> <span class="identifier">unspecified_default</span><span class="special">&gt;</span>
  761. <span class="keyword">class</span> <span class="identifier">map_indexing_suite</span> <span class="special">:</span> <span class="identifier">unspecified_base</span>
  762. <span class="special">{</span>
  763. <span class="keyword">public</span><span class="special">:</span>
  764. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
  765. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">second_type</span> <span class="identifier">data_type</span><span class="special">;</span>
  766. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">key_type</span> <span class="identifier">key_type</span><span class="special">;</span>
  767. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">key_type</span> <span class="identifier">index_type</span><span class="special">;</span>
  768. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
  769. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">difference_type</span> <span class="identifier">difference_type</span><span class="special">;</span>
  770. <span class="keyword">static</span> <span class="identifier">data_type</span><span class="special">&amp;</span>
  771. <span class="identifier">get_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">);</span>
  772. <span class="keyword">static</span> <span class="keyword">void</span>
  773. <span class="identifier">set_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">data_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span>
  774. <span class="keyword">static</span> <span class="keyword">void</span>
  775. <span class="identifier">delete_item</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">i</span><span class="special">);</span>
  776. <span class="keyword">static</span> <span class="identifier">size_t</span>
  777. <span class="identifier">size</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">);</span>
  778. <span class="keyword">static</span> <span class="keyword">bool</span>
  779. <span class="identifier">contains</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">key_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">key</span><span class="special">);</span>
  780. <span class="keyword">static</span> <span class="keyword">bool</span>
  781. <span class="identifier">compare_index</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">index_type</span> <span class="identifier">b</span><span class="special">);</span>
  782. <span class="keyword">static</span> <span class="identifier">index_type</span>
  783. <span class="identifier">convert_index</span><span class="special">(</span><span class="identifier">Container</span><span class="special">&amp;</span> <span class="identifier">container</span><span class="special">,</span> <span class="identifier">PyObject</span><span class="special">*</span> <span class="identifier">i</span><span class="special">);</span>
  784. <span class="special">};</span>
  785. </pre>
  786. </div>
  787. </div>
  788. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  789. <td align="left"></td>
  790. <td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2015 David Abrahams, Stefan Seefeld<p>
  791. Distributed under the Boost Software License, Version 1.0. (See accompanying
  792. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>
  793. </p>
  794. </div></td>
  795. </tr></table>
  796. <hr>
  797. <div class="spirit-nav">
  798. <a accesskey="p" href="pickle_support.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../topics.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="../glossary.html"><img src="../../images/next.png" alt="Next"></a>
  799. </div>
  800. </body>
  801. </html>