diff --git a/test/optional_test_inplace_fail.cpp b/test/optional_test_inplace_fail.cpp index c6ba1d6..bb7c26f 100644 --- a/test/optional_test_inplace_fail.cpp +++ b/test/optional_test_inplace_fail.cpp @@ -1,4 +1,5 @@ // Copyright (C) 2003, Fernando Luis Cacciola Carballal. +// Copyright (C) 2015 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 @@ -8,53 +9,45 @@ // // You are welcome to contact the author at: // fernando_cacciola@hotmail.com -// -#include -#include + #include - -#define BOOST_ENABLE_ASSERT_HANDLER - #include "boost/optional/optional.hpp" -#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT -#include "boost/utility/in_place_factory.hpp" -#endif - #ifdef __BORLANDC__ #pragma hdrstop #endif -#include "boost/test/minimal.hpp" - -#include "optional_test_common.cpp" - #ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT -struct A -{ - A ( double a0, std::string a1 ) : m_a0(a0), m_a1(a1) {} - - friend bool operator == ( A const& x, A const& y ) - { return x.m_a0 == y.m_a0 && x.m_a1 == y.m_a1 ; } - - double m_a0 ; - std::string m_a1 ; -} ; - -int test_main( int, char* [] ) -{ - int invalid_extra_parameter ; - boost::optional opt2 ( boost::in_place(3.14,"pi",invalid_extra_parameter) ) ; - - return 0; -} -#else -int test_main( int, char* [] ) -{ - int invalid_extra_parameter ; - boost::optional opt2 ( A(3.14,"pi",invalid_extra_parameter) ) ; - - return 0; -} +#include "boost/utility/in_place_factory.hpp" +#include "boost/utility/typed_in_place_factory.hpp" #endif +#include "boost/core/lightweight_test.hpp" +#include "boost/none.hpp" + +struct Guard +{ + double num; + std::string str; + Guard() : num() {} + Guard(double num_, std::string str_) : num(num_), str(str_) {} + + friend bool operator==(const Guard& lhs, const Guard& rhs) { return lhs.num == rhs.num && lhs.str == rhs.str; } + friend bool operator!=(const Guard& lhs, const Guard& rhs) { return !(lhs == rhs); } + +private: + Guard(const Guard&); + Guard& operator=(const Guard&); +}; + + +int main() +{ +#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT + int excessive_param = 2; + boost::optional og1 ( boost::in_place(1.0, "one", excessive_param) ); +#else + NOTHING_TO_TEST_SO_JUST_FAIL +#endif + return 0; +} \ No newline at end of file diff --git a/test/optional_test_inplace_fail2.cpp b/test/optional_test_inplace_fail2.cpp index f82d857..e6a0004 100644 --- a/test/optional_test_inplace_fail2.cpp +++ b/test/optional_test_inplace_fail2.cpp @@ -1,4 +1,5 @@ // Copyright (C) 2003, Fernando Luis Cacciola Carballal. +// Copyright (C) 2015 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 @@ -8,55 +9,45 @@ // // You are welcome to contact the author at: // fernando_cacciola@hotmail.com -// -#include -#include + #include - -#define BOOST_ENABLE_ASSERT_HANDLER - #include "boost/optional/optional.hpp" -#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT -#include "boost/utility/typed_in_place_factory.hpp" -#endif - #ifdef __BORLANDC__ #pragma hdrstop #endif -#include "boost/test/minimal.hpp" - -#include "optional_test_common.cpp" - #ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT -struct A -{ - A ( double a0, std::string a1 ) : m_a0(a0), m_a1(a1) {} - - friend bool operator == ( A const& x, A const& y ) - { return x.m_a0 == y.m_a0 && x.m_a1 == y.m_a1 ; } - - double m_a0 ; - std::string m_a1 ; -} ; - -int test_main( int, char* [] ) -{ - // This must fail to compile. - // The first template argument to in_place<> is the target-type, - // not the first constructor parameter type. - boost::optional opt2 ( boost::in_place(3.14,"pi") ) ; - - return 0; -} -#else -int test_main( int, char* [] ) -{ - boost::optional opt2 ( int(3.14) ) ; - - return 0; -} +#include "boost/utility/in_place_factory.hpp" +#include "boost/utility/typed_in_place_factory.hpp" #endif +#include "boost/core/lightweight_test.hpp" +#include "boost/none.hpp" +struct Guard +{ + double num; + std::string str; + Guard() : num() {} + Guard(double num_, std::string str_) : num(num_), str(str_) {} + + friend bool operator==(const Guard& lhs, const Guard& rhs) { return lhs.num == rhs.num && lhs.str == rhs.str; } + friend bool operator!=(const Guard& lhs, const Guard& rhs) { return !(lhs == rhs); } + +private: + Guard(const Guard&); + Guard& operator=(const Guard&); +}; + + +int main() +{ +#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT + typedef int BAD_TARGET_TYPE; + boost::optional og1 ( boost::in_place(1.0, "one") ); +#else + NOTHING_TO_TEST_SO_JUST_FAIL +#endif + return 0; +} \ No newline at end of file diff --git a/test/optional_test_tie.cpp b/test/optional_test_tie.cpp index f77e74b..0b49bfa 100644 --- a/test/optional_test_tie.cpp +++ b/test/optional_test_tie.cpp @@ -46,9 +46,22 @@ int counting_oracle::copy_ctor_count = 0; int counting_oracle::copy_assign_count = 0; int counting_oracle::equals_count = 0; +int count_copy_ctors_on_copy() // checks if we have copy elision +{ + counting_oracle::copy_ctor_count = 0; + + counting_oracle c(1); + counting_oracle c2(c); + int ans = counting_oracle::copy_ctor_count; + counting_oracle::copy_ctor_count = 0; + counting_oracle::val_ctor_count = 0; + return ans; +} + // Test boost::tie() interoperability. int main() { + int copy_factor = count_copy_ctors_on_copy(); const std::pair pair(1, 2); boost::optional o1, o2; boost::tie(o1, o2) = pair; @@ -57,7 +70,7 @@ int main() BOOST_TEST(o2); BOOST_TEST(*o1 == counting_oracle(1)); BOOST_TEST(*o2 == counting_oracle(2)); - BOOST_TEST_EQ(2, counting_oracle::copy_ctor_count); + BOOST_TEST_EQ(2 * copy_factor, counting_oracle::copy_ctor_count); BOOST_TEST_EQ(0, counting_oracle::copy_assign_count); BOOST_TEST_EQ(0, counting_oracle::default_ctor_count);