optional_test_ref.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 374 行
CPP
374 行
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.//// 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:// fernando_cacciola@hotmail.com//#include<iostream>#include<stdexcept>#include<string>#define BOOST_ENABLE_ASSERT_HANDLER#include "boost/optional.hpp"#ifdef __BORLANDC__#pragma hdrstop#endif#include "boost/none.hpp"#include "boost/test/minimal.hpp"#include "optional_test_common.cpp"template<class T>inline void check_ref_uninitialized_const ( optional<T&> const& opt ){#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE BOOST_CHECK( opt == 0 ) ;#endif BOOST_CHECK( !opt ) ;}template<class T>inline void check_ref_uninitialized ( optional<T&>& opt ){#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE BOOST_CHECK( opt == 0 ) ;#endif BOOST_CHECK( !opt ) ; check_ref_uninitialized_const(opt);}template<class T>inline void check_ref_initialized_const ( optional<T&> const& opt ){ BOOST_CHECK( opt ) ;#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE BOOST_CHECK( opt != 0 ) ;#endif BOOST_CHECK ( !!opt ) ;}template<class T>inline void check_ref_initialized ( optional<T&>& opt ){ BOOST_CHECK( opt ) ;#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE BOOST_CHECK( opt != 0 ) ;#endif BOOST_CHECK ( !!opt ) ; check_ref_initialized_const(opt);}template<class T>inline void check_ref_value_const ( optional<T&> const& opt, T const& v, T const& z ){ BOOST_CHECK( *opt == v ) ; BOOST_CHECK( *opt != z ) ; BOOST_CHECK( opt.get() == v ) ; BOOST_CHECK( opt.get() != z ) ;}template<class T>inline void check_ref_value ( optional<T&>& opt, T const& v, T const& z ){ BOOST_CHECK( *opt == v ) ; BOOST_CHECK( *opt != z ) ; BOOST_CHECK( opt.get() == v ) ; BOOST_CHECK( opt.get() != z ) ; check_ref_value_const(opt,v,z);}//// Basic test.// Check ordinary functionality:// Initialization, assignment, comparison and value-accessing.//template<class T>void test_basics( T const* ){ TRACE( std::endl << BOOST_CURRENT_FUNCTION ); T z(0); T original_a(1); T a(1); T b(2); T c(10); T& aref = a ; T& bref = b ; // Default construction. // 'def' state is Uninitialized. // T::T() is not called optional<T&> def ; check_ref_uninitialized(def); // Direct initialization. // 'oa' state is Initialized and binds to 'a' // T::T( T const& x ) is NOT used becasue the optional holds a reference. set_pending_copy( ARG(T) ) ; optional<T&> oa ( aref ) ; check_is_pending_copy( ARG(T) ); check_ref_initialized(oa); check_ref_value(oa,a,z); *oa = b ; // changes the value of 'a' through the reference BOOST_CHECK( a == b ) ; // Copy initialization. // T::T ( T const& x ) is NOT used becasue the optional holds a reference. set_pending_copy( ARG(T) ) ; optional<T&> const oa2 ( oa ) ; check_is_pending_copy( ARG(T) ) ; check_ref_initialized_const(oa2); check_ref_value_const(oa2,a,z); *oa2 = original_a ; // restores the value of 'a' through the reference BOOST_CHECK( a == original_a ) ; optional<T&> ob ; // Value-Assignment upon Uninitialized optional. // T::T ( T const& x ) is NOT used becasue the optional holds a reference. set_pending_copy( ARG(T) ) ; ob = a ; // Binds ob to a temporary non-const refererence to 'a' check_is_pending_copy( ARG(T) ) ; check_ref_initialized(ob); check_ref_value(ob,a,z); a = c; check_ref_value(ob,a,z); // Value-Assignment upon Initialized optional. // T::operator= ( T const& x ) is used. set_pending_assign( ARG(T) ) ; ob = b ; // Rebinds 'ob' to 'b' (without changing 'a') check_is_pending_assign( ARG(T) ) ; check_ref_initialized(ob); check_ref_value(ob,b,z); BOOST_CHECK(a == c); // From a=c in previous test b = c; check_ref_value(ob,b,z); // Assignment initialization. // T::T ( T const& x ) is NOT used becasue the optional holds a reference. set_pending_copy( ARG(T) ) ; optional<T&> const oa3 = b ; check_is_pending_copy( ARG(T) ) ; check_ref_initialized_const(oa3); check_ref_value_const(oa3,b,z); // Assignment // T::operator=( T const& x ) is used. set_pending_assign( ARG(T) ) ; oa = ob ; // Rebinds 'a' to 'b' check_is_pending_assign( ARG(T) ) ; check_ref_initialized(oa); a = original_a ; check_ref_value(oa,b,z); // Uninitializing Assignment upon Initialized Optional // T::~T() is NOT used becasue the optional holds a reference. set_pending_dtor( ARG(T) ) ; set_pending_copy( ARG(T) ) ; oa = def ; check_is_pending_dtor( ARG(T) ) ; check_is_pending_copy( ARG(T) ) ; check_ref_uninitialized(oa); // Uninitializing Assignment upon Uninitialized Optional // (Dtor is not called this time) set_pending_dtor( ARG(T) ) ; set_pending_copy( ARG(T) ) ; oa = def ; check_is_pending_dtor( ARG(T) ) ; check_is_pending_copy( ARG(T) ) ; check_ref_uninitialized(oa); // Deinitialization of Initialized Optional // T::~T() is NOT used becasue the optional holds a reference. set_pending_dtor( ARG(T) ) ; ob.reset(); check_is_pending_dtor( ARG(T) ) ; check_ref_uninitialized(ob); // Deinitialization of Uninitialized Optional // T::~T() is not called this time set_pending_dtor( ARG(T) ) ; ob.reset(); check_is_pending_dtor( ARG(T) ) ; check_ref_uninitialized(ob);}//// This verifies relational operators.//template<class T>void test_relops( T const* ){ TRACE( std::endl << BOOST_CURRENT_FUNCTION ); reset_throw_on_copy( ARG(T) ) ; T v0(18); T v1(19); T v2(19); optional<T&> def0 ; optional<T&> def1 ; optional<T&> opt0(v0); optional<T&> opt1(v1); optional<T&> opt2(v2); // Check identity BOOST_CHECK ( def0 == def0 ) ; BOOST_CHECK ( opt0 == opt0 ) ; BOOST_CHECK ( !(def0 != def0) ) ; BOOST_CHECK ( !(opt0 != opt0) ) ; // Check when both are uininitalized. BOOST_CHECK ( def0 == def1 ) ; // both uninitialized compare equal BOOST_CHECK ( !(def0 < def1) ) ; // uninitialized is never less than uninitialized BOOST_CHECK ( !(def0 > def1) ) ; // uninitialized is never greater than uninitialized BOOST_CHECK ( !(def0 != def1) ) ; BOOST_CHECK ( def0 <= def1 ) ; BOOST_CHECK ( def0 >= def1 ) ; // Check when only lhs is uninitialized. BOOST_CHECK ( def0 != opt0 ) ; // uninitialized is never equal to initialized BOOST_CHECK ( !(def0 == opt0) ) ; BOOST_CHECK ( def0 < opt0 ) ; // uninitialized is always less than initialized BOOST_CHECK ( !(def0 > opt0) ) ; BOOST_CHECK ( def0 <= opt0 ) ; BOOST_CHECK ( !(def0 >= opt0) ) ; // Check when only rhs is uninitialized. BOOST_CHECK ( opt0 != def0 ) ; // initialized is never equal to uninitialized BOOST_CHECK ( !(opt0 == def0) ) ; BOOST_CHECK ( !(opt0 < def0) ) ; // initialized is never less than uninitialized BOOST_CHECK ( opt0 > def0 ) ; BOOST_CHECK ( !(opt0 <= def0) ) ; BOOST_CHECK ( opt0 >= opt0 ) ; // If both are initialized, values are compared BOOST_CHECK ( opt0 != opt1 ) ; BOOST_CHECK ( opt1 == opt2 ) ; BOOST_CHECK ( opt0 < opt1 ) ; BOOST_CHECK ( opt1 > opt0 ) ; BOOST_CHECK ( opt1 <= opt2 ) ; BOOST_CHECK ( opt1 >= opt0 ) ;}template<class T>void test_none( T const* ){ TRACE( std::endl << BOOST_CURRENT_FUNCTION ); using boost::none ; T a(1234); optional<T&> def0 ; optional<T&> def1(none) ; optional<T&> non_def(a) ; BOOST_CHECK ( def0 == none ) ; BOOST_CHECK ( non_def != none ) ; BOOST_CHECK ( !def1 ) ; non_def = none ; BOOST_CHECK ( !non_def ) ;}template<class T>void test_arrow( T const* ){ TRACE( std::endl << BOOST_CURRENT_FUNCTION ); T a(1234); optional<T&> oa(a) ; optional<T&> const coa(a) ; BOOST_CHECK ( coa->V() == 1234 ) ; oa->V() = 4321 ; BOOST_CHECK ( a.V() = 4321 ) ;}void test_with_builtin_types(){ TRACE( std::endl << BOOST_CURRENT_FUNCTION ); test_basics( ARG(double) ); test_relops( ARG(double) ) ; test_none ( ARG(double) ) ;}void test_with_class_type(){ TRACE( std::endl << BOOST_CURRENT_FUNCTION ); test_basics( ARG(X) ); test_relops( ARG(X) ) ; test_none ( ARG(X) ) ; test_arrow ( ARG(X) ) ; BOOST_CHECK ( X::count == 0 ) ;}void test_binding(){ int i = 0 ; optional<int&> ori1 = i ; BOOST_CHECK( &(*ori1) == &i ) ; optional<int&> ori2(i) ; BOOST_CHECK( &(*ori2) == &i ) ; int const ci = 0 ; optional<int const&> orci1 = ci ; BOOST_CHECK( &(*orci1) == &ci ) ; optional<int const&> orci2(ci) ; BOOST_CHECK( &(*orci2) == &ci ) ;}int test_main( int, char* [] ){ try { test_with_class_type(); test_with_builtin_types(); test_binding(); } catch ( ... ) { BOOST_ERROR("Unexpected Exception caught!"); } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?