diff --git a/doc/27_ref_optional_synopsis.qbk b/doc/27_ref_optional_synopsis.qbk index 6a4f853..54523d6 100644 --- a/doc/27_ref_optional_synopsis.qbk +++ b/doc/27_ref_optional_synopsis.qbk @@ -79,6 +79,7 @@ typedef T value_type ; typedef T & reference_type ; typedef T const& reference_const_type ; + typedef T && rval_reference_type ; typedef T * pointer_type ; typedef T const* pointer_const_type ; @@ -182,6 +183,7 @@ typedef T& value_type; typedef T& reference_type; typedef T& reference_const_type; // no const propagation + typedef T& rval_reference_type; typedef T* pointer_type; typedef T* pointer_const_type; // no const propagation diff --git a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html index c3325c5..3ce9d0a 100644 --- a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html +++ b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_refs.html @@ -35,6 +35,7 @@ typedef T& value_type; typedef T& reference_type; typedef T& reference_const_type; // no const propagation + typedef T& rval_reference_type; typedef T* pointer_type; typedef T* pointer_const_type; // no const propagation diff --git a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html index 2877563..56d02de 100644 --- a/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html +++ b/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/header_optional_optional_values.html @@ -35,6 +35,7 @@ typedef T value_type ; typedef T & reference_type ; typedef T const& reference_const_type ; + typedef T && rval_reference_type ; typedef T * pointer_type ; typedef T const* pointer_const_type ; diff --git a/doc/html/index.html b/doc/html/index.html index b61f7b4..0addd4c 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -144,7 +144,7 @@ - +

Last revised: March 05, 2016 at 22:52:00 GMT

Last revised: March 06, 2016 at 18:03:49 GMT


diff --git a/include/boost/optional/detail/optional_reference_spec.hpp b/include/boost/optional/detail/optional_reference_spec.hpp index eeabade..ba3951a 100644 --- a/include/boost/optional/detail/optional_reference_spec.hpp +++ b/include/boost/optional/detail/optional_reference_spec.hpp @@ -86,6 +86,7 @@ public: typedef T& value_type; typedef T& reference_type; typedef T& reference_const_type; + typedef T& rval_reference_type; typedef T* pointer_type; typedef T* pointer_const_type; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 20be6cf..7394ce8 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -30,6 +30,7 @@ import testing ; [ run optional_test_ref_convert_assign_const_int.cpp ] [ run optional_test_ref_portable_minimum.cpp ] [ run optional_test_ref_move.cpp ] + [ run optional_test_ref_to_val.cpp ] [ run optional_test_inplace_factory.cpp ] [ run optional_test_io.cpp ] [ run optional_test_move.cpp ] diff --git a/test/optional_test_ref_to_val.cpp b/test/optional_test_ref_to_val.cpp new file mode 100644 index 0000000..19e1675 --- /dev/null +++ b/test/optional_test_ref_to_val.cpp @@ -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 +optional make_opt_ref(Tref& v) +{ + return optional(v); +} + +template +void test_construct_from_optional_ref() +{ + Tref v1 (1), v2 (2); + + optional opt_ref0; + optional opt_ref1 (v1); + + optional opt_val0 (opt_ref0); + optional opt_val1 (opt_ref1); + optional 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 +void test_assign_from_optional_ref() +{ + Tref v1 (1), v2 (2); + + optional opt_ref0; + optional opt_ref1 (v1); + + optional opt_val0; + optional opt_val1; + optional 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(); + test_construct_from_optional_ref(); + test_construct_from_optional_ref(); + test_construct_from_optional_ref(); + + test_construct_from_optional_ref(); + test_construct_from_optional_ref(); + test_construct_from_optional_ref(); + test_construct_from_optional_ref(); + + test_assign_from_optional_ref(); + test_assign_from_optional_ref(); + + test_assign_from_optional_ref(); + test_assign_from_optional_ref(); + + return boost::report_errors(); +}