// Copyright David Abrahams and Aleksey Gurtovoy // 2002-2004. Distributed under 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) // compile-time test for "boost/ref.hpp" header content // see 'ref_test.cpp' for run-time part #include #include #include #include namespace { template< typename T, typename U > void ref_test(boost::reference_wrapper) { typedef typename boost::reference_wrapper::type type; BOOST_STATIC_ASSERT((boost::core::is_same::value)); BOOST_STATIC_ASSERT((boost::core::is_same::value)); } template< typename T > void assignable_test(T x) { x = x; } template< bool R, typename T > void is_reference_wrapper_test(T) { BOOST_STATIC_ASSERT(boost::is_reference_wrapper::value == R); } template< typename R, typename Ref > void cxx_reference_test(Ref) { BOOST_STATIC_ASSERT((boost::core::is_same::value)); } template< typename R, typename Ref > void unwrap_reference_test(Ref) { typedef typename boost::unwrap_reference::type type; BOOST_STATIC_ASSERT((boost::core::is_same::value)); } } // namespace int main() { int i = 0; int& ri = i; int const ci = 0; int const& rci = ci; // 'ref/cref' functions test ref_test(boost::ref(i)); ref_test(boost::ref(ri)); ref_test(boost::ref(ci)); ref_test(boost::ref(rci)); ref_test(boost::cref(i)); ref_test(boost::cref(ri)); ref_test(boost::cref(ci)); ref_test(boost::cref(rci)); // test 'assignable' requirement assignable_test(boost::ref(i)); assignable_test(boost::ref(ri)); assignable_test(boost::cref(i)); assignable_test(boost::cref(ci)); assignable_test(boost::cref(rci)); // 'is_reference_wrapper' test is_reference_wrapper_test(boost::ref(i)); is_reference_wrapper_test(boost::ref(ri)); is_reference_wrapper_test(boost::cref(i)); is_reference_wrapper_test(boost::cref(ci)); is_reference_wrapper_test(boost::cref(rci)); is_reference_wrapper_test(i); is_reference_wrapper_test(ri); is_reference_wrapper_test(ci); is_reference_wrapper_test(rci); // ordinary references/function template arguments deduction test cxx_reference_test(i); cxx_reference_test(ri); cxx_reference_test(ci); cxx_reference_test(rci); cxx_reference_test(i); cxx_reference_test(ri); cxx_reference_test(i); cxx_reference_test(ri); cxx_reference_test(ci); cxx_reference_test(rci); // 'unwrap_reference' test unwrap_reference_test(boost::ref(i)); unwrap_reference_test(boost::ref(ri)); unwrap_reference_test(boost::cref(i)); unwrap_reference_test(boost::cref(ci)); unwrap_reference_test(boost::cref(rci)); unwrap_reference_test(i); unwrap_reference_test(ri); unwrap_reference_test(ci); unwrap_reference_test(rci); unwrap_reference_test(i); unwrap_reference_test(ri); unwrap_reference_test(i); unwrap_reference_test(ri); unwrap_reference_test(ci); unwrap_reference_test(rci); return 0; }