any_iterator_wrapper.hpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. // Boost.Range library
  2. //
  3. // Copyright Neil Groves 2010. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED
  11. #define BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED
  12. #include <boost/cast.hpp>
  13. #include <boost/range/config.hpp>
  14. #include <boost/range/detail/any_iterator_interface.hpp>
  15. #include <boost/range/concepts.hpp>
  16. namespace boost
  17. {
  18. namespace range_detail
  19. {
  20. template<
  21. class WrappedIterator
  22. , class Reference
  23. , class Buffer
  24. >
  25. class any_incrementable_iterator_wrapper
  26. : public any_incrementable_iterator_interface<
  27. Reference
  28. , Buffer
  29. >
  30. {
  31. BOOST_RANGE_CONCEPT_ASSERT(( IncrementableIteratorConcept<WrappedIterator> ));
  32. public:
  33. typedef WrappedIterator wrapped_type;
  34. BOOST_STATIC_ASSERT(( is_convertible<
  35. typename iterator_reference<WrappedIterator>::type
  36. , Reference
  37. >::value ));
  38. any_incrementable_iterator_wrapper()
  39. : m_it()
  40. {}
  41. explicit any_incrementable_iterator_wrapper(wrapped_type it)
  42. : m_it(it)
  43. {}
  44. // any_incrementable_iterator implementation
  45. virtual any_incrementable_iterator_wrapper* clone(
  46. typename any_incrementable_iterator_wrapper::buffer_type& buffer
  47. ) const
  48. {
  49. return new (buffer.allocate(sizeof(*this)))
  50. any_incrementable_iterator_wrapper(m_it);
  51. }
  52. virtual any_incrementable_iterator_wrapper<
  53. WrappedIterator
  54. , typename any_incrementable_iterator_wrapper::const_reference
  55. , Buffer
  56. >* clone_const_ref(
  57. typename any_incrementable_iterator_wrapper::buffer_type& buffer
  58. ) const
  59. {
  60. typedef any_incrementable_iterator_wrapper<
  61. WrappedIterator
  62. , typename any_incrementable_iterator_wrapper::const_reference
  63. , Buffer
  64. > result_type;
  65. return new (buffer.allocate(sizeof(result_type)))
  66. result_type(m_it);
  67. }
  68. virtual any_incrementable_iterator_wrapper<
  69. WrappedIterator
  70. , typename any_incrementable_iterator_wrapper::reference_as_value_type
  71. , Buffer
  72. >* clone_reference_as_value(
  73. typename any_incrementable_iterator_wrapper::buffer_type& buffer
  74. ) const
  75. {
  76. typedef any_incrementable_iterator_wrapper<
  77. WrappedIterator
  78. , typename any_incrementable_iterator_wrapper::reference_as_value_type
  79. , Buffer
  80. > result_type;
  81. return new (buffer.allocate(sizeof(result_type)))
  82. result_type(m_it);
  83. }
  84. virtual void increment()
  85. {
  86. ++m_it;
  87. }
  88. private:
  89. wrapped_type m_it;
  90. };
  91. template<
  92. class WrappedIterator
  93. , class Reference
  94. , class Buffer
  95. >
  96. class any_single_pass_iterator_wrapper
  97. : public any_single_pass_iterator_interface<
  98. Reference
  99. , Buffer
  100. >
  101. {
  102. struct disabler {};
  103. BOOST_RANGE_CONCEPT_ASSERT(( SinglePassIteratorConcept<WrappedIterator> ));
  104. public:
  105. any_single_pass_iterator_wrapper()
  106. : m_it()
  107. {}
  108. explicit any_single_pass_iterator_wrapper(const WrappedIterator& it)
  109. : m_it(it)
  110. {}
  111. // any_single_pass_iterator_interface<Reference> implementation
  112. virtual any_single_pass_iterator_wrapper* clone(
  113. typename any_single_pass_iterator_wrapper::buffer_type& buffer
  114. ) const
  115. {
  116. return new (buffer.allocate(sizeof(*this)))
  117. any_single_pass_iterator_wrapper(m_it);
  118. }
  119. virtual any_single_pass_iterator_wrapper<
  120. WrappedIterator
  121. , typename any_single_pass_iterator_wrapper::const_reference
  122. , Buffer
  123. >* clone_const_ref(
  124. typename any_single_pass_iterator_wrapper::buffer_type& buffer
  125. ) const
  126. {
  127. typedef any_single_pass_iterator_wrapper<
  128. WrappedIterator
  129. , typename any_single_pass_iterator_wrapper::const_reference
  130. , Buffer
  131. > result_type;
  132. return new (buffer.allocate(sizeof(result_type)))
  133. result_type(m_it);
  134. }
  135. virtual any_single_pass_iterator_wrapper<
  136. WrappedIterator
  137. , typename any_single_pass_iterator_wrapper::reference_as_value_type
  138. , Buffer
  139. >* clone_reference_as_value(
  140. typename any_single_pass_iterator_wrapper::buffer_type& buffer
  141. ) const
  142. {
  143. typedef any_single_pass_iterator_wrapper<
  144. WrappedIterator
  145. , typename any_single_pass_iterator_wrapper::reference_as_value_type
  146. , Buffer
  147. > result_type;
  148. return new (buffer.allocate(sizeof(result_type)))
  149. result_type(m_it);
  150. }
  151. virtual void increment()
  152. {
  153. ++m_it;
  154. }
  155. virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
  156. {
  157. return m_it == boost::polymorphic_downcast<const any_single_pass_iterator_wrapper*>(&other)->m_it;
  158. }
  159. virtual Reference dereference() const
  160. {
  161. return *m_it;
  162. }
  163. private:
  164. WrappedIterator m_it;
  165. };
  166. template<
  167. class WrappedIterator
  168. , class Reference
  169. , class Buffer
  170. >
  171. class any_forward_iterator_wrapper
  172. : public any_forward_iterator_interface<
  173. Reference
  174. , Buffer
  175. >
  176. {
  177. BOOST_RANGE_CONCEPT_ASSERT(( ForwardIteratorConcept<WrappedIterator> ));
  178. public:
  179. any_forward_iterator_wrapper()
  180. : m_it()
  181. {}
  182. explicit any_forward_iterator_wrapper(const WrappedIterator& it)
  183. : m_it(it)
  184. {}
  185. // any_forward_iterator_interface<Reference> implementation
  186. virtual any_forward_iterator_wrapper* clone(
  187. typename any_forward_iterator_wrapper::buffer_type& buffer
  188. ) const
  189. {
  190. return new (buffer.allocate(sizeof(*this)))
  191. any_forward_iterator_wrapper(m_it);
  192. }
  193. virtual any_forward_iterator_wrapper<
  194. WrappedIterator
  195. , typename any_forward_iterator_wrapper::const_reference
  196. , Buffer
  197. >* clone_const_ref(
  198. typename any_forward_iterator_wrapper::buffer_type& buffer
  199. ) const
  200. {
  201. typedef any_forward_iterator_wrapper<
  202. WrappedIterator
  203. , typename any_forward_iterator_wrapper::const_reference
  204. , Buffer
  205. > result_type;
  206. return new (buffer.allocate(sizeof(result_type)))
  207. result_type(m_it);
  208. }
  209. virtual any_forward_iterator_wrapper<
  210. WrappedIterator
  211. , typename any_forward_iterator_wrapper::reference_as_value_type
  212. , Buffer
  213. >* clone_reference_as_value(
  214. typename any_forward_iterator_wrapper::buffer_type& buffer
  215. ) const
  216. {
  217. typedef any_forward_iterator_wrapper<
  218. WrappedIterator
  219. , typename any_forward_iterator_wrapper::reference_as_value_type
  220. , Buffer
  221. > result_type;
  222. return new (buffer.allocate(sizeof(result_type)))
  223. result_type(m_it);
  224. }
  225. virtual void increment()
  226. {
  227. ++m_it;
  228. }
  229. virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
  230. {
  231. return m_it == boost::polymorphic_downcast<const any_forward_iterator_wrapper*>(&other)->m_it;
  232. }
  233. virtual Reference dereference() const
  234. {
  235. return *m_it;
  236. }
  237. private:
  238. WrappedIterator m_it;
  239. };
  240. template<
  241. class WrappedIterator
  242. , class Reference
  243. , class Buffer
  244. >
  245. class any_bidirectional_iterator_wrapper
  246. : public any_bidirectional_iterator_interface<
  247. Reference
  248. , Buffer
  249. >
  250. {
  251. BOOST_RANGE_CONCEPT_ASSERT(( BidirectionalIteratorConcept<WrappedIterator> ));
  252. public:
  253. any_bidirectional_iterator_wrapper()
  254. : m_it()
  255. {
  256. }
  257. explicit any_bidirectional_iterator_wrapper(const WrappedIterator& it)
  258. : m_it(it)
  259. {
  260. }
  261. virtual any_bidirectional_iterator_wrapper* clone(
  262. typename any_bidirectional_iterator_wrapper::buffer_type& buffer
  263. ) const
  264. {
  265. return new (buffer.allocate(sizeof(*this)))
  266. any_bidirectional_iterator_wrapper(*this);
  267. }
  268. virtual any_bidirectional_iterator_wrapper<
  269. WrappedIterator
  270. , typename any_bidirectional_iterator_wrapper::const_reference
  271. , Buffer
  272. >* clone_const_ref(
  273. typename any_bidirectional_iterator_wrapper::buffer_type& buffer
  274. ) const
  275. {
  276. typedef any_bidirectional_iterator_wrapper<
  277. WrappedIterator
  278. , typename any_bidirectional_iterator_wrapper::const_reference
  279. , Buffer
  280. > result_type;
  281. return new (buffer.allocate(sizeof(result_type)))
  282. result_type(m_it);
  283. }
  284. virtual any_bidirectional_iterator_wrapper<
  285. WrappedIterator
  286. , typename any_bidirectional_iterator_wrapper::reference_as_value_type
  287. , Buffer
  288. >* clone_reference_as_value(
  289. typename any_bidirectional_iterator_wrapper::buffer_type& buffer
  290. ) const
  291. {
  292. typedef any_bidirectional_iterator_wrapper<
  293. WrappedIterator
  294. , typename any_bidirectional_iterator_wrapper::reference_as_value_type
  295. , Buffer
  296. > result_type;
  297. return new (buffer.allocate(sizeof(result_type)))
  298. result_type(m_it);
  299. }
  300. virtual void increment()
  301. {
  302. ++m_it;
  303. }
  304. virtual void decrement()
  305. {
  306. --m_it;
  307. }
  308. virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
  309. {
  310. return m_it == boost::polymorphic_downcast<const any_bidirectional_iterator_wrapper*>(&other)->m_it;
  311. }
  312. virtual Reference dereference() const
  313. {
  314. return *m_it;
  315. }
  316. private:
  317. WrappedIterator m_it;
  318. };
  319. template<
  320. class WrappedIterator
  321. , class Reference
  322. , class Difference
  323. , class Buffer
  324. >
  325. class any_random_access_iterator_wrapper
  326. : public any_random_access_iterator_interface<
  327. Reference
  328. , Difference
  329. , Buffer
  330. >
  331. {
  332. BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessIteratorConcept<WrappedIterator> ));
  333. public:
  334. typedef Difference difference_type;
  335. any_random_access_iterator_wrapper()
  336. : m_it()
  337. {
  338. }
  339. explicit any_random_access_iterator_wrapper(const WrappedIterator& other)
  340. : m_it(other)
  341. {
  342. }
  343. virtual any_random_access_iterator_wrapper* clone(
  344. typename any_random_access_iterator_wrapper::buffer_type& buffer
  345. ) const
  346. {
  347. return new (buffer.allocate(sizeof(*this)))
  348. any_random_access_iterator_wrapper(*this);
  349. }
  350. virtual any_random_access_iterator_wrapper<
  351. WrappedIterator
  352. , typename any_random_access_iterator_wrapper::const_reference
  353. , Difference
  354. , Buffer
  355. >* clone_const_ref(
  356. typename any_random_access_iterator_wrapper::buffer_type& buffer
  357. ) const
  358. {
  359. typedef any_random_access_iterator_wrapper<
  360. WrappedIterator
  361. , typename any_random_access_iterator_wrapper::const_reference
  362. , Difference
  363. , Buffer
  364. > result_type;
  365. return new (buffer.allocate(sizeof(result_type)))
  366. result_type(m_it);
  367. }
  368. virtual any_random_access_iterator_wrapper<
  369. WrappedIterator
  370. , typename any_random_access_iterator_wrapper::reference_as_value_type
  371. , Difference
  372. , Buffer
  373. >* clone_reference_as_value(
  374. typename any_random_access_iterator_wrapper::buffer_type& buffer
  375. ) const
  376. {
  377. typedef any_random_access_iterator_wrapper<
  378. WrappedIterator
  379. , typename any_random_access_iterator_wrapper::reference_as_value_type
  380. , Difference
  381. , Buffer
  382. > result_type;
  383. return new (buffer.allocate(sizeof(result_type)))
  384. result_type(m_it);
  385. }
  386. virtual void increment()
  387. {
  388. ++m_it;
  389. }
  390. virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
  391. {
  392. return m_it == boost::polymorphic_downcast<const any_random_access_iterator_wrapper*>(&other)->m_it;
  393. }
  394. virtual void decrement()
  395. {
  396. --m_it;
  397. }
  398. virtual void advance(Difference offset)
  399. {
  400. m_it += offset;
  401. }
  402. virtual Reference dereference() const
  403. {
  404. return *m_it;
  405. }
  406. virtual Difference distance_to(const any_random_access_iterator_interface<Reference, Difference, Buffer>& other) const
  407. {
  408. return boost::polymorphic_downcast<const any_random_access_iterator_wrapper*>(&other)->m_it - m_it;
  409. }
  410. private:
  411. WrappedIterator m_it;
  412. };
  413. template<
  414. class WrappedIterator
  415. , class Traversal
  416. , class Reference
  417. , class Difference
  418. , class Buffer
  419. >
  420. struct any_iterator_wrapper_type_generator;
  421. template<
  422. class WrappedIterator
  423. , class Reference
  424. , class Difference
  425. , class Buffer
  426. >
  427. struct any_iterator_wrapper_type_generator<
  428. WrappedIterator
  429. , incrementable_traversal_tag
  430. , Reference
  431. , Difference
  432. , Buffer
  433. >
  434. {
  435. typedef any_incrementable_iterator_wrapper<
  436. WrappedIterator
  437. , Reference
  438. , Buffer
  439. > type;
  440. };
  441. template<
  442. class WrappedIterator
  443. , class Reference
  444. , class Difference
  445. , class Buffer
  446. >
  447. struct any_iterator_wrapper_type_generator<
  448. WrappedIterator
  449. , single_pass_traversal_tag
  450. , Reference
  451. , Difference
  452. , Buffer
  453. >
  454. {
  455. typedef any_single_pass_iterator_wrapper<
  456. WrappedIterator
  457. , Reference
  458. , Buffer
  459. > type;
  460. };
  461. template<
  462. class WrappedIterator
  463. , class Reference
  464. , class Difference
  465. , class Buffer
  466. >
  467. struct any_iterator_wrapper_type_generator<
  468. WrappedIterator
  469. , forward_traversal_tag
  470. , Reference
  471. , Difference
  472. , Buffer
  473. >
  474. {
  475. typedef any_forward_iterator_wrapper<
  476. WrappedIterator
  477. , Reference
  478. , Buffer
  479. > type;
  480. };
  481. template<
  482. class WrappedIterator
  483. , class Reference
  484. , class Difference
  485. , class Buffer
  486. >
  487. struct any_iterator_wrapper_type_generator<
  488. WrappedIterator
  489. , bidirectional_traversal_tag
  490. , Reference
  491. , Difference
  492. , Buffer
  493. >
  494. {
  495. typedef any_bidirectional_iterator_wrapper<
  496. WrappedIterator
  497. , Reference
  498. , Buffer
  499. > type;
  500. };
  501. template<
  502. class WrappedIterator
  503. , class Reference
  504. , class Difference
  505. , class Buffer
  506. >
  507. struct any_iterator_wrapper_type_generator<
  508. WrappedIterator
  509. , random_access_traversal_tag
  510. , Reference
  511. , Difference
  512. , Buffer
  513. >
  514. {
  515. typedef any_random_access_iterator_wrapper<
  516. WrappedIterator
  517. , Reference
  518. , Difference
  519. , Buffer
  520. > type;
  521. };
  522. } // namespace range_detail
  523. } // namespace boost
  524. #endif // include guard