doc_multi_index.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-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/detail/workaround.hpp>
  12. //[doc_multi_index
  13. #include <boost/interprocess/managed_shared_memory.hpp>
  14. #include <boost/interprocess/allocators/allocator.hpp>
  15. #include <boost/interprocess/containers/string.hpp>
  16. //<-
  17. //Shield against external warnings
  18. #include <boost/interprocess/detail/config_external_begin.hpp>
  19. //->
  20. #include <boost/multi_index_container.hpp>
  21. #include <boost/multi_index/member.hpp>
  22. #include <boost/multi_index/ordered_index.hpp>
  23. //<-
  24. #include <boost/interprocess/detail/config_external_end.hpp>
  25. #include "../test/get_process_id_name.hpp"
  26. //->
  27. using namespace boost::interprocess;
  28. namespace bmi = boost::multi_index;
  29. typedef managed_shared_memory::allocator<char>::type char_allocator;
  30. typedef basic_string<char, std::char_traits<char>, char_allocator>shm_string;
  31. //Data to insert in shared memory
  32. struct employee
  33. {
  34. int id;
  35. int age;
  36. shm_string name;
  37. employee( int id_
  38. , int age_
  39. , const char *name_
  40. , const char_allocator &a)
  41. : id(id_), age(age_), name(name_, a)
  42. {}
  43. };
  44. //Tags
  45. struct id{};
  46. struct age{};
  47. struct name{};
  48. // Define a multi_index_container of employees with following indices:
  49. // - a unique index sorted by employee::int,
  50. // - a non-unique index sorted by employee::name,
  51. // - a non-unique index sorted by employee::age.
  52. typedef bmi::multi_index_container<
  53. employee,
  54. bmi::indexed_by<
  55. bmi::ordered_unique
  56. <bmi::tag<id>, bmi::member<employee,int,&employee::id> >,
  57. bmi::ordered_non_unique<
  58. bmi::tag<name>, bmi::member<employee,shm_string,&employee::name> >,
  59. bmi::ordered_non_unique
  60. <bmi::tag<age>, bmi::member<employee,int,&employee::age> > >,
  61. managed_shared_memory::allocator<employee>::type
  62. > employee_set;
  63. int main ()
  64. {
  65. //Remove shared memory on construction and destruction
  66. struct shm_remove
  67. {
  68. //<-
  69. #if 1
  70. shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
  71. ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
  72. #else
  73. //->
  74. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  75. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  76. //<-
  77. #endif
  78. //->
  79. } remover;
  80. //<-
  81. (void)remover;
  82. //->
  83. //Create shared memory
  84. //<-
  85. #if 1
  86. managed_shared_memory segment(create_only,test::get_process_id_name(), 65536);
  87. #else
  88. //->
  89. managed_shared_memory segment(create_only,"MySharedMemory", 65536);
  90. //<-
  91. #endif
  92. //->
  93. //Construct the multi_index in shared memory
  94. employee_set *es = segment.construct<employee_set>
  95. ("My MultiIndex Container") //Container's name in shared memory
  96. ( employee_set::ctor_args_list()
  97. , segment.get_allocator<employee>()); //Ctor parameters
  98. //Now insert elements
  99. char_allocator ca(segment.get_allocator<char>());
  100. es->insert(employee(0,31, "Joe", ca));
  101. es->insert(employee(1,27, "Robert", ca));
  102. es->insert(employee(2,40, "John", ca));
  103. return 0;
  104. }
  105. //]
  106. #include <boost/interprocess/detail/config_end.hpp>