bug fixes

This commit is contained in:
Andrzej Krzemienski
2015-10-06 00:33:14 +02:00
parent e7cab0e233
commit b0d7786e14
5 changed files with 23 additions and 18 deletions

View File

@ -82,7 +82,7 @@ public:
void swap(optional& rhs) BOOST_NOEXCEPT { std::swap(ptr_, rhs.ptr_); } void swap(optional& rhs) BOOST_NOEXCEPT { std::swap(ptr_, rhs.ptr_); }
T& get() const { BOOST_ASSERT(ptr_); return *ptr_; } T& get() const { BOOST_ASSERT(ptr_); return *ptr_; }
T* get_ptr() const BOOST_NOEXCEPT { return ptr_; } T* get_ptr() const BOOST_NOEXCEPT { return ptr_; }
T* operator->() const { BOOST_ASSERT(ptr_); return ptr_; } T* operator->() const { BOOST_ASSERT(ptr_); return ptr_; }
@ -133,25 +133,30 @@ public:
#else // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES #else // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
template <class U> template <class U>
optional(const U& v) BOOST_NOEXCEPT : ptr_(boost::addressof(v)) { } optional(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT : ptr_(boost::addressof(v)) { }
template <class U> template <class U>
optional(bool cond, const U& v) BOOST_NOEXCEPT : ptr_(cond ? boost::addressof(v) : 0) {} optional(bool cond, U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT : ptr_(cond ? boost::addressof(v) : 0) {}
template <class U> template <class U>
optional operator=(const U& v) BOOST_NOEXCEPT { ptr_ = boost::addressof(v); return *this; } BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U>, optional<T&>&>::type
operator=(U& v) BOOST_NOEXCEPT { ptr_ = boost::addressof(v); return *this; }
template <class U> template <class U>
void emplace(const U& v) BOOST_NOEXCEPT { ptr_ = boost::addressof(v); } void emplace(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT
{ ptr_ = boost::addressof(v); }
template <class U> template <class U>
T& get_value_or(const U& v) const BOOST_NOEXCEPT { return ptr_ ? *ptr_ : v; } T& get_value_or(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) const BOOST_NOEXCEPT
{ return ptr_ ? *ptr_ : v; }
template <class U> template <class U>
T& value_or(const U& v) const BOOST_NOEXCEPT { return ptr_ ? *ptr_ : v; } T& value_or(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) const BOOST_NOEXCEPT
{ return ptr_ ? *ptr_ : v; }
template <class U> template <class U>
void reset(const U& v) BOOST_NOEXCEPT { ptr_ = boost::addressof(v); } void reset(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT
{ ptr_ = boost::addressof(v); }
#endif // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES #endif // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
}; };

View File

@ -24,7 +24,7 @@
using boost::optional; using boost::optional;
using boost::none; using boost::none;
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES) #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES)
class Guard class Guard
{ {
@ -90,7 +90,7 @@ void test_emplace()
#endif #endif
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
struct ThrowOnMove struct ThrowOnMove
@ -120,7 +120,7 @@ struct Thrower
private: private:
Thrower(Thrower const&); Thrower(Thrower const&);
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
Thrower(Thrower&&); Thrower(Thrower&&);
#endif #endif
}; };
@ -192,10 +192,10 @@ void test_emplace()
int main() int main()
{ {
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES) #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES)
test_emplace(); test_emplace();
#endif #endif
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) #if (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
test_no_moves_on_emplacement(); test_no_moves_on_emplacement();
#endif #endif
test_clear_on_throw(); test_clear_on_throw();

View File

@ -24,7 +24,7 @@ using boost::none;
//#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT //#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
//#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR //#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
enum State enum State
{ {
@ -334,7 +334,7 @@ void test_optional_ref_to_movables()
int main() int main()
{ {
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
test_move_ctor_from_U(); test_move_ctor_from_U();
test_move_ctor_form_T(); test_move_ctor_form_T();
test_move_ctor_from_optional_T(); test_move_ctor_from_optional_T();

View File

@ -20,7 +20,7 @@
using boost::optional; using boost::optional;
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
#ifndef BOOST_NO_CXX11_NOEXCEPT #ifndef BOOST_NO_CXX11_NOEXCEPT
// these 4 classes have different noexcept signatures in move operations // these 4 classes have different noexcept signatures in move operations
@ -106,7 +106,7 @@ void test_noexcept_optional_with_operator() // compile-time test
} }
#endif // !defned BOOST_NO_CXX11_NOEXCEPT #endif // !defned BOOST_NO_CXX11_NOEXCEPT
#endif // !defined BOOST_NO_CXX11_RVALUE_REFERENCES #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
int main() int main()
{ {

View File

@ -175,7 +175,7 @@ void test_const_move()
} }
#ifndef BOOST_NO_CXX11_REF_QUALIFIERS #if (!defined BOOST_NO_CXX11_REF_QUALIFIERS) && (!defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES)
struct MoveOnly struct MoveOnly
{ {
explicit MoveOnly(int){} explicit MoveOnly(int){}