unordered_test.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2007-2012. Distributed under the Boost
  4. // Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/interprocess for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #include <boost/interprocess/detail/config_begin.hpp>
  11. #include <boost/interprocess/managed_shared_memory.hpp>
  12. #include <boost/interprocess/allocators/allocator.hpp>
  13. #include "get_process_id_name.hpp"
  14. //<-
  15. //Shield against external warnings
  16. #include <boost/interprocess/detail/config_external_begin.hpp>
  17. //->
  18. #include <boost/unordered_map.hpp>
  19. #include <boost/unordered_set.hpp>
  20. //<-
  21. #include <boost/interprocess/detail/config_external_end.hpp>
  22. //->
  23. #include <functional> //std::equal_to
  24. #include <boost/functional/hash.hpp> //boost::hash
  25. namespace bip = boost::interprocess;
  26. typedef bip::allocator<int, bip::managed_shared_memory::segment_manager> ShmemAllocator;
  27. typedef boost::unordered_set<int, boost::hash<int>, std::equal_to<int>, ShmemAllocator> MyUnorderedSet;
  28. typedef boost::unordered_multiset<int, boost::hash<int>, std::equal_to<int>, ShmemAllocator> MyUnorderedMultiSet;
  29. int main()
  30. {
  31. //Remove any other old shared memory from the system
  32. bip::shared_memory_object::remove(bip::test::get_process_id_name());
  33. try {
  34. bip::managed_shared_memory shm(bip::create_only, bip::test::get_process_id_name(), 65536);
  35. //Elements to be inserted in unordered containers
  36. const int elements[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  37. const int elements_size = sizeof(elements)/sizeof(elements[0]);
  38. MyUnorderedSet *myset =
  39. shm.construct<MyUnorderedSet>(bip::anonymous_instance)
  40. ( elements_size
  41. , MyUnorderedSet::hasher()
  42. , MyUnorderedSet::key_equal()
  43. , shm.get_allocator<int>());
  44. MyUnorderedMultiSet *mymset =
  45. shm.construct<MyUnorderedMultiSet>(bip::anonymous_instance)
  46. ( elements_size
  47. , MyUnorderedSet::hasher()
  48. , MyUnorderedSet::key_equal()
  49. , shm.get_allocator<int>());
  50. //Insert elements and check sizes
  51. myset->insert((&elements[0]), (&elements[elements_size]));
  52. myset->insert((&elements[0]), (&elements[elements_size]));
  53. mymset->insert((&elements[0]), (&elements[elements_size]));
  54. mymset->insert((&elements[0]), (&elements[elements_size]));
  55. if(myset->size() != (unsigned int)elements_size)
  56. return 1;
  57. if(mymset->size() != (unsigned int)elements_size*2)
  58. return 1;
  59. //Destroy elements and check sizes
  60. myset->clear();
  61. mymset->clear();
  62. if(!myset->empty())
  63. return 1;
  64. if(!mymset->empty())
  65. return 1;
  66. //Destroy elements and check if memory has been deallocated
  67. shm.destroy_ptr(myset);
  68. shm.destroy_ptr(mymset);
  69. shm.shrink_to_fit_indexes();
  70. if(!shm.all_memory_deallocated())
  71. return 1;
  72. }
  73. catch(...){
  74. //Remove shared memory from the system
  75. bip::shared_memory_object::remove(bip::test::get_process_id_name());
  76. throw;
  77. }
  78. //Remove shared memory from the system
  79. bip::shared_memory_object::remove(bip::test::get_process_id_name());
  80. return 0;
  81. }
  82. #include <boost/interprocess/detail/config_end.hpp>