tutorial_example.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  4. <title> </title>
  5. <link rel="stylesheet" href="default.css" type="text/css">
  6. </head>
  7. <body>
  8. <pre><span class=comment>//
  9. // Boost.Pointer Container
  10. //
  11. // Copyright Thorsten Ottosen 2003-2005. Use, modification and
  12. // distribution is subject to the Boost Software License, Version
  13. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  14. // http://www.boost.org/LICENSE_1_0.txt)
  15. //
  16. // For more information, see http://www.boost.org/libs/ptr_container/
  17. //
  18. //
  19. // This example is intended to get you started.
  20. // Notice how the smart container
  21. //
  22. // 1. takes ownership of objects
  23. // 2. transfers ownership
  24. // 3. applies indirection to iterators
  25. // 4. clones objects from other smart containers
  26. //
  27. //
  28. // First we select which container to use.
  29. //</span>
  30. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>ptr_container</span><span class=special>/</span><span class=identifier>ptr_deque</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  31. <span class=comment>//
  32. // we need these later in the example
  33. //</span>
  34. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  35. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>string</span><span class=special>&gt;</span>
  36. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>exception</span><span class=special>&gt;</span>
  37. <span class=comment>//
  38. // Then we define a small polymorphic class
  39. // hierarchy.
  40. //</span>
  41. <span class=keyword>class</span> <span class=identifier>animal</span> <span class=special>:</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>noncopyable</span>
  42. <span class=special>{</span>
  43. <span class=keyword>virtual</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>do_speak</span><span class=special>()</span> <span class=keyword>const</span> <span class=special>=</span> <span class=number>0</span><span class=special>;</span>
  44. <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>name_</span><span class=special>;</span>
  45. <span class=keyword>protected</span><span class=special>:</span>
  46. <span class=comment>//
  47. // Animals cannot be copied...
  48. //</span>
  49. <span class=identifier>animal</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>animal</span><span class=special>&amp;</span> <span class=identifier>r</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>name_</span><span class=special>(</span> <span class=identifier>r</span><span class=special>.</span><span class=identifier>name_</span> <span class=special>)</span> <span class=special>{</span> <span class=special>}</span>
  50. <span class=keyword>void</span> <span class=keyword>operator</span><span class=special>=(</span> <span class=keyword>const</span> <span class=identifier>animal</span><span class=special>&amp;</span> <span class=special>);</span>
  51. <span class=keyword>private</span><span class=special>:</span>
  52. <span class=comment>//
  53. // ...but due to advances in genetics, we can clone them!
  54. //</span>
  55. <span class=keyword>virtual</span> <span class=identifier>animal</span><span class=special>*</span> <span class=identifier>do_clone</span><span class=special>()</span> <span class=keyword>const</span> <span class=special>=</span> <span class=number>0</span><span class=special>;</span>
  56. <span class=keyword>public</span><span class=special>:</span>
  57. <span class=identifier>animal</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>&amp;</span> <span class=identifier>name</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>name_</span><span class=special>(</span><span class=identifier>name</span><span class=special>)</span> <span class=special>{</span> <span class=special>}</span>
  58. <span class=keyword>virtual</span> <span class=special>~</span><span class=identifier>animal</span><span class=special>()</span> <span class=keyword>throw</span><span class=special>()</span> <span class=special>{</span> <span class=special>}</span>
  59. <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>speak</span><span class=special>()</span> <span class=keyword>const</span>
  60. <span class=special>{</span>
  61. <span class=keyword>return</span> <span class=identifier>do_speak</span><span class=special>();</span>
  62. <span class=special>}</span>
  63. <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>name</span><span class=special>()</span> <span class=keyword>const</span>
  64. <span class=special>{</span>
  65. <span class=keyword>return</span> <span class=identifier>name_</span><span class=special>;</span>
  66. <span class=special>}</span>
  67. <span class=identifier>animal</span><span class=special>*</span> <span class=identifier>clone</span><span class=special>()</span> <span class=keyword>const</span>
  68. <span class=special>{</span>
  69. <span class=keyword>return</span> <span class=identifier>do_clone</span><span class=special>();</span>
  70. <span class=special>}</span>
  71. <span class=special>};</span>
  72. <span class=comment>//
  73. // An animal is still not Clonable. We need this last hook.
  74. //
  75. // Notice that we pass the animal by const reference
  76. // and return by pointer.
  77. //</span>
  78. <span class=identifier>animal</span><span class=special>*</span> <span class=identifier>new_clone</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>animal</span><span class=special>&amp;</span> <span class=identifier>a</span> <span class=special>)</span>
  79. <span class=special>{</span>
  80. <span class=keyword>return</span> <span class=identifier>a</span><span class=special>.</span><span class=identifier>clone</span><span class=special>();</span>
  81. <span class=special>}</span>
  82. <span class=comment>//
  83. // We do not need to define 'delete_clone()' since
  84. // since the default is to call the default 'operator delete()'.
  85. //</span>
  86. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>muuuh</span> <span class=special>=</span> <span class=string>&quot;Muuuh!&quot;</span><span class=special>;</span>
  87. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>oiink</span> <span class=special>=</span> <span class=string>&quot;Oiiink&quot;</span><span class=special>;</span>
  88. <span class=keyword>class</span> <span class=identifier>cow</span> <span class=special>:</span> <span class=keyword>public</span> <span class=identifier>animal</span>
  89. <span class=special>{</span>
  90. <span class=keyword>virtual</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>do_speak</span><span class=special>()</span> <span class=keyword>const</span>
  91. <span class=special>{</span>
  92. <span class=keyword>return</span> <span class=identifier>muuuh</span><span class=special>;</span>
  93. <span class=special>}</span>
  94. <span class=keyword>virtual</span> <span class=identifier>animal</span><span class=special>*</span> <span class=identifier>do_clone</span><span class=special>()</span> <span class=keyword>const</span>
  95. <span class=special>{</span>
  96. <span class=keyword>return</span> <span class=keyword>new</span> <span class=identifier>cow</span><span class=special>(</span> <span class=special>*</span><span class=keyword>this</span> <span class=special>);</span>
  97. <span class=special>}</span>
  98. <span class=keyword>public</span><span class=special>:</span>
  99. <span class=identifier>cow</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>&amp;</span> <span class=identifier>name</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>animal</span><span class=special>(</span><span class=identifier>name</span><span class=special>)</span> <span class=special>{</span> <span class=special>}</span>
  100. <span class=special>};</span>
  101. <span class=keyword>class</span> <span class=identifier>pig</span> <span class=special>:</span> <span class=keyword>public</span> <span class=identifier>animal</span>
  102. <span class=special>{</span>
  103. <span class=keyword>virtual</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span> <span class=identifier>do_speak</span><span class=special>()</span> <span class=keyword>const</span>
  104. <span class=special>{</span>
  105. <span class=keyword>return</span> <span class=identifier>oiink</span><span class=special>;</span>
  106. <span class=special>}</span>
  107. <span class=keyword>virtual</span> <span class=identifier>animal</span><span class=special>*</span> <span class=identifier>do_clone</span><span class=special>()</span> <span class=keyword>const</span>
  108. <span class=special>{</span>
  109. <span class=keyword>return</span> <span class=keyword>new</span> <span class=identifier>pig</span><span class=special>(</span> <span class=special>*</span><span class=keyword>this</span> <span class=special>);</span>
  110. <span class=special>}</span>
  111. <span class=keyword>public</span><span class=special>:</span>
  112. <span class=identifier>pig</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>&amp;</span> <span class=identifier>name</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>animal</span><span class=special>(</span><span class=identifier>name</span><span class=special>)</span> <span class=special>{</span> <span class=special>}</span>
  113. <span class=special>};</span>
  114. <span class=comment>//
  115. // Then we, of course, need a place to put all
  116. // those animals.
  117. //</span>
  118. <span class=keyword>class</span> <span class=identifier>farm</span>
  119. <span class=special>{</span>
  120. <span class=comment>//
  121. // This is where the smart containers are handy
  122. //</span>
  123. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>ptr_deque</span><span class=special>&lt;</span><span class=identifier>animal</span><span class=special>&gt;</span> <span class=identifier>barn_type</span><span class=special>;</span>
  124. <span class=identifier>barn_type</span> <span class=identifier>barn</span><span class=special>;</span>
  125. <span class=comment>//
  126. // A convenience typedef for the compiler-appropriate
  127. // smart pointer used to manage barns
  128. //</span>
  129. <span class=keyword>typedef</span> <span class=identifier><a href="compatible_smart_ptr.html"><em>compatible-smart-ptr</em></a></span><span class=special>&lt;</span><span class=identifier>barn_type</span><span class=special>&gt;</span> <span class=identifier>raii_ptr</span><span class=special>;</span>
  130. <span class=comment>//
  131. // An error type
  132. //</span>
  133. <span class=keyword>struct</span> <span class=identifier>farm_trouble</span> <span class=special>:</span> <span class=keyword>public</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>exception</span> <span class=special>{</span> <span class=special>};</span>
  134. <span class=keyword>public</span><span class=special>:</span>
  135. <span class=comment>//
  136. // We would like to make it possible to
  137. // iterate over the animals in the farm
  138. //</span>
  139. <span class=keyword>typedef</span> <span class=identifier>barn_type</span><span class=special>::</span><span class=identifier>iterator</span> <span class=identifier>animal_iterator</span><span class=special>;</span>
  140. <span class=comment>//
  141. // We also need to count the farm's size...
  142. //</span>
  143. <span class=keyword>typedef</span> <span class=identifier>barn_type</span><span class=special>::</span><span class=identifier>size_type</span> <span class=identifier>size_type</span><span class=special>;</span>
  144. <span class=comment>//
  145. // And we also want to transfer an animal
  146. // safely around. The easiest way to think
  147. // about '::auto_type' is to imagine a simplified
  148. // 'std::auto_ptr&lt;T&gt;' ... this means you can expect
  149. //
  150. // T* operator-&gt;()
  151. // T* release()
  152. // deleting destructor
  153. //
  154. // but not more.
  155. //</span>
  156. <span class=keyword>typedef</span> <span class=identifier>barn_type</span><span class=special>::</span><span class=identifier>auto_type</span> <span class=identifier>animal_transport</span><span class=special>;</span>
  157. <span class=comment>//
  158. // Create an empty farm.
  159. //</span>
  160. <span class=identifier>farm</span><span class=special>()</span> <span class=special>{</span> <span class=special>}</span>
  161. <span class=comment>//
  162. // We need a constructor that can make a new
  163. // farm by cloning a range of animals.
  164. //</span>
  165. <span class=identifier>farm</span><span class=special>(</span> <span class=identifier>animal_iterator</span> <span class=identifier>begin</span><span class=special>,</span> <span class=identifier>animal_iterator</span> <span class=identifier>end</span> <span class=special>)</span>
  166. <span class=special>:</span>
  167. <span class=comment>//
  168. // Objects are always cloned before insertion
  169. // unless we explicitly add a pointer or
  170. // use 'release()'. Therefore we actually
  171. // clone all animals in the range
  172. //</span>
  173. <span class=identifier>barn</span><span class=special>(</span> <span class=identifier>begin</span><span class=special>,</span> <span class=identifier>end</span> <span class=special>)</span> <span class=special>{</span> <span class=special>}</span>
  174. <span class=comment>//
  175. // ... so we need some other function too
  176. //</span>
  177. <span class=identifier>animal_iterator</span> <span class=identifier>begin</span><span class=special>()</span>
  178. <span class=special>{</span>
  179. <span class=keyword>return</span> <span class=identifier>barn</span><span class=special>.</span><span class=identifier>begin</span><span class=special>();</span>
  180. <span class=special>}</span>
  181. <span class=identifier>animal_iterator</span> <span class=identifier>end</span><span class=special>()</span>
  182. <span class=special>{</span>
  183. <span class=keyword>return</span> <span class=identifier>barn</span><span class=special>.</span><span class=identifier>end</span><span class=special>();</span>
  184. <span class=special>}</span>
  185. <span class=comment>//
  186. // Here it is quite ok to have an 'animal*' argument.
  187. // The smart container will handle all ownership
  188. // issues.
  189. //</span>
  190. <span class=keyword>void</span> <span class=identifier>buy_animal</span><span class=special>(</span> <span class=identifier>animal</span><span class=special>*</span> <span class=identifier>a</span> <span class=special>)</span>
  191. <span class=special>{</span>
  192. <span class=identifier>barn</span><span class=special>.</span><span class=identifier>push_back</span><span class=special>(</span> <span class=identifier>a</span> <span class=special>);</span>
  193. <span class=special>}</span>
  194. <span class=comment>//
  195. // The farm can also be in economical trouble and
  196. // therefore be in the need to sell animals.
  197. //</span>
  198. <span class=identifier>animal_transport</span> <span class=identifier>sell_animal</span><span class=special>(</span> <span class=identifier>animal_iterator</span> <span class=identifier>to_sell</span> <span class=special>)</span>
  199. <span class=special>{</span>
  200. <span class=keyword>if</span><span class=special>(</span> <span class=identifier>to_sell</span> <span class=special>==</span> <span class=identifier>end</span><span class=special>()</span> <span class=special>)</span>
  201. <span class=keyword>throw</span> <span class=identifier>farm_trouble</span><span class=special>();</span>
  202. <span class=comment>//
  203. // Here we remove the animal from the barn,
  204. // but the animal is not deleted yet...it's
  205. // up to the buyer to decide what
  206. // to do with it.
  207. //</span>
  208. <span class=keyword>return</span> <span class=identifier>barn</span><span class=special>.</span><span class=identifier>release</span><span class=special>(</span> <span class=identifier>to_sell</span> <span class=special>);</span>
  209. <span class=special>}</span>
  210. <span class=comment>//
  211. // How big a farm do we have?
  212. //</span>
  213. <span class=identifier>size_type</span> <span class=identifier>size</span><span class=special>()</span> <span class=keyword>const</span>
  214. <span class=special>{</span>
  215. <span class=keyword>return</span> <span class=identifier>barn</span><span class=special>.</span><span class=identifier>size</span><span class=special>();</span>
  216. <span class=special>}</span>
  217. <span class=comment>//
  218. // If things are bad, we might choose to sell all animals :-(
  219. //</span>
  220. <span class=identifier>raii_ptr</span> <span class=identifier>sell_farm</span><span class=special>()</span>
  221. <span class=special>{</span>
  222. <span class=keyword>return</span> <span class=identifier>barn</span><span class=special>.</span><span class=identifier>release</span><span class=special>();</span>
  223. <span class=special>}</span>
  224. <span class=comment>//
  225. // However, if things are good, we might buy somebody
  226. // else's farm :-)
  227. //</span>
  228. <span class=keyword>void</span> <span class=identifier>buy_farm</span><span class=special>(</span> <span class=identifier>raii_ptr</span> <span class=identifier>other</span> <span class=special>)</span>
  229. <span class=special>{</span>
  230. <span class=comment>//
  231. // This line inserts all the animals from 'other'
  232. // and is guaranteed either to succeed or to have no
  233. // effect
  234. //</span>
  235. <span class=identifier>barn</span><span class=special>.</span><span class=identifier>transfer</span><span class=special>(</span> <span class=identifier>barn</span><span class=special>.</span><span class=identifier>end</span><span class=special>(),</span> <span class=comment>// insert new animals at the end</span>
  236. <span class=special>*</span><span class=identifier>other</span> <span class=special>);</span> <span class=comment>// we want to transfer all animals,
  237. // so we use the whole container as argument
  238. //
  239. // You might think you would have to do
  240. //
  241. // other.release();
  242. //
  243. // but '*other' is empty and can go out of scope as it wants
  244. //</span>
  245. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>other</span><span class=special>-&gt;</span><span class=identifier>empty</span><span class=special>()</span> <span class=special>);</span>
  246. <span class=special>}</span>
  247. <span class=special>};</span> <span class=comment>// class 'farm'.</span>
  248. <span class=keyword>int</span> <span class=identifier>main</span><span class=special>()</span>
  249. <span class=special>{</span>
  250. <span class=comment>//
  251. // First we make a farm
  252. //</span>
  253. <span class=identifier>farm</span> <span class=identifier>animal_farm</span><span class=special>;</span>
  254. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>0u</span> <span class=special>);</span>
  255. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=keyword>new</span> <span class=identifier>pig</span><span class=special>(</span><span class=string>&quot;Betty&quot;</span><span class=special>)</span> <span class=special>);</span>
  256. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=keyword>new</span> <span class=identifier>pig</span><span class=special>(</span><span class=string>&quot;Benny&quot;</span><span class=special>)</span> <span class=special>);</span>
  257. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=keyword>new</span> <span class=identifier>pig</span><span class=special>(</span><span class=string>&quot;Jeltzin&quot;</span><span class=special>)</span> <span class=special>);</span>
  258. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=keyword>new</span> <span class=identifier>cow</span><span class=special>(</span><span class=string>&quot;Hanz&quot;</span><span class=special>)</span> <span class=special>);</span>
  259. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=keyword>new</span> <span class=identifier>cow</span><span class=special>(</span><span class=string>&quot;Mary&quot;</span><span class=special>)</span> <span class=special>);</span>
  260. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=keyword>new</span> <span class=identifier>cow</span><span class=special>(</span><span class=string>&quot;Frederik&quot;</span><span class=special>)</span> <span class=special>);</span>
  261. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>6u</span> <span class=special>);</span>
  262. <span class=comment>//
  263. // Then we make another farm...it will actually contain
  264. // a clone of the other farm.
  265. //</span>
  266. <span class=identifier>farm</span> <span class=identifier>new_farm</span><span class=special>(</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>end</span><span class=special>()</span> <span class=special>);</span>
  267. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>new_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>6u</span> <span class=special>);</span>
  268. <span class=comment>//
  269. // Is it really clones in the new farm?
  270. //</span>
  271. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>new_farm</span><span class=special>.</span><span class=identifier>begin</span><span class=special>()-&gt;</span><span class=identifier>name</span><span class=special>()</span> <span class=special>==</span> <span class=string>&quot;Betty&quot;</span> <span class=special>);</span>
  272. <span class=comment>//
  273. // Then we search for an animal, Mary (the Crown Princess of Denmark),
  274. // because we would like to buy her ...
  275. //</span>
  276. <span class=keyword>typedef</span> <span class=identifier>farm</span><span class=special>::</span><span class=identifier>animal_iterator</span> <span class=identifier>iterator</span><span class=special>;</span>
  277. <span class=identifier>iterator</span> <span class=identifier>to_sell</span><span class=special>;</span>
  278. <span class=keyword>for</span><span class=special>(</span> <span class=identifier>iterator</span> <span class=identifier>i</span> <span class=special>=</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span>
  279. <span class=identifier>end</span> <span class=special>=</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>end</span><span class=special>();</span>
  280. <span class=identifier>i</span> <span class=special>!=</span> <span class=identifier>end</span><span class=special>;</span> <span class=special>++</span><span class=identifier>i</span> <span class=special>)</span>
  281. <span class=special>{</span>
  282. <span class=keyword>if</span><span class=special>(</span> <span class=identifier>i</span><span class=special>-&gt;</span><span class=identifier>name</span><span class=special>()</span> <span class=special>==</span> <span class=string>&quot;Mary&quot;</span> <span class=special>)</span>
  283. <span class=special>{</span>
  284. <span class=identifier>to_sell</span> <span class=special>=</span> <span class=identifier>i</span><span class=special>;</span>
  285. <span class=keyword>break</span><span class=special>;</span>
  286. <span class=special>}</span>
  287. <span class=special>}</span>
  288. <span class=identifier>farm</span><span class=special>::</span><span class=identifier>animal_transport</span> <span class=identifier>mary</span> <span class=special>=</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>sell_animal</span><span class=special>(</span> <span class=identifier>to_sell</span> <span class=special>);</span>
  289. <span class=keyword>if</span><span class=special>(</span> <span class=identifier>mary</span><span class=special>-&gt;</span><span class=identifier>speak</span><span class=special>()</span> <span class=special>==</span> <span class=identifier>muuuh</span> <span class=special>)</span>
  290. <span class=comment>//
  291. // Great, Mary is a cow, and she may live longer
  292. //</span>
  293. <span class=identifier>new_farm</span><span class=special>.</span><span class=identifier>buy_animal</span><span class=special>(</span> <span class=identifier>mary</span><span class=special>.</span><span class=identifier>release</span><span class=special>()</span> <span class=special>);</span>
  294. <span class=keyword>else</span>
  295. <span class=comment>//
  296. // Then the animal would be destroyed (!)
  297. // when we go out of scope.
  298. //</span>
  299. <span class=special>;</span>
  300. <span class=comment>//
  301. // Now we can observe some changes to the two farms...
  302. //</span>
  303. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>5u</span> <span class=special>);</span>
  304. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>new_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>7u</span> <span class=special>);</span>
  305. <span class=comment>//
  306. // The new farm has however underestimated how much
  307. // it cost to feed Mary and its owner is forced to sell the farm...
  308. //</span>
  309. <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>buy_farm</span><span class=special>(</span> <span class=identifier>new_farm</span><span class=special>.</span><span class=identifier>sell_farm</span><span class=special>()</span> <span class=special>);</span>
  310. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>new_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>0u</span> <span class=special>);</span>
  311. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>animal_farm</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>12u</span> <span class=special>);</span>
  312. <span class=special>}</span>
  313. </pre>
  314. </body>
  315. </html>