any_test.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Olaf Krzikalla 2004-2006.
  4. // (C) Copyright Ion Gaztanaga 2006-2013.
  5. //
  6. // Distributed under the Boost Software License, Version 1.0.
  7. // (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // See http://www.boost.org/libs/intrusive for documentation.
  11. //
  12. /////////////////////////////////////////////////////////////////////////////
  13. #include<boost/intrusive/any_hook.hpp>
  14. #include<boost/intrusive/slist.hpp>
  15. #include<boost/intrusive/rbtree.hpp>
  16. #include<boost/intrusive/list.hpp>
  17. #include<boost/intrusive/avltree.hpp>
  18. #include<boost/intrusive/sgtree.hpp>
  19. #include<boost/intrusive/splaytree.hpp>
  20. #include<boost/intrusive/treap.hpp>
  21. #include<boost/intrusive/hashtable.hpp>
  22. #include<boost/functional/hash.hpp>
  23. #include <vector> //std::vector
  24. #include <cstddef> //std::size_t
  25. using namespace boost::intrusive;
  26. class MyClass : public any_base_hook<>
  27. {
  28. int int_;
  29. public:
  30. //This is a member hook
  31. any_member_hook<> member_hook_;
  32. MyClass(int i = 0)
  33. : int_(i)
  34. {}
  35. int get() const
  36. { return this->int_; }
  37. friend bool operator < (const MyClass &l, const MyClass &r)
  38. { return l.int_ < r.int_; }
  39. friend bool operator == (const MyClass &l, const MyClass &r)
  40. { return l.int_ == r.int_; }
  41. friend std::size_t hash_value(const MyClass &o)
  42. { return boost::hash<int>()(o.get()); }
  43. friend bool priority_order(const MyClass &a, const MyClass &b)
  44. { return a.int_ < b.int_; }
  45. };
  46. void instantiation_test()
  47. {
  48. typedef member_hook< MyClass, any_member_hook<>, &MyClass::member_hook_> MemberHook;
  49. typedef base_hook< any_base_hook<> > BaseHook;
  50. MyClass myclass;
  51. {
  52. slist < MyClass, any_to_slist_hook< BaseHook > > slist_base;
  53. slist_base.push_front(myclass);
  54. }
  55. {
  56. slist < MyClass, any_to_slist_hook< MemberHook > > slist_member;
  57. slist_member.push_front(myclass);
  58. }
  59. {
  60. list < MyClass, any_to_list_hook< BaseHook > > list_base;
  61. list_base.push_front(myclass);
  62. }
  63. {
  64. list < MyClass, any_to_list_hook< MemberHook > > list_member;
  65. list_member.push_front(myclass);
  66. }
  67. {
  68. rbtree < MyClass, any_to_set_hook< BaseHook > > rbtree_base;
  69. rbtree_base.insert_unique(myclass);
  70. }
  71. {
  72. rbtree < MyClass, any_to_set_hook< MemberHook > > rbtree_member;
  73. rbtree_member.insert_unique(myclass);
  74. }
  75. {
  76. avltree < MyClass, any_to_avl_set_hook< BaseHook > > avltree_base;
  77. avltree_base.insert_unique(myclass);
  78. }
  79. {
  80. avltree < MyClass, any_to_avl_set_hook< MemberHook > > avltree_member;
  81. avltree_member.insert_unique(myclass);
  82. }
  83. {
  84. sgtree < MyClass, any_to_bs_set_hook< BaseHook > > sgtree_base;
  85. sgtree_base.insert_unique(myclass);
  86. }
  87. {
  88. sgtree < MyClass, any_to_bs_set_hook< MemberHook > > sgtree_member;
  89. sgtree_member.insert_unique(myclass);
  90. }
  91. {
  92. treap < MyClass, any_to_bs_set_hook< BaseHook > > treap_base;
  93. treap_base.insert_unique(myclass);
  94. }
  95. {
  96. treap < MyClass, any_to_bs_set_hook< MemberHook > > treap_member;
  97. treap_member.insert_unique(myclass);
  98. }
  99. {
  100. splaytree < MyClass, any_to_bs_set_hook< BaseHook > > splaytree_base;
  101. splaytree_base.insert_unique(myclass);
  102. }
  103. {
  104. splaytree < MyClass, any_to_bs_set_hook< MemberHook > > splaytree_member;
  105. splaytree_member.insert_unique(myclass);
  106. }
  107. typedef unordered_bucket<any_to_unordered_set_hook< BaseHook > >::type bucket_type;
  108. typedef unordered_default_bucket_traits<any_to_unordered_set_hook< BaseHook > >::type bucket_traits;
  109. bucket_type buckets[2];
  110. {
  111. hashtable < MyClass, any_to_unordered_set_hook< BaseHook > >
  112. hashtable_base(bucket_traits(&buckets[0], 1));
  113. hashtable_base.insert_unique(myclass);
  114. }
  115. {
  116. hashtable < MyClass, any_to_unordered_set_hook< MemberHook > >
  117. hashtable_member(bucket_traits(&buckets[1], 1));
  118. hashtable_member.insert_unique(myclass);
  119. }
  120. }
  121. bool simple_slist_test()
  122. {
  123. //Define an slist that will store MyClass using the public base hook
  124. typedef any_to_slist_hook< base_hook< any_base_hook<> > >BaseOption;
  125. typedef slist<MyClass, BaseOption, constant_time_size<false> > BaseList;
  126. //Define an slist that will store MyClass using the public member hook
  127. typedef any_to_slist_hook< member_hook<MyClass, any_member_hook<>, &MyClass::member_hook_> > MemberOption;
  128. typedef slist<MyClass, MemberOption> MemberList;
  129. typedef std::vector<MyClass>::iterator VectIt;
  130. typedef std::vector<MyClass>::reverse_iterator VectRit;
  131. //Create several MyClass objects, each one with a different value
  132. std::vector<MyClass> values;
  133. for(int i = 0; i < 100; ++i) values.push_back(MyClass(i));
  134. BaseList baselist;
  135. MemberList memberlist;
  136. //Now insert them in the reverse order in the base hook list
  137. for(VectIt it(values.begin()), itend(values.end()); it != itend; ++it)
  138. baselist.push_front(*it);
  139. //Now insert them in the same order as in vector in the member hook list
  140. for(BaseList::iterator it(baselist.begin()), itend(baselist.end())
  141. ; it != itend; ++it){
  142. memberlist.push_front(*it);
  143. }
  144. //Now test lists
  145. {
  146. BaseList::iterator bit(baselist.begin());
  147. MemberList::iterator mit(memberlist.begin());
  148. VectRit rit(values.rbegin()), ritend(values.rend());
  149. VectIt it(values.begin()), itend(values.end());
  150. //Test the objects inserted in the base hook list
  151. for(; rit != ritend; ++rit, ++bit)
  152. if(&*bit != &*rit) return false;
  153. //Test the objects inserted in the member hook list
  154. for(; it != itend; ++it, ++mit)
  155. if(&*mit != &*it) return false;
  156. }
  157. return true;
  158. }
  159. int main()
  160. {
  161. if(!simple_slist_test())
  162. return 1;
  163. instantiation_test();
  164. return 0;
  165. }