fixed interop between opt refs and opt vals

This commit is contained in:
Andrzej Krzemienski
2016-03-06 19:08:25 +01:00
parent 547e861704
commit 865d94a8d8
7 changed files with 123 additions and 1 deletions

View File

@ -79,6 +79,7 @@
typedef T value_type ; typedef T value_type ;
typedef T & reference_type ; typedef T & reference_type ;
typedef T const& reference_const_type ; typedef T const& reference_const_type ;
typedef T && rval_reference_type ;
typedef T * pointer_type ; typedef T * pointer_type ;
typedef T const* pointer_const_type ; typedef T const* pointer_const_type ;
@ -182,6 +183,7 @@
typedef T& value_type; typedef T& value_type;
typedef T& reference_type; typedef T& reference_type;
typedef T& reference_const_type; // no const propagation typedef T& reference_const_type; // no const propagation
typedef T& rval_reference_type;
typedef T* pointer_type; typedef T* pointer_type;
typedef T* pointer_const_type; // no const propagation typedef T* pointer_const_type; // no const propagation

View File

@ -35,6 +35,7 @@
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">reference_type</span><span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">reference_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">reference_const_type</span><span class="special">;</span> <span class="comment">// no const propagation</span> <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">reference_const_type</span><span class="special">;</span> <span class="comment">// no const propagation</span>
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rval_reference_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">pointer_type</span><span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">pointer_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">pointer_const_type</span><span class="special">;</span> <span class="comment">// no const propagation</span> <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">pointer_const_type</span><span class="special">;</span> <span class="comment">// no const propagation</span>

View File

@ -35,6 +35,7 @@
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span> <span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span> <span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">reference_type</span> <span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">reference_type</span> <span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">reference_const_type</span> <span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">reference_const_type</span> <span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">&amp;&amp;</span> <span class="identifier">rval_reference_type</span> <span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">pointer_type</span> <span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">*</span> <span class="identifier">pointer_type</span> <span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">pointer_const_type</span> <span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">pointer_const_type</span> <span class="special">;</span>

View File

@ -144,7 +144,7 @@
</div> </div>
</div> </div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"><p><small>Last revised: March 05, 2016 at 22:52:00 GMT</small></p></td> <td align="left"><p><small>Last revised: March 06, 2016 at 18:03:49 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td> <td align="right"><div class="copyright-footer"></div></td>
</tr></table> </tr></table>
<hr> <hr>

View File

@ -86,6 +86,7 @@ public:
typedef T& value_type; typedef T& value_type;
typedef T& reference_type; typedef T& reference_type;
typedef T& reference_const_type; typedef T& reference_const_type;
typedef T& rval_reference_type;
typedef T* pointer_type; typedef T* pointer_type;
typedef T* pointer_const_type; typedef T* pointer_const_type;

View File

@ -30,6 +30,7 @@ import testing ;
[ run optional_test_ref_convert_assign_const_int.cpp ] [ run optional_test_ref_convert_assign_const_int.cpp ]
[ run optional_test_ref_portable_minimum.cpp ] [ run optional_test_ref_portable_minimum.cpp ]
[ run optional_test_ref_move.cpp ] [ run optional_test_ref_move.cpp ]
[ run optional_test_ref_to_val.cpp ]
[ run optional_test_inplace_factory.cpp ] [ run optional_test_inplace_factory.cpp ]
[ run optional_test_io.cpp ] [ run optional_test_io.cpp ]
[ run optional_test_move.cpp ] [ run optional_test_move.cpp ]

View File

@ -0,0 +1,116 @@
// Copyright (C) 2016 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/lib/optional for documentation.
//
// You are welcome to contact the author at:
// akrzemi1@gmail.com
#include "boost/optional/optional.hpp"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "boost/core/lightweight_test.hpp"
using boost::optional;
using boost::none;
struct Value
{
int val;
explicit Value(int v) : val(v) {}
};
int val(int const& i)
{
return i;
}
int val(Value const& v)
{
return v.val;
}
template <typename Tref>
optional<Tref&> make_opt_ref(Tref& v)
{
return optional<Tref&>(v);
}
template <typename Tval, typename Tref>
void test_construct_from_optional_ref()
{
Tref v1 (1), v2 (2);
optional<Tref&> opt_ref0;
optional<Tref&> opt_ref1 (v1);
optional<Tval> opt_val0 (opt_ref0);
optional<Tval> opt_val1 (opt_ref1);
optional<Tval> opt_val2 (make_opt_ref(v2));
BOOST_TEST (!opt_val0);
BOOST_TEST (opt_val1);
BOOST_TEST (opt_val2);
BOOST_TEST_EQ (1, val(*opt_val1));
BOOST_TEST_EQ (2, val(*opt_val2));
BOOST_TEST (boost::addressof(*opt_val1) != boost::addressof(v1));
BOOST_TEST (boost::addressof(*opt_val2) != boost::addressof(v2));
}
template <typename Tval, typename Tref>
void test_assign_from_optional_ref()
{
Tref v1 (1), v2 (2);
optional<Tref&> opt_ref0;
optional<Tref&> opt_ref1 (v1);
optional<Tval> opt_val0;
optional<Tval> opt_val1;
optional<Tval> opt_val2;
opt_val0 = opt_ref0;
opt_val1 = opt_ref1;
opt_val2 = make_opt_ref(v2);
BOOST_TEST (!opt_val0);
BOOST_TEST (opt_val1);
BOOST_TEST (opt_val2);
BOOST_TEST_EQ (1, val(*opt_val1));
BOOST_TEST_EQ (2, val(*opt_val2));
BOOST_TEST (boost::addressof(*opt_val1) != boost::addressof(v1));
BOOST_TEST (boost::addressof(*opt_val2) != boost::addressof(v2));
}
int main()
{
test_construct_from_optional_ref<int, int>();
test_construct_from_optional_ref<int, int const>();
test_construct_from_optional_ref<int const, int const>();
test_construct_from_optional_ref<int const, int>();
test_construct_from_optional_ref<Value, Value>();
test_construct_from_optional_ref<Value, Value const>();
test_construct_from_optional_ref<Value const, Value const>();
test_construct_from_optional_ref<Value const, Value>();
test_assign_from_optional_ref<int, int>();
test_assign_from_optional_ref<int, int const>();
test_assign_from_optional_ref<Value, Value>();
test_assign_from_optional_ref<Value, Value const>();
return boost::report_errors();
}