3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=ISO-8859-1">
5 <link rel=
"stylesheet" href=
"default.css" type=
"text/css">
9 <pre><span class=comment
>//
10 // Boost.Pointer Container
12 // Copyright Thorsten Ottosen
2003-
2005. Use, modification and
13 // distribution is subject to the Boost Software License, Version
14 //
1.0. (See accompanying file LICENSE_1_0.txt or copy at
15 // http://www.boost.org/LICENSE_1_0.txt)
17 // For more information, see http://www.boost.org/libs/ptr_container/
21 // This example is intended to get you started.
22 // Notice how the smart container
24 //
1. takes ownership of objects
25 //
2. transfers ownership
26 //
3. applies indirection to iterators
27 //
4. clones objects from other smart containers
31 // First we select which container to use.
33 <span class=preprocessor
>#include
</span> <span class=special
><</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
>></span>
35 <span class=comment
>//
36 // we need these later in the example
38 <span class=preprocessor
>#include
</span> <span class=special
><</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
>></span>
39 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>string
</span><span class=special
>></span>
40 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>exception
</span><span class=special
>></span>
43 <span class=comment
>//
44 // Then we define a small polymorphic class
48 <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>
49 <span class=special
>{
</span>
50 <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>
51 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>string
</span> <span class=identifier
>name_
</span><span class=special
>;
</span>
53 <span class=keyword
>protected
</span><span class=special
>:
</span>
54 <span class=comment
>//
55 // Animals cannot be copied...
57 <span class=identifier
>animal
</span><span class=special
>(
</span> <span class=keyword
>const
</span> <span class=identifier
>animal
</span><span class=special
>&</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>
58 <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
>&</span> <span class=special
>);
</span>
60 <span class=keyword
>private
</span><span class=special
>:
</span>
61 <span class=comment
>//
62 // ...but due to advances in genetics, we can clone them!
65 <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>
67 <span class=keyword
>public
</span><span class=special
>:
</span>
68 <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
>&</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>
69 <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>
71 <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>
72 <span class=special
>{
</span>
73 <span class=keyword
>return
</span> <span class=identifier
>do_speak
</span><span class=special
>();
</span>
74 <span class=special
>}
</span>
76 <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>
77 <span class=special
>{
</span>
78 <span class=keyword
>return
</span> <span class=identifier
>name_
</span><span class=special
>;
</span>
79 <span class=special
>}
</span>
81 <span class=identifier
>animal
</span><span class=special
>*
</span> <span class=identifier
>clone
</span><span class=special
>()
</span> <span class=keyword
>const
</span>
82 <span class=special
>{
</span>
83 <span class=keyword
>return
</span> <span class=identifier
>do_clone
</span><span class=special
>();
</span>
84 <span class=special
>}
</span>
85 <span class=special
>};
</span>
87 <span class=comment
>//
88 // An animal is still not Clonable. We need this last hook.
90 // Notice that we pass the animal by const reference
91 // and return by pointer.
94 <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
>&</span> <span class=identifier
>a
</span> <span class=special
>)
</span>
95 <span class=special
>{
</span>
96 <span class=keyword
>return
</span> <span class=identifier
>a
</span><span class=special
>.
</span><span class=identifier
>clone
</span><span class=special
>();
</span>
97 <span class=special
>}
</span>
99 <span class=comment
>//
100 // We do not need to define 'delete_clone()' since
101 // since the default is to call the default 'operator delete()'.
104 <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
>"Muuuh!
"</span><span class=special
>;
</span>
105 <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
>"Oiiink
"</span><span class=special
>;
</span>
107 <span class=keyword
>class
</span> <span class=identifier
>cow
</span> <span class=special
>:
</span> <span class=keyword
>public
</span> <span class=identifier
>animal
</span>
108 <span class=special
>{
</span>
109 <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>
110 <span class=special
>{
</span>
111 <span class=keyword
>return
</span> <span class=identifier
>muuuh
</span><span class=special
>;
</span>
112 <span class=special
>}
</span>
114 <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>
115 <span class=special
>{
</span>
116 <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>
117 <span class=special
>}
</span>
119 <span class=keyword
>public
</span><span class=special
>:
</span>
120 <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
>&</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>
121 <span class=special
>};
</span>
123 <span class=keyword
>class
</span> <span class=identifier
>pig
</span> <span class=special
>:
</span> <span class=keyword
>public
</span> <span class=identifier
>animal
</span>
124 <span class=special
>{
</span>
125 <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>
126 <span class=special
>{
</span>
127 <span class=keyword
>return
</span> <span class=identifier
>oiink
</span><span class=special
>;
</span>
128 <span class=special
>}
</span>
130 <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>
131 <span class=special
>{
</span>
132 <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>
133 <span class=special
>}
</span>
135 <span class=keyword
>public
</span><span class=special
>:
</span>
136 <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
>&</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>
137 <span class=special
>};
</span>
139 <span class=comment
>//
140 // Then we, of course, need a place to put all
144 <span class=keyword
>class
</span> <span class=identifier
>farm
</span>
145 <span class=special
>{
</span>
146 <span class=comment
>//
147 // This is where the smart containers are handy
149 <span class=keyword
>typedef
</span> <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>ptr_deque
</span><span class=special
><</span><span class=identifier
>animal
</span><span class=special
>></span> <span class=identifier
>barn_type
</span><span class=special
>;
</span>
150 <span class=identifier
>barn_type
</span> <span class=identifier
>barn
</span><span class=special
>;
</span>
152 <span class=comment
>//
155 <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>
157 <span class=keyword
>public
</span><span class=special
>:
</span>
158 <span class=comment
>//
159 // We would like to make it possible to
160 // iterate over the animals in the farm
162 <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>
164 <span class=comment
>//
165 // We also need to count the farm's size...
167 <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>
169 <span class=comment
>//
170 // And we also want to transfer an animal
171 // safely around. The easiest way to think
172 // about '::auto_type' is to imagine a simplified
173 // 'std::auto_ptr
<T
>' ... this means you can expect
175 // T* operator-
>()
177 // deleting destructor
181 <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>
183 <span class=comment
>//
184 // Create an empty farm.
186 <span class=identifier
>farm
</span><span class=special
>()
</span> <span class=special
>{
</span> <span class=special
>}
</span>
188 <span class=comment
>//
189 // We need a constructor that can make a new
190 // farm by cloning a range of animals.
192 <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>
193 <span class=special
>:
</span>
194 <span class=comment
>//
195 // Objects are always cloned before insertion
196 // unless we explicitly add a pointer or
197 // use 'release()'. Therefore we actually
198 // clone all animals in the range
200 <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>
202 <span class=comment
>//
203 // ... so we need some other function too
206 <span class=identifier
>animal_iterator
</span> <span class=identifier
>begin
</span><span class=special
>()
</span>
207 <span class=special
>{
</span>
208 <span class=keyword
>return
</span> <span class=identifier
>barn
</span><span class=special
>.
</span><span class=identifier
>begin
</span><span class=special
>();
</span>
209 <span class=special
>}
</span>
211 <span class=identifier
>animal_iterator
</span> <span class=identifier
>end
</span><span class=special
>()
</span>
212 <span class=special
>{
</span>
213 <span class=keyword
>return
</span> <span class=identifier
>barn
</span><span class=special
>.
</span><span class=identifier
>end
</span><span class=special
>();
</span>
214 <span class=special
>}
</span>
216 <span class=comment
>//
217 // Here it is quite ok to have an 'animal*' argument.
218 // The smart container will handle all ownership
221 <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>
222 <span class=special
>{
</span>
223 <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>
224 <span class=special
>}
</span>
226 <span class=comment
>//
227 // The farm can also be in economical trouble and
228 // therefore be in the need to sell animals.
230 <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>
231 <span class=special
>{
</span>
232 <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>
233 <span class=keyword
>throw
</span> <span class=identifier
>farm_trouble
</span><span class=special
>();
</span>
235 <span class=comment
>//
236 // Here we remove the animal from the barn,
237 // but the animal is not deleted yet...it's
238 // up to the buyer to decide what
241 <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>
242 <span class=special
>}
</span>
244 <span class=comment
>//
245 // How big a farm do we have?
247 <span class=identifier
>size_type
</span> <span class=identifier
>size
</span><span class=special
>()
</span> <span class=keyword
>const
</span>
248 <span class=special
>{
</span>
249 <span class=keyword
>return
</span> <span class=identifier
>barn
</span><span class=special
>.
</span><span class=identifier
>size
</span><span class=special
>();
</span>
250 <span class=special
>}
</span>
252 <span class=comment
>//
253 // If things are bad, we might choose to sell all animals :-(
255 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>auto_ptr
</span><span class=special
><</span><span class=identifier
>barn_type
</span><span class=special
>></span> <span class=identifier
>sell_farm
</span><span class=special
>()
</span>
256 <span class=special
>{
</span>
257 <span class=keyword
>return
</span> <span class=identifier
>barn
</span><span class=special
>.
</span><span class=identifier
>release
</span><span class=special
>();
</span>
258 <span class=special
>}
</span>
260 <span class=comment
>//
261 // However, if things are good, we might buy somebody
265 <span class=keyword
>void
</span> <span class=identifier
>buy_farm
</span><span class=special
>(
</span> <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>auto_ptr
</span><span class=special
><</span><span class=identifier
>barn_type
</span><span class=special
>></span> <span class=identifier
>other
</span> <span class=special
>)
</span>
266 <span class=special
>{
</span>
267 <span class=comment
>//
268 // This line inserts all the animals from 'other'
269 // and is guaranteed either to succeed or to have no
272 <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>
273 <span class=special
>*
</span><span class=identifier
>other
</span> <span class=special
>);
</span> <span class=comment
>// we want to transfer all animals,
274 // so we use the whole container as argument
276 // You might think you would have to do
280 // but '*other' is empty and can go out of scope as it wants
282 <span class=identifier
>BOOST_ASSERT
</span><span class=special
>(
</span> <span class=identifier
>other
</span><span class=special
>-
></span><span class=identifier
>empty
</span><span class=special
>()
</span> <span class=special
>);
</span>
283 <span class=special
>}
</span>
285 <span class=special
>};
</span> <span class=comment
>// class 'farm'.
</span>
287 <span class=keyword
>int
</span> <span class=identifier
>main
</span><span class=special
>()
</span>
288 <span class=special
>{
</span>
289 <span class=comment
>//
290 // First we make a farm
292 <span class=identifier
>farm
</span> <span class=identifier
>animal_farm
</span><span class=special
>;
</span>
293 <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>
295 <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
>"Betty
"</span><span class=special
>)
</span> <span class=special
>);
</span>
296 <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
>"Benny
"</span><span class=special
>)
</span> <span class=special
>);
</span>
297 <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
>"Jeltzin
"</span><span class=special
>)
</span> <span class=special
>);
</span>
298 <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
>"Hanz
"</span><span class=special
>)
</span> <span class=special
>);
</span>
299 <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
>"Mary
"</span><span class=special
>)
</span> <span class=special
>);
</span>
300 <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
>"Frederik
"</span><span class=special
>)
</span> <span class=special
>);
</span>
301 <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>
303 <span class=comment
>//
304 // Then we make another farm...it will actually contain
305 // a clone of the other farm.
307 <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>
308 <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>
310 <span class=comment
>//
311 // Is it really clones in the new farm?
313 <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
>()-
></span><span class=identifier
>name
</span><span class=special
>()
</span> <span class=special
>==
</span> <span class=string
>"Betty
"</span> <span class=special
>);
</span>
315 <span class=comment
>//
316 // Then we search for an animal, Mary (the Crown Princess of Denmark),
317 // because we would like to buy her ...
319 <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>
320 <span class=identifier
>iterator
</span> <span class=identifier
>to_sell
</span><span class=special
>;
</span>
321 <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>
322 <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>
323 <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>
324 <span class=special
>{
</span>
325 <span class=keyword
>if
</span><span class=special
>(
</span> <span class=identifier
>i
</span><span class=special
>-
></span><span class=identifier
>name
</span><span class=special
>()
</span> <span class=special
>==
</span> <span class=string
>"Mary
"</span> <span class=special
>)
</span>
326 <span class=special
>{
</span>
327 <span class=identifier
>to_sell
</span> <span class=special
>=
</span> <span class=identifier
>i
</span><span class=special
>;
</span>
328 <span class=keyword
>break
</span><span class=special
>;
</span>
329 <span class=special
>}
</span>
330 <span class=special
>}
</span>
332 <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>
335 <span class=keyword
>if
</span><span class=special
>(
</span> <span class=identifier
>mary
</span><span class=special
>-
></span><span class=identifier
>speak
</span><span class=special
>()
</span> <span class=special
>==
</span> <span class=identifier
>muuuh
</span> <span class=special
>)
</span>
336 <span class=comment
>//
337 // Great, Mary is a cow, and she may live longer
339 <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>
340 <span class=keyword
>else
</span>
341 <span class=comment
>//
342 // Then the animal would be destroyed (!)
343 // when we go out of scope.
345 <span class=special
>;
</span>
347 <span class=comment
>//
348 // Now we can observe some changes to the two farms...
350 <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>
351 <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>
353 <span class=comment
>//
354 // The new farm has however underestimated how much
355 // it cost to feed Mary and its owner is forced to sell the farm...
357 <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>
359 <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>
360 <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>
361 <span class=special
>}
</span>