doc_iterator_from_value.cpp 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-2013
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //
  9. // See http://www.boost.org/libs/intrusive for documentation.
  10. //
  11. /////////////////////////////////////////////////////////////////////////////
  12. //[doc_iterator_from_value
  13. #include <boost/intrusive/list.hpp>
  14. #include <boost/intrusive/unordered_set.hpp>
  15. #include <boost/functional/hash.hpp>
  16. #include <vector>
  17. using namespace boost::intrusive;
  18. class intrusive_data
  19. {
  20. int data_id_;
  21. public:
  22. void set(int id) { data_id_ = id; }
  23. //This class can be inserted in an intrusive list
  24. list_member_hook<> list_hook_;
  25. //This class can be inserted in an intrusive unordered_set
  26. unordered_set_member_hook<> unordered_set_hook_;
  27. //Comparison operators
  28. friend bool operator==(const intrusive_data &a, const intrusive_data &b)
  29. { return a.data_id_ == b.data_id_; }
  30. friend bool operator!=(const intrusive_data &a, const intrusive_data &b)
  31. { return a.data_id_ != b.data_id_; }
  32. //The hash function
  33. friend std::size_t hash_value(const intrusive_data &i)
  34. { return boost::hash<int>()(i.data_id_); }
  35. };
  36. //Definition of the intrusive list that will hold intrusive_data
  37. typedef member_hook<intrusive_data, list_member_hook<>
  38. , &intrusive_data::list_hook_> MemberListOption;
  39. typedef list<intrusive_data, MemberListOption> list_t;
  40. //Definition of the intrusive unordered_set that will hold intrusive_data
  41. typedef member_hook
  42. < intrusive_data, unordered_set_member_hook<>
  43. , &intrusive_data::unordered_set_hook_> MemberUsetOption;
  44. typedef boost::intrusive::unordered_set
  45. < intrusive_data, MemberUsetOption> unordered_set_t;
  46. int main()
  47. {
  48. //Create MaxElem objects
  49. const int MaxElem = 100;
  50. std::vector<intrusive_data> nodes(MaxElem);
  51. //Declare the intrusive containers
  52. list_t list;
  53. unordered_set_t::bucket_type buckets[MaxElem];
  54. unordered_set_t unordered_set
  55. (unordered_set_t::bucket_traits(buckets, MaxElem));
  56. //Initialize all the nodes
  57. for(int i = 0; i < MaxElem; ++i) nodes[i].set(i);
  58. //Now insert them in both intrusive containers
  59. list.insert(list.end(), nodes.begin(), nodes.end());
  60. unordered_set.insert(nodes.begin(), nodes.end());
  61. //Now check the iterator_to function
  62. list_t::iterator list_it(list.begin());
  63. for(int i = 0; i < MaxElem; ++i, ++list_it)
  64. if(list.iterator_to(nodes[i]) != list_it ||
  65. list_t::s_iterator_to(nodes[i]) != list_it)
  66. return 1;
  67. //Now check unordered_set::s_iterator_to (which is a member function)
  68. //and unordered_set::s_local_iterator_to (which is an static member function)
  69. unordered_set_t::iterator unordered_set_it(unordered_set.begin());
  70. for(int i = 0; i < MaxElem; ++i){
  71. unordered_set_it = unordered_set.find(nodes[i]);
  72. if(unordered_set.iterator_to(nodes[i]) != unordered_set_it)
  73. return 1;
  74. if(*unordered_set.local_iterator_to(nodes[i]) != *unordered_set_it ||
  75. *unordered_set_t::s_local_iterator_to(nodes[i]) != *unordered_set_it )
  76. return 1;
  77. }
  78. return 0;
  79. }
  80. //]