mirror of
https://github.com/boostorg/utility.git
synced 2025-05-09 15:04:00 +00:00
Added value_initialized::swap documentation + test
[SVN r48425]
This commit is contained in:
parent
55f303baec
commit
6b6e1c3252
@ -253,7 +253,7 @@ its internal data, prior to constructing the object that it contains.
|
|||||||
|
|
||||||
<h2><a name="val_init"><code>template class value_initialized<T></code></a></h2>
|
<h2><a name="val_init"><code>template class value_initialized<T></code></a></h2>
|
||||||
|
|
||||||
<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br> public :<br> value_initialized() : x() {}<br> operator T&() const { return x ; }<br> T& data() const { return x ; }<br><br> private :<br> <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br> return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br> return x.data() ;<br>}<br><br>} // namespace boost<br></pre>
|
<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br> public :<br> value_initialized() : x() {}<br> operator T&() const { return x ; }<br> T& data() const { return x ; }<br> void swap( value_initialized<T>& );<br><br> private :<br> <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br> return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br> return x.data() ;<br>}<br><br>} // namespace boost<br></pre>
|
||||||
|
|
||||||
<p>An object of this template class is a <code>T</code>-wrapper convertible
|
<p>An object of this template class is a <code>T</code>-wrapper convertible
|
||||||
to <code>'T&'</code> whose wrapped object (data member of type <code>T</code>)
|
to <code>'T&'</code> whose wrapped object (data member of type <code>T</code>)
|
||||||
@ -276,6 +276,10 @@ non-member function <code>get()</code>: </p>
|
|||||||
<p>Both <code>const</code> and non-<code>const</code> objects can be wrapped.
|
<p>Both <code>const</code> and non-<code>const</code> objects can be wrapped.
|
||||||
Mutable objects can be modified directly from within the wrapper but constant
|
Mutable objects can be modified directly from within the wrapper but constant
|
||||||
objects cannot:</p>
|
objects cannot:</p>
|
||||||
|
|
||||||
|
<p>When <code>T</code> is a <em>Swappable</em> type, <code>value_initialized<T></code>
|
||||||
|
is swappable as well, by calling its <code>swap</code> member function
|
||||||
|
as well as by calling <code>boost::swap</code>.</p>
|
||||||
|
|
||||||
<pre>value_initialized<int> x ; <br>static_cast<int&>(x) = 1 ; // OK<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> y ; <br>static_cast<int&>(y) = 1 ; // ERROR: cannot cast to int&<br>static_cast<int const&>(y) = 1 ; // ERROR: cannot modify a const value<br>get(y) = 1 ; // ERROR: cannot modify a const value</pre>
|
<pre>value_initialized<int> x ; <br>static_cast<int&>(x) = 1 ; // OK<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> y ; <br>static_cast<int&>(y) = 1 ; // ERROR: cannot cast to int&<br>static_cast<int const&>(y) = 1 ; // ERROR: cannot modify a const value<br>get(y) = 1 ; // ERROR: cannot modify a const value</pre>
|
||||||
|
|
||||||
@ -379,7 +383,7 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<p>Revised 23 May 2008</p>
|
<p>Revised 28 August 2008</p>
|
||||||
|
|
||||||
<p>© Copyright Fernando Cacciola, 2002, 2008.</p>
|
<p>© Copyright Fernando Cacciola, 2002, 2008.</p>
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
// 21 Ago 2002 (Created) Fernando Cacciola
|
// 21 Ago 2002 (Created) Fernando Cacciola
|
||||||
// 15 Jan 2008 (Added tests regarding compiler issues) Fernando Cacciola, Niels Dekker
|
// 15 Jan 2008 (Added tests regarding compiler issues) Fernando Cacciola, Niels Dekker
|
||||||
// 23 May 2008 (Added tests regarding initialized_value) Niels Dekker
|
// 23 May 2008 (Added tests regarding initialized_value) Niels Dekker
|
||||||
|
// 21 Ago 2008 (Added swap test) Niels Dekker
|
||||||
|
|
||||||
#include <cstring> // For memcmp.
|
#include <cstring> // For memcmp.
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -181,6 +182,35 @@ struct CopyFunctionCallTester
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// A struct that allows testing whether its customized swap function is called.
|
||||||
|
//
|
||||||
|
struct SwapFunctionCallTester
|
||||||
|
{
|
||||||
|
bool is_custom_swap_called;
|
||||||
|
int data;
|
||||||
|
|
||||||
|
SwapFunctionCallTester()
|
||||||
|
: is_custom_swap_called(false), data(0) {}
|
||||||
|
|
||||||
|
SwapFunctionCallTester(const SwapFunctionCallTester & arg)
|
||||||
|
: is_custom_swap_called(false), data(arg.data) {}
|
||||||
|
|
||||||
|
void swap(SwapFunctionCallTester & arg)
|
||||||
|
{
|
||||||
|
std::swap(data, arg.data);
|
||||||
|
is_custom_swap_called = true;
|
||||||
|
arg.is_custom_swap_called = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void swap(SwapFunctionCallTester & lhs, SwapFunctionCallTester & rhs)
|
||||||
|
{
|
||||||
|
lhs.swap(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
void check_initialized_value ( T const& y )
|
void check_initialized_value ( T const& y )
|
||||||
{
|
{
|
||||||
@ -323,9 +353,20 @@ int test_main(int, char **)
|
|||||||
BOOST_CHECK ( ! get(copyFunctionCallTester3).is_copy_constructed);
|
BOOST_CHECK ( ! get(copyFunctionCallTester3).is_copy_constructed);
|
||||||
BOOST_CHECK ( get(copyFunctionCallTester3).is_assignment_called);
|
BOOST_CHECK ( get(copyFunctionCallTester3).is_assignment_called);
|
||||||
|
|
||||||
|
boost::value_initialized<SwapFunctionCallTester> swapFunctionCallTester1;
|
||||||
|
boost::value_initialized<SwapFunctionCallTester> swapFunctionCallTester2;
|
||||||
|
get(swapFunctionCallTester1).data = 1;
|
||||||
|
get(swapFunctionCallTester2).data = 2;
|
||||||
|
boost::swap(swapFunctionCallTester1, swapFunctionCallTester2);
|
||||||
|
BOOST_CHECK( get(swapFunctionCallTester1).data == 2 );
|
||||||
|
BOOST_CHECK( get(swapFunctionCallTester2).data == 1 );
|
||||||
|
BOOST_CHECK( get(swapFunctionCallTester1).is_custom_swap_called );
|
||||||
|
BOOST_CHECK( get(swapFunctionCallTester2).is_custom_swap_called );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int expected_failures = 0;
|
unsigned int expected_failures = 0;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user