mirror of
https://github.com/boostorg/utility.git
synced 2025-12-22 23:02:43 +01:00
Compare commits
5 Commits
boost-1.40
...
boost-1.41
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15ad13a258 | ||
|
|
ee146a02a1 | ||
|
|
c131cbd0b2 | ||
|
|
f8bef7ba95 | ||
|
|
e54cbf3053 |
@@ -1,37 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright Troy D. Straszheim
|
|
||||||
#
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# See http://www.boost.org/LICENSE_1_0.txt
|
|
||||||
#
|
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
# This file was automatically generated from the original CMakeLists.txt file
|
|
||||||
# Add a variable to hold the headers for the library
|
|
||||||
set (lib_headers
|
|
||||||
assert.hpp
|
|
||||||
call_traits.hpp
|
|
||||||
checked_delete.hpp
|
|
||||||
compressed_pair.hpp
|
|
||||||
current_function.hpp
|
|
||||||
operators.hpp
|
|
||||||
throw_exception.hpp
|
|
||||||
utility.hpp
|
|
||||||
utility
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add a library target to the build system
|
|
||||||
boost_library_project(
|
|
||||||
utility
|
|
||||||
# SRCDIRS
|
|
||||||
TESTDIRS test swap/test enable_if/test
|
|
||||||
HEADERS ${lib_headers}
|
|
||||||
# DOCDIRS
|
|
||||||
DESCRIPTION "Various small utilities for C++ programming."
|
|
||||||
MODULARIZED
|
|
||||||
AUTHORS "David Abrahams <dave -at- boostpro.com>"
|
|
||||||
"Brad King"
|
|
||||||
"Douglas Gregor <doug.gregor -at- gmail.com>"
|
|
||||||
# MAINTAINERS
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright Troy D. Straszheim
|
|
||||||
#
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# See http://www.boost.org/LICENSE_1_0.txt
|
|
||||||
#
|
|
||||||
foreach(T
|
|
||||||
constructors
|
|
||||||
dummy_arg_disambiguation
|
|
||||||
lazy
|
|
||||||
lazy_test
|
|
||||||
member_templates
|
|
||||||
namespace_disambiguation
|
|
||||||
no_disambiguation
|
|
||||||
partial_specializations
|
|
||||||
)
|
|
||||||
boost_test_run(${T} DEPENDS boost_test_exec_monitor)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
|
// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
|
||||||
// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
|
// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
|
||||||
// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
|
// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
|
||||||
|
// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola
|
||||||
//
|
//
|
||||||
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
||||||
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
||||||
@@ -90,7 +91,12 @@ class value_initialized
|
|||||||
wrapper_address()->wrapper::~wrapper();
|
wrapper_address()->wrapper::~wrapper();
|
||||||
}
|
}
|
||||||
|
|
||||||
T& data() const
|
T const & data() const
|
||||||
|
{
|
||||||
|
return wrapper_address()->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
T& data()
|
||||||
{
|
{
|
||||||
return wrapper_address()->data;
|
return wrapper_address()->data;
|
||||||
}
|
}
|
||||||
@@ -100,12 +106,16 @@ class value_initialized
|
|||||||
::boost::swap( this->data(), arg.data() );
|
::boost::swap( this->data(), arg.data() );
|
||||||
}
|
}
|
||||||
|
|
||||||
operator T&() const { return this->data(); }
|
operator T const &() const { return this->data(); }
|
||||||
|
|
||||||
|
operator T&() { return this->data(); }
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
T const& get ( value_initialized<T> const& x )
|
T const& get ( value_initialized<T> const& x )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
boost_module(utility DEPENDS iterator exception detail )
|
|
||||||
@@ -7,7 +7,11 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Page header -->
|
<!-- Page header -->
|
||||||
|
<h2>
|
||||||
<img src="../../boost.png" alt="C++ Boost" align="middle" width="277" height="86"/>
|
<img src="../../boost.png" alt="C++ Boost" align="middle" width="277" height="86"/>
|
||||||
|
Header <<a href="../../boost/swap.hpp">boost/swap.hpp</a>>
|
||||||
|
</h2>
|
||||||
|
|
||||||
<h1>Swap</h1>
|
<h1>Swap</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -84,9 +88,9 @@
|
|||||||
|
|
||||||
<!-- Copyright info -->
|
<!-- Copyright info -->
|
||||||
<hr/>
|
<hr/>
|
||||||
<p>Revised: 15 November 2008</p>
|
<p>Revised: 08 September 2009</p>
|
||||||
<p>
|
<p>
|
||||||
Copyright 2007, 2008 Joseph Gauterin. Use, modification, and distribution are subject to the Boost Software License, Version 1.0.
|
Copyright 2007 - 2009 Joseph Gauterin. Use, modification, and distribution are subject to the Boost Software License, Version 1.0.
|
||||||
(See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or a copy at <<a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>>.)
|
(See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or a copy at <<a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>>.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright Troy D. Straszheim
|
|
||||||
#
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# See http://www.boost.org/LICENSE_1_0.txt
|
|
||||||
#
|
|
||||||
|
|
||||||
foreach(T
|
|
||||||
root_header_1 root_header_2
|
|
||||||
lib_header_1 lib_header_2
|
|
||||||
mixed_headers_1 mixed_headers_2)
|
|
||||||
boost_test_compile(${T})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
|
|
||||||
# [ run primitive.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
|
||||||
|
|
||||||
|
|
||||||
foreach(T
|
|
||||||
primitive
|
|
||||||
specialized_in_boost
|
|
||||||
specialized_in_global
|
|
||||||
specialized_in_other
|
|
||||||
specialized_in_std
|
|
||||||
specialized_in_boost_and_other
|
|
||||||
std_bitset
|
|
||||||
std_dateorder
|
|
||||||
std_string
|
|
||||||
std_typeinfo_ptr
|
|
||||||
std_vector_of_boost
|
|
||||||
std_vector_of_global
|
|
||||||
std_vector_of_other
|
|
||||||
no_ambiguity_in_boost
|
|
||||||
array_of_array_of_class
|
|
||||||
array_of_array_of_int
|
|
||||||
array_of_class
|
|
||||||
array_of_int
|
|
||||||
array_of_template)
|
|
||||||
boost_test_run(${T} DEPENDS boost_test_exec_monitor)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright Troy D. Straszheim
|
|
||||||
#
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# See http://www.boost.org/LICENSE_1_0.txt
|
|
||||||
#
|
|
||||||
boost_additional_test_dependencies(utility BOOST_DEPENDS test)
|
|
||||||
|
|
||||||
boost_test_run(addressof_fn_test ../addressof_fn_test.cpp)
|
|
||||||
boost_test_run(addressof_test ../addressof_test.cpp)
|
|
||||||
boost_test_run(addressof_test2 ../addressof_test2.cpp)
|
|
||||||
boost_test_run(assert_test ../assert_test.cpp)
|
|
||||||
boost_test_run(base_from_member_test ../base_from_member_test.cpp)
|
|
||||||
boost_test_run(binary_search_test ../binary_search_test.cpp)
|
|
||||||
boost_test_run(call_traits_test ../call_traits_test.cpp ARGS -u)
|
|
||||||
boost_test_compile_fail(checked_delete_test ../checked_delete_test.cpp)
|
|
||||||
boost_test_run(compressed_pair_test
|
|
||||||
../compressed_pair_test
|
|
||||||
DEPENDS boost_test_exec_monitor)
|
|
||||||
boost_test_run(current_function_test ../current_function_test.cpp)
|
|
||||||
boost_test_run(iterators_test
|
|
||||||
../iterators_test.cpp
|
|
||||||
DEPENDS boost_test_exec_monitor)
|
|
||||||
boost_test_run(next_prior_test DEPENDS boost_test_exec_monitor)
|
|
||||||
boost_test_compile_fail(noncopyable_test ../noncopyable_test.cpp)
|
|
||||||
boost_test_run(numeric_traits_test ../numeric_traits_test.cpp)
|
|
||||||
if (${CMAKE_SYSTEM} MATCHES "FreeBSD-.*")
|
|
||||||
boost_test_compile_fail("operators_test_compilerbug")
|
|
||||||
elseif(${CMAKE_SYSTEM} MATCHES "FreeBSD-.*")
|
|
||||||
boost_test_run(operators_test
|
|
||||||
../operators_test.cpp
|
|
||||||
DEPENDS boost_test_exec_monitor)
|
|
||||||
endif(${CMAKE_SYSTEM} MATCHES "FreeBSD-.*")
|
|
||||||
boost_test_compile(ref_ct_test ../ref_ct_test.cpp)
|
|
||||||
boost_test_run(ref_test
|
|
||||||
../ref_test.cpp
|
|
||||||
DEPENDS boost_test_exec_monitor)
|
|
||||||
boost_test_compile(result_of_test)
|
|
||||||
boost_test_run(shared_iterator_test ../shared_iterator_test.cpp)
|
|
||||||
boost_test_run(value_init_test ../value_init_test.cpp)
|
|
||||||
boost_test_compile_fail(value_init_test_fail1
|
|
||||||
../value_init_test_fail1.cpp)
|
|
||||||
boost_test_compile_fail(value_init_test_fail2
|
|
||||||
../value_init_test_fail2.cpp)
|
|
||||||
boost_test_compile_fail(value_init_test_fail3
|
|
||||||
../value_init_test_fail3.cpp)
|
|
||||||
boost_test_run(verify_test ../verify_test.cpp)
|
|
||||||
0
test/next_prior_test.cpp
Executable file → Normal file
0
test/next_prior_test.cpp
Executable file → Normal file
@@ -253,7 +253,33 @@ 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> 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>
|
<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{
|
||||||
|
<br> public :
|
||||||
|
<br> value_initialized() : x() {}
|
||||||
|
<br> operator T const &() const { return x ; }
|
||||||
|
<br> operator T&() { return x ; }
|
||||||
|
<br> T const &data() const { return x ; }
|
||||||
|
<br> T& data() { 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>)
|
||||||
@@ -271,7 +297,8 @@ its internal data, prior to constructing the object that it contains.
|
|||||||
<code>T&</code>, the member function <code>data()</code>, or the
|
<code>T&</code>, the member function <code>data()</code>, or the
|
||||||
non-member function <code>get()</code>: </p>
|
non-member function <code>get()</code>: </p>
|
||||||
|
|
||||||
<pre>void watch(int);<br>value_initialized<int> x;<br><br>watch(x) ; // operator T& used.<br>watch(x.data());<br>watch( get(x) ) // function get() used</pre>
|
<pre>void watch(int);<br>value_initialized<int> x;
|
||||||
|
<br><br>watch(x) ; // operator T& used.<br>watch(x.data());<br>watch( get(x) ) // function get() used</pre>
|
||||||
|
|
||||||
<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
|
||||||
@@ -281,37 +308,34 @@ non-member function <code>get()</code>: </p>
|
|||||||
is swappable as well, by calling its <code>swap</code> member function
|
is swappable as well, by calling its <code>swap</code> member function
|
||||||
as well as by calling <code>boost::swap</code>.</p>
|
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>
|
||||||
|
|
||||||
<h3>Warning:</h3>
|
<h3>Warning:</h3>
|
||||||
|
|
||||||
<p>Both the conversion operator and the <code>data()</code> member function
|
<p>The <code>value_initialized</code> implementation of Boost version 1.40.0 and older
|
||||||
are <code>const</code> in order to allow access to the wrapped object
|
allowed <i>non-const</i> access to the wrapped object, from a constant wrapper,
|
||||||
from a constant wrapper:</p>
|
both by its conversion operator and its <code>data()</code> member function. For example:</p>
|
||||||
|
|
||||||
<pre>void foo(int);<br>value_initialized<int> const x ;<br>foo(x);<br></pre>
|
<pre>value_initialized<int> const x_c ;<br>int& xr = x_c ; // OK, conversion to int& available even though x_c is itself const.
|
||||||
|
<br>xr = 2 ; </pre>
|
||||||
|
|
||||||
<p>But notice that this conversion operator is to <code>T&</code> although
|
<p>The reason for this obscure behavior was that some compilers
|
||||||
it is itself <code>const</code>. As a consequence, if <code>T</code> is
|
didn't accept the following valid code:</p>
|
||||||
a non-<code>const</code> type, you can modify the wrapped object even from
|
|
||||||
within a constant wrapper:</p>
|
|
||||||
|
|
||||||
<pre>value_initialized<int> const x_c ;<br>int& xr = x_c ; // OK, conversion to int& available even though x_c is itself const.<br>xr = 2 ; </pre>
|
|
||||||
|
|
||||||
<p>The reason for this obscure behavior is that some commonly used compilers
|
|
||||||
just don't accept the following valid code:</p>
|
|
||||||
|
|
||||||
<pre>struct X<br>{<br> operator int&() ;<br> operator int const&() const ; <br>};<br>X x ;<br>(x == 1 ) ; // ERROR HERE!</pre>
|
<pre>struct X<br>{<br> operator int&() ;<br> operator int const&() const ; <br>};<br>X x ;<br>(x == 1 ) ; // ERROR HERE!</pre>
|
||||||
|
|
||||||
<p>These compilers complain about ambiguity between the conversion operators.
|
<p>The current version of <code>value_initialized</code> no longer has this obscure behavior.
|
||||||
This complaint is incorrect, but the only workaround that I know of is
|
As compilers nowadays widely support overloading the conversion operator by having a <code>const</code> and a <code>non-const</code> version, we have decided to fix the issue accordingly. So the current version supports the idea of logical constness.
|
||||||
to provide only one of them, which leads to the obscure behavior just explained.<br>
|
<br>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>Recommended practice: The non-member get() idiom</h3>
|
<h3>Recommended practice: The non-member get() idiom</h3>
|
||||||
|
|
||||||
<p>The obscure behavior of being able to modify a non-<code>const</code>
|
<p>The obscure behavior of being able to modify a non-<code>const</code>
|
||||||
wrapped object from within a constant wrapper can be avoided if access to
|
wrapped object from within a constant wrapper (as was supported by previous
|
||||||
|
versions of <code>value_initialized</code>)
|
||||||
|
can be avoided if access to
|
||||||
the wrapped object is always performed with the <code>get()</code> idiom:</p>
|
the wrapped object is always performed with the <code>get()</code> idiom:</p>
|
||||||
|
|
||||||
<pre>value_initialized<int> x ;<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> cx ;<br>get(x) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int> const x_c ;<br>get(x_c) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int const> const cx_c ;<br>get(cx_c) = 1 ; // ERROR: Cannot modify a const object<br></pre>
|
<pre>value_initialized<int> x ;<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> cx ;<br>get(x) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int> const x_c ;<br>get(x_c) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int const> const cx_c ;<br>get(cx_c) = 1 ; // ERROR: Cannot modify a const object<br></pre>
|
||||||
@@ -383,9 +407,9 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<p>Revised 28 August 2008</p>
|
<p>Revised 03 October 2009</p>
|
||||||
|
|
||||||
<p>© Copyright Fernando Cacciola, 2002, 2008.</p>
|
<p>© Copyright Fernando Cacciola, 2002, 2009.</p>
|
||||||
|
|
||||||
<p>Distributed under the Boost Software License, Version 1.0. See
|
<p>Distributed under the Boost Software License, Version 1.0. See
|
||||||
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
|
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ bool test ( T const& y, T const& z )
|
|||||||
boost::value_initialized<T> const x_c ;
|
boost::value_initialized<T> const x_c ;
|
||||||
BOOST_CHECK ( y == x_c ) ;
|
BOOST_CHECK ( y == x_c ) ;
|
||||||
BOOST_CHECK ( y == boost::get(x_c) ) ;
|
BOOST_CHECK ( y == boost::get(x_c) ) ;
|
||||||
T& x_c_ref = x_c ;
|
T& x_c_ref = const_cast<T&>( boost::get(x_c) ) ;
|
||||||
x_c_ref = z ;
|
x_c_ref = z ;
|
||||||
BOOST_CHECK ( x_c == z ) ;
|
BOOST_CHECK ( x_c == z ) ;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user