doc_vectorstream.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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_vectorstream
  13. #include <boost/interprocess/containers/vector.hpp>
  14. #include <boost/interprocess/containers/string.hpp>
  15. #include <boost/interprocess/allocators/allocator.hpp>
  16. #include <boost/interprocess/managed_shared_memory.hpp>
  17. #include <boost/interprocess/streams/vectorstream.hpp>
  18. #include <iterator>
  19. //<-
  20. #include "../test/get_process_id_name.hpp"
  21. //->
  22. using namespace boost::interprocess;
  23. typedef allocator<int, managed_shared_memory::segment_manager>
  24. IntAllocator;
  25. typedef allocator<char, managed_shared_memory::segment_manager>
  26. CharAllocator;
  27. typedef vector<int, IntAllocator> MyVector;
  28. typedef basic_string
  29. <char, std::char_traits<char>, CharAllocator> MyString;
  30. typedef basic_vectorstream<MyString> MyVectorStream;
  31. int main ()
  32. {
  33. //Remove shared memory on construction and destruction
  34. struct shm_remove
  35. {
  36. //<-
  37. #if 1
  38. shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
  39. ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
  40. #else
  41. //->
  42. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  43. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  44. //<-
  45. #endif
  46. //->
  47. } remover;
  48. //<-
  49. (void)remover;
  50. //->
  51. //<-
  52. #if 1
  53. managed_shared_memory segment(
  54. create_only,
  55. test::get_process_id_name(), //segment name
  56. 65536); //segment size in bytes
  57. #else
  58. //->
  59. managed_shared_memory segment(
  60. create_only,
  61. "MySharedMemory", //segment name
  62. 65536); //segment size in bytes
  63. //<-
  64. #endif
  65. //->
  66. //Construct shared memory vector
  67. MyVector *myvector =
  68. segment.construct<MyVector>("MyVector")
  69. (IntAllocator(segment.get_segment_manager()));
  70. //Fill vector
  71. myvector->reserve(100);
  72. for(int i = 0; i < 100; ++i){
  73. myvector->push_back(i);
  74. }
  75. //Create the vectorstream. To create the internal shared memory
  76. //basic_string we need to pass the shared memory allocator as
  77. //a constructor argument
  78. MyVectorStream myvectorstream(CharAllocator(segment.get_segment_manager()));
  79. //Reserve the internal string
  80. myvectorstream.reserve(100*5);
  81. //Write all vector elements as text in the internal string
  82. //Data will be directly written in shared memory, because
  83. //internal string's allocator is a shared memory allocator
  84. for(std::size_t i = 0, max = myvector->size(); i < max; ++i){
  85. myvectorstream << (*myvector)[i] << std::endl;
  86. }
  87. //Auxiliary vector to compare original data
  88. MyVector *myvector2 =
  89. segment.construct<MyVector>("MyVector2")
  90. (IntAllocator(segment.get_segment_manager()));
  91. //Avoid reallocations
  92. myvector2->reserve(100);
  93. //Extract all values from the internal
  94. //string directly to a shared memory vector.
  95. std::istream_iterator<int> it(myvectorstream), itend;
  96. std::copy(it, itend, std::back_inserter(*myvector2));
  97. //Compare vectors
  98. assert(std::equal(myvector->begin(), myvector->end(), myvector2->begin()));
  99. //Create a copy of the internal string
  100. MyString stringcopy (myvectorstream.vector());
  101. //Now we create a new empty shared memory string...
  102. MyString *mystring =
  103. segment.construct<MyString>("MyString")
  104. (CharAllocator(segment.get_segment_manager()));
  105. //...and we swap vectorstream's internal string
  106. //with the new one: after this statement mystring
  107. //will be the owner of the formatted data.
  108. //No reallocations, no data copies
  109. myvectorstream.swap_vector(*mystring);
  110. //Let's compare both strings
  111. assert(stringcopy == *mystring);
  112. //Done, destroy and delete vectors and string from the segment
  113. segment.destroy_ptr(myvector2);
  114. segment.destroy_ptr(myvector);
  115. segment.destroy_ptr(mystring);
  116. return 0;
  117. }
  118. //]
  119. #include <boost/interprocess/detail/config_end.hpp>