forked from boostorg/utility
		
	Compare commits
	
		
			60 Commits
		
	
	
		
			svn-branch
			...
			boost-1.40
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fb96202f6a | ||
|  | d5291d08b8 | ||
|  | 61755605af | ||
|  | cd12e322bd | ||
|  | 8cb975feb7 | ||
|  | ffe151458e | ||
|  | 4003a9f74a | ||
|  | 211eb04f33 | ||
|  | e57213b298 | ||
|  | 51f9adbfa1 | ||
|  | eaaf17a88f | ||
|  | 48cfd42123 | ||
|  | 76aa5d2f27 | ||
|  | ce67dde4f0 | ||
|  | a69e872a91 | ||
|  | e3640e45c2 | ||
|  | b7cd171b2b | ||
|  | b2e6a82adb | ||
|  | 390372294a | ||
|  | ffbbf38e12 | ||
|  | 9e73b2c6ae | ||
|  | 633832e872 | ||
|  | 862cb2a4e0 | ||
|  | b012f16ee5 | ||
|  | 3d96ab26d4 | ||
|  | 8652bf51ec | ||
|  | 9168cb9c61 | ||
|  | e1991374ae | ||
|  | d0ee9a7c28 | ||
|  | 10e83b490b | ||
|  | 4b24dba257 | ||
|  | 7a036f6f3a | ||
|  | e632b0fb1f | ||
|  | 17bee9d43f | ||
|  | 492a8ad213 | ||
|  | 8827b8ed8b | ||
|  | 8849fbc52d | ||
|  | 50bc75a802 | ||
|  | 9b52e49fda | ||
|  | ab479794f3 | ||
|  | 97b8966337 | ||
|  | 88099a882f | ||
|  | d5554eb6d7 | ||
|  | 13bdfb8bbd | ||
|  | 74462349c2 | ||
|  | 6aa648d315 | ||
|  | 9ff18c2c96 | ||
|  | d5ea07c737 | ||
|  | aa0096bf42 | ||
|  | 005c2f3cc8 | ||
|  | 09f7aab52d | ||
|  | 30a40f9f76 | ||
|  | d9f8bae673 | ||
|  | 3c7b409460 | ||
|  | ee3551e8dc | ||
|  | 95da2e90de | ||
|  | 6dd93ab916 | ||
|  | 505d419a1b | ||
|  | d968b5f5b9 | ||
|  | d809d4e832 | 
							
								
								
									
										37
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| # | ||||
| # Copyright Troy D. Straszheim | ||||
| # | ||||
| # Distributed under the Boost Software License, Version 1.0. | ||||
| # See http://www.boost.org/LICENSE_1_0.txt | ||||
| # | ||||
| #---------------------------------------------------------------------------- | ||||
| # This file was automatically generated from the original CMakeLists.txt file | ||||
| # Add a variable to hold the headers for the library | ||||
| set (lib_headers | ||||
|     assert.hpp | ||||
|     call_traits.hpp | ||||
|     checked_delete.hpp | ||||
|     compressed_pair.hpp | ||||
|     current_function.hpp | ||||
|     operators.hpp | ||||
|     throw_exception.hpp | ||||
|     utility.hpp | ||||
|     utility | ||||
| ) | ||||
|  | ||||
| # Add a library target to the build system | ||||
| boost_library_project( | ||||
|   utility | ||||
|   #  SRCDIRS  | ||||
|   TESTDIRS  test swap/test enable_if/test | ||||
|   HEADERS ${lib_headers} | ||||
|   #  DOCDIRS  | ||||
|   DESCRIPTION  "Various small utilities for C++ programming." | ||||
|   MODULARIZED  | ||||
|   AUTHORS  "David Abrahams <dave -at- boostpro.com>" | ||||
|            "Brad King" | ||||
|            "Douglas Gregor <doug.gregor -at- gmail.com>" | ||||
|   #  MAINTAINERS  | ||||
| ) | ||||
|  | ||||
|  | ||||
| @@ -281,7 +281,7 @@ object_id_compare::operator () | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return a.second->before( *b.second ) != 0; | ||||
|             return a.second->before( *b.second ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -11,10 +11,6 @@ | ||||
| #include <algorithm> | ||||
| #include <cstddef> | ||||
|  | ||||
| #ifdef BOOST_MSVC | ||||
| #pragma warning(disable:4996) // warning C4996: 'std::equal': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' | ||||
| #endif | ||||
|  | ||||
| /* | ||||
| Note: This file tests every single valid bit-grouping on its own, and some | ||||
|       random combinations of bit-groupings. | ||||
|   | ||||
| @@ -21,10 +21,6 @@ | ||||
| #include <libs/type_traits/test/test.hpp> | ||||
| #include <libs/type_traits/test/check_type.hpp> | ||||
|  | ||||
| #ifdef BOOST_MSVC | ||||
| #pragma warning(disable:4181) // : warning C4181: qualifier applied to reference type; ignored | ||||
| #endif | ||||
|  | ||||
| // a way prevent warnings for unused variables | ||||
| template<class T> inline void unused_variable(const T&) {} | ||||
|  | ||||
| @@ -56,8 +52,7 @@ struct contained | ||||
|    const_reference const_get()const { return v_; } | ||||
|    // pass value: | ||||
|    void call(param_type){} | ||||
| private: | ||||
|    contained& operator=(const contained&); | ||||
|  | ||||
| }; | ||||
|  | ||||
| #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | ||||
| @@ -82,8 +77,6 @@ struct contained<T[N]> | ||||
|    reference get() { return v_; } | ||||
|    const_reference const_get()const { return v_; } | ||||
|    void call(param_type){} | ||||
| private: | ||||
|    contained& operator=(const contained&); | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| @@ -204,7 +197,7 @@ struct comparible_UDT | ||||
|    bool operator == (const comparible_UDT& v){ return v.i_ == i_; } | ||||
| }; | ||||
|  | ||||
| int main() | ||||
| int main(int argc, char *argv[ ]) | ||||
| { | ||||
|    call_traits_checker<comparible_UDT> c1; | ||||
|    comparible_UDT u; | ||||
|   | ||||
							
								
								
									
										20
									
								
								enable_if/test/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								enable_if/test/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| # | ||||
| # Copyright Troy D. Straszheim | ||||
| # | ||||
| # Distributed under the Boost Software License, Version 1.0. | ||||
| # See http://www.boost.org/LICENSE_1_0.txt | ||||
| # | ||||
| foreach(T | ||||
|     constructors | ||||
|     dummy_arg_disambiguation | ||||
|     lazy | ||||
|     lazy_test | ||||
|     member_templates | ||||
|     namespace_disambiguation | ||||
|     no_disambiguation | ||||
|     partial_specializations | ||||
|     ) | ||||
|   boost_test_run(${T} DEPENDS boost_test_exec_monitor) | ||||
| endforeach() | ||||
|  | ||||
|  | ||||
| @@ -6,6 +6,8 @@ | ||||
| #ifndef UUID_1D94A7C6054E11DB9804B622A1EF5492 | ||||
| #define UUID_1D94A7C6054E11DB9804B622A1EF5492 | ||||
|  | ||||
| #error The header <boost/exception.hpp> has been deprecated. Please #include <boost/exception/all.hpp> instead. | ||||
| //The header <boost/exception.hpp> has been deprecated. | ||||
| //Please #include <boost/exception/all.hpp> instead. | ||||
| #include <boost/exception/all.hpp> | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -10,47 +10,6 @@ | ||||
| # error Boost result_of - do not include this file! | ||||
| #endif | ||||
|  | ||||
| #if defined(BOOST_HAS_DECLTYPE) | ||||
|  | ||||
| // As of N2588, C++0x result_of only supports function call | ||||
| // expressions of the form f(x). This precludes support for member | ||||
| // function pointers, which are invoked with expressions of the form | ||||
| // o->*f(x). This implementation supports both. | ||||
| template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) | ||||
|          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)> | ||||
| struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))> | ||||
|     : mpl::if_< | ||||
|           mpl::or_< is_pointer<F>, is_member_function_pointer<F> > | ||||
|         , detail::result_of_impl< | ||||
|             typename remove_cv<F>::type,  | ||||
|             typename remove_cv<F>::type(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false | ||||
|           > | ||||
|         , detail::result_of_decltype_impl< | ||||
|               F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)) | ||||
|           > | ||||
|       >::type | ||||
| {}; | ||||
|  | ||||
| namespace detail { | ||||
|  | ||||
| # define BOOST_RESULT_OF_STATIC_MEMBERS(z, n, _) \ | ||||
|      static T ## n t ## n; \ | ||||
|   /**/ | ||||
|  | ||||
| template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) | ||||
|          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)> | ||||
| class result_of_decltype_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))> | ||||
| { | ||||
|   static F f; | ||||
|   BOOST_PP_REPEAT(BOOST_PP_ITERATION(), BOOST_RESULT_OF_STATIC_MEMBERS, _) | ||||
| public: | ||||
|   typedef decltype(f(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),t))) type; | ||||
| }; | ||||
|  | ||||
| } // namespace detail  | ||||
|  | ||||
| #else // defined(BOOST_HAS_DECLTYPE) | ||||
|  | ||||
| // CWPro8 requires an argument in a function type specialization | ||||
| #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0 | ||||
| # define BOOST_RESULT_OF_ARGS void | ||||
| @@ -62,22 +21,11 @@ public: | ||||
| template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) | ||||
|          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)> | ||||
| struct result_of<F(BOOST_RESULT_OF_ARGS)> | ||||
|     : mpl::if_< | ||||
|           mpl::or_< is_pointer<F>, is_member_function_pointer<F> > | ||||
|         , boost::detail::result_of_impl< | ||||
|             typename remove_cv<F>::type,  | ||||
|             typename remove_cv<F>::type(BOOST_RESULT_OF_ARGS),  | ||||
|             (boost::detail::has_result_type<F>::value)> | ||||
|         , boost::detail::result_of_impl< | ||||
|             F, | ||||
|             F(BOOST_RESULT_OF_ARGS),  | ||||
|             (boost::detail::has_result_type<F>::value)> >::type { }; | ||||
|     : boost::detail::result_of_impl<F, F(BOOST_RESULT_OF_ARGS), (boost::detail::has_result_type<F>::value)> {}; | ||||
| #endif | ||||
|  | ||||
| #undef BOOST_RESULT_OF_ARGS | ||||
|  | ||||
| #endif // defined(BOOST_HAS_DECLTYPE) | ||||
|  | ||||
| #if BOOST_PP_ITERATION() >= 1  | ||||
|  | ||||
| namespace detail { | ||||
|   | ||||
| @@ -10,18 +10,13 @@ | ||||
| #define BOOST_RESULT_OF_HPP | ||||
|  | ||||
| #include <boost/config.hpp> | ||||
| #include <boost/preprocessor/iteration/iterate.hpp>  | ||||
| #include <boost/preprocessor/punctuation/comma_if.hpp>  | ||||
| #include <boost/preprocessor/repetition/enum_params.hpp>  | ||||
| #include <boost/preprocessor/repetition/enum_shifted_params.hpp>  | ||||
| #include <boost/type_traits/ice.hpp> | ||||
| #include <boost/type.hpp> | ||||
| #include <boost/preprocessor.hpp> | ||||
| #include <boost/detail/workaround.hpp> | ||||
| #include <boost/mpl/has_xxx.hpp> | ||||
| #include <boost/mpl/if.hpp> | ||||
| #include <boost/mpl/bool.hpp> | ||||
| #include <boost/mpl/or.hpp> | ||||
| #include <boost/type_traits/is_pointer.hpp> | ||||
| #include <boost/type_traits/is_member_function_pointer.hpp> | ||||
| #include <boost/type_traits/remove_cv.hpp> | ||||
|  | ||||
| #ifndef BOOST_RESULT_OF_NUM_ARGS | ||||
| #  define BOOST_RESULT_OF_NUM_ARGS 10 | ||||
| @@ -37,7 +32,6 @@ namespace detail { | ||||
| BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type) | ||||
|  | ||||
| template<typename F, typename FArgs, bool HasResultType> struct result_of_impl; | ||||
| template<typename F> struct result_of_decltype_impl; | ||||
|  | ||||
| template<typename F> | ||||
| struct result_of_void_impl | ||||
| @@ -57,11 +51,6 @@ struct result_of_void_impl<R (&)(void)> | ||||
|   typedef R type; | ||||
| }; | ||||
|  | ||||
| // Determine the return type of a function pointer or pointer to member. | ||||
| template<typename F, typename FArgs> | ||||
| struct result_of_pointer | ||||
|   : result_of_impl<typename remove_cv<F>::type, FArgs, false> { }; | ||||
|  | ||||
| template<typename F, typename FArgs> | ||||
| struct result_of_impl<F, FArgs, true> | ||||
| { | ||||
|   | ||||
| @@ -8,7 +8,6 @@ | ||||
| // 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker | ||||
| // 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola | ||||
| // 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola | ||||
| // 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola | ||||
| // | ||||
| #ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP | ||||
| #define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP | ||||
| @@ -91,12 +90,7 @@ class value_initialized | ||||
|       wrapper_address()->wrapper::~wrapper(); | ||||
|     } | ||||
|  | ||||
|     T const & data() const | ||||
|     { | ||||
|       return wrapper_address()->data; | ||||
|     } | ||||
|  | ||||
|     T& data() | ||||
|     T& data() const | ||||
|     { | ||||
|       return wrapper_address()->data; | ||||
|     } | ||||
| @@ -106,9 +100,7 @@ class value_initialized | ||||
|       ::boost::swap( this->data(), arg.data() ); | ||||
|     } | ||||
|  | ||||
|     operator T const &() const { return this->data(); } | ||||
|  | ||||
|     operator T&() { return this->data(); } | ||||
|     operator T&() const { return this->data(); } | ||||
|  | ||||
| } ; | ||||
|  | ||||
|   | ||||
| @@ -24,7 +24,6 @@ | ||||
|             <a href="iterator_adaptors.htm">iterator_adaptors</a><br> | ||||
|             <a href="generator_iterator.htm">generator iterator adaptors</a><br> | ||||
| 				<a href="operators.htm">operators</a><br> | ||||
| 				<a href="swap.html">swap</a><br> | ||||
| 				<a href="throw_exception.html">throw_exception</a><br> | ||||
| 				<a href="utility.htm">utility</a><br> | ||||
|                 <a href="value_init.htm">value_init</a></p> | ||||
|   | ||||
							
								
								
									
										1
									
								
								module.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								module.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| boost_module(utility DEPENDS iterator exception detail ) | ||||
							
								
								
									
										43
									
								
								ref_test.cpp
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								ref_test.cpp
									
									
									
									
									
								
							| @@ -68,54 +68,11 @@ struct ref_wrapper | ||||
|     } | ||||
| }; | ||||
|  | ||||
| struct copy_counter { | ||||
|   static int count_; | ||||
|   copy_counter(copy_counter const& /*other*/) { | ||||
|     ++count_; | ||||
|   } | ||||
|   copy_counter() {} | ||||
|   static void reset() { count_ = 0; } | ||||
|   static int count() { return copy_counter::count_;  } | ||||
| }; | ||||
|  | ||||
| int copy_counter::count_ = 0; | ||||
|  | ||||
| } // namespace unnamed | ||||
|  | ||||
| template <class T> | ||||
| void do_unwrap(T t) { | ||||
|  | ||||
|   /* typename unwrap_reference<T>::type& lt = */ | ||||
|   unwrap_ref(t); | ||||
|  | ||||
| } | ||||
|  | ||||
| void unwrap_test() { | ||||
|  | ||||
|   int i = 3; | ||||
|   const int ci = 2; | ||||
|  | ||||
|   do_unwrap(i); | ||||
|   do_unwrap(ci); | ||||
|   do_unwrap(ref(i)); | ||||
|   do_unwrap(cref(ci)); | ||||
|   do_unwrap(ref(ci)); | ||||
|  | ||||
|   copy_counter cc; | ||||
|   BOOST_CHECK(cc.count() == 0); | ||||
|  | ||||
|   do_unwrap(cc); | ||||
|   do_unwrap(ref(cc)); | ||||
|   do_unwrap(cref(cc)); | ||||
|  | ||||
|   BOOST_CHECK(cc.count() == 1); | ||||
|   BOOST_CHECK(unwrap_ref(ref(cc)).count() == 1);  | ||||
| } | ||||
|  | ||||
| int test_main(int, char * []) | ||||
| { | ||||
|     ref_wrapper<int>::test(1); | ||||
|     ref_wrapper<int const>::test(1); | ||||
|     unwrap_test(); | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -7,11 +7,7 @@ | ||||
|    </head> | ||||
|   <body> | ||||
|     <!-- Page header --> | ||||
|     <h2> | ||||
|     <img src="../../boost.png" alt="C++ Boost" align="middle" width="277" height="86"/> | ||||
|       Header <<a href="../../boost/swap.hpp">boost/swap.hpp</a>> | ||||
|     </h2> | ||||
|  | ||||
|     <h1>Swap</h1> | ||||
|      | ||||
|     <p> | ||||
| @@ -88,9 +84,9 @@ | ||||
|  | ||||
|     <!-- Copyright info -->     | ||||
|     <hr/> | ||||
|     <p>Revised: 08 September 2009</p> | ||||
|     <p>Revised: 15 November 2008</p> | ||||
|     <p> | ||||
|       Copyright 2007 - 2009 Joseph Gauterin. Use, modification, and distribution are subject to the Boost Software License, Version 1.0. | ||||
|       Copyright 2007, 2008 Joseph Gauterin. Use, modification, and distribution are subject to the Boost Software License, Version 1.0. | ||||
|       (See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or a copy at <<a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>>.) | ||||
|     </p> | ||||
|      | ||||
|   | ||||
							
								
								
									
										41
									
								
								swap/test/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								swap/test/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| # | ||||
| # Copyright Troy D. Straszheim | ||||
| # | ||||
| # Distributed under the Boost Software License, Version 1.0. | ||||
| # See http://www.boost.org/LICENSE_1_0.txt | ||||
| # | ||||
|  | ||||
| foreach(T  | ||||
|     root_header_1 root_header_2  | ||||
|     lib_header_1 lib_header_2  | ||||
|     mixed_headers_1 mixed_headers_2) | ||||
|   boost_test_compile(${T}) | ||||
| endforeach()  | ||||
|  | ||||
|  | ||||
| #     [ run primitive.cpp ../../../test/build//boost_test_exec_monitor/<link>static                      ] | ||||
|  | ||||
|  | ||||
| foreach(T | ||||
|     primitive | ||||
|     specialized_in_boost | ||||
|     specialized_in_global | ||||
|     specialized_in_other | ||||
|     specialized_in_std | ||||
|     specialized_in_boost_and_other | ||||
|     std_bitset | ||||
|     std_dateorder | ||||
|     std_string | ||||
|     std_typeinfo_ptr | ||||
|     std_vector_of_boost | ||||
|     std_vector_of_global | ||||
|     std_vector_of_other | ||||
|     no_ambiguity_in_boost | ||||
|     array_of_array_of_class | ||||
|     array_of_array_of_int | ||||
|     array_of_class | ||||
|     array_of_int | ||||
|     array_of_template) | ||||
|   boost_test_run(${T} DEPENDS boost_test_exec_monitor) | ||||
| endforeach() | ||||
|      | ||||
							
								
								
									
										47
									
								
								test/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								test/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| # | ||||
| # Copyright Troy D. Straszheim | ||||
| # | ||||
| # Distributed under the Boost Software License, Version 1.0. | ||||
| # See http://www.boost.org/LICENSE_1_0.txt | ||||
| # | ||||
| boost_additional_test_dependencies(utility BOOST_DEPENDS test) | ||||
|  | ||||
| boost_test_run(addressof_fn_test ../addressof_fn_test.cpp) | ||||
| boost_test_run(addressof_test ../addressof_test.cpp) | ||||
| boost_test_run(addressof_test2 ../addressof_test2.cpp) | ||||
| boost_test_run(assert_test ../assert_test.cpp) | ||||
| boost_test_run(base_from_member_test ../base_from_member_test.cpp) | ||||
| boost_test_run(binary_search_test ../binary_search_test.cpp) | ||||
| boost_test_run(call_traits_test ../call_traits_test.cpp ARGS -u) | ||||
| boost_test_compile_fail(checked_delete_test ../checked_delete_test.cpp) | ||||
| boost_test_run(compressed_pair_test  | ||||
|   ../compressed_pair_test  | ||||
|   DEPENDS boost_test_exec_monitor) | ||||
| boost_test_run(current_function_test ../current_function_test.cpp) | ||||
| boost_test_run(iterators_test  | ||||
|   ../iterators_test.cpp  | ||||
|   DEPENDS boost_test_exec_monitor) | ||||
| boost_test_run(next_prior_test DEPENDS boost_test_exec_monitor) | ||||
| boost_test_compile_fail(noncopyable_test ../noncopyable_test.cpp) | ||||
| boost_test_run(numeric_traits_test ../numeric_traits_test.cpp) | ||||
| if (${CMAKE_SYSTEM} MATCHES "FreeBSD-.*") | ||||
| boost_test_compile_fail("operators_test_compilerbug") | ||||
| elseif(${CMAKE_SYSTEM} MATCHES "FreeBSD-.*") | ||||
| boost_test_run(operators_test  | ||||
|   ../operators_test.cpp | ||||
|   DEPENDS boost_test_exec_monitor) | ||||
| endif(${CMAKE_SYSTEM} MATCHES "FreeBSD-.*") | ||||
| boost_test_compile(ref_ct_test ../ref_ct_test.cpp) | ||||
| boost_test_run(ref_test  | ||||
|   ../ref_test.cpp | ||||
|   DEPENDS boost_test_exec_monitor) | ||||
| boost_test_compile(result_of_test) | ||||
| boost_test_run(shared_iterator_test ../shared_iterator_test.cpp) | ||||
| boost_test_run(value_init_test ../value_init_test.cpp) | ||||
| boost_test_compile_fail(value_init_test_fail1  | ||||
|   ../value_init_test_fail1.cpp) | ||||
| boost_test_compile_fail(value_init_test_fail2 | ||||
|   ../value_init_test_fail2.cpp) | ||||
| boost_test_compile_fail(value_init_test_fail3 | ||||
|   ../value_init_test_fail3.cpp) | ||||
| boost_test_run(verify_test ../verify_test.cpp) | ||||
| @@ -11,101 +11,35 @@ | ||||
| #include <boost/static_assert.hpp> | ||||
| #include <boost/type_traits/is_same.hpp> | ||||
|  | ||||
| struct int_result_type | ||||
| { | ||||
|   typedef int result_type; | ||||
|   result_type operator()(float); | ||||
| }; | ||||
| struct int_result_type { typedef int result_type; }; | ||||
|  | ||||
| struct int_result_of | ||||
| { | ||||
|   template<typename F> struct result { typedef int type; }; | ||||
|   result<int_result_of(double)>::type operator()(double); | ||||
|   result<const int_result_of(double)>::type operator()(double) const; | ||||
|   result<int_result_of()>::type operator()(); | ||||
|   result<volatile int_result_of()>::type operator()() volatile; | ||||
| }; | ||||
|  | ||||
| struct int_result_type_and_float_result_of_and_char_return | ||||
| struct int_result_type_and_float_result_of | ||||
| { | ||||
|   typedef int result_type; | ||||
|   template<typename F> struct result { typedef float type; }; | ||||
|   char operator()(char); | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| struct int_result_type_template | ||||
| { | ||||
|   typedef int result_type; | ||||
|   result_type operator()(float); | ||||
| }; | ||||
| struct int_result_type_template { typedef int result_type; }; | ||||
|  | ||||
| template<typename T> | ||||
| struct int_result_of_template | ||||
| { | ||||
|   template<typename F> struct result; | ||||
|   template<typename This, typename That> struct result<This(That)> { typedef int type; }; | ||||
|   typename result<int_result_of_template<T>(double)>::type operator()(double); | ||||
|   typename result<const int_result_of_template<T>(double)>::type operator()(double) const; | ||||
|   typename result<int_result_of_template<T>(double)>::type operator()(); | ||||
|   typename result<volatile int_result_of_template<T>(double)>::type operator()() volatile; | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| struct int_result_type_and_float_result_of_and_char_return_template | ||||
| struct int_result_type_and_float_result_of_template | ||||
| { | ||||
|   typedef int result_type; | ||||
|   template<typename F> struct result; | ||||
|   template<typename This, typename That> struct result<This(That)> { typedef float type; }; | ||||
|   char operator()(char); | ||||
| }; | ||||
|  | ||||
| struct result_of_member_function_template | ||||
| { | ||||
|   template<typename F> struct result; | ||||
|  | ||||
|   template<typename This, typename That> struct result<This(That)> { typedef That type; }; | ||||
|   template<class T> typename result<result_of_member_function_template(T)>::type operator()(T); | ||||
|  | ||||
|   template<typename This, typename That> struct result<const This(That)> { typedef const That type; }; | ||||
|   template<class T> typename result<const result_of_member_function_template(T)>::type operator()(T) const; | ||||
|  | ||||
|   template<typename This, typename That> struct result<volatile This(That)> { typedef volatile That type; }; | ||||
|   template<class T> typename result<volatile result_of_member_function_template(T)>::type operator()(T) volatile; | ||||
|  | ||||
|   template<typename This, typename That> struct result<const volatile This(That)> { typedef const volatile That type; }; | ||||
|   template<class T> typename result<const volatile result_of_member_function_template(T)>::type operator()(T) const volatile; | ||||
|  | ||||
|   template<typename This, typename That> struct result<This(That &, That)> { typedef That & type; }; | ||||
|   template<class T> typename result<result_of_member_function_template(T &, T)>::type operator()(T &, T); | ||||
|  | ||||
|   template<typename This, typename That> struct result<This(That const &, That)> { typedef That const & type; }; | ||||
|   template<class T> typename result<result_of_member_function_template(T const &, T)>::type operator()(T const &, T); | ||||
|  | ||||
|   template<typename This, typename That> struct result<This(That volatile &, That)> { typedef That volatile & type; }; | ||||
|   template<class T> typename result<result_of_member_function_template(T volatile &, T)>::type operator()(T volatile &, T); | ||||
|  | ||||
|   template<typename This, typename That> struct result<This(That const volatile &, That)> { typedef That const volatile & type; }; | ||||
|   template<class T> typename result<result_of_member_function_template(T const volatile &, T)>::type operator()(T const volatile &, T); | ||||
| }; | ||||
|  | ||||
| struct no_result_type_or_result_of | ||||
| { | ||||
|   int operator()(double); | ||||
|   short operator()(double) const; | ||||
|   unsigned int operator()(); | ||||
|   unsigned short operator()() volatile; | ||||
|   const unsigned short operator()() const volatile; | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| struct no_result_type_or_result_of_template | ||||
| { | ||||
|   int operator()(double); | ||||
|   short operator()(double) const; | ||||
|   unsigned int operator()(); | ||||
|   unsigned short operator()() volatile; | ||||
|   const unsigned short operator()() const volatile; | ||||
| }; | ||||
|  | ||||
| struct X {}; | ||||
| @@ -126,37 +60,16 @@ int main() | ||||
|  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type(float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of(char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_template<void>(float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of_template<void>(double)>::type, int>::value)); | ||||
|  | ||||
|   // Prior to decltype, result_of could not deduce the return type | ||||
|   // nullary function objects unless they exposed a result_type. | ||||
| #if defined(BOOST_HAS_DECLTYPE) | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(void)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of(void)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(void)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of_template<void>(void)>::type, int>::value)); | ||||
| #else | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of_template<void>(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of_template<void>(void)>::type, void>::value)); | ||||
| #endif | ||||
|  | ||||
|   // Prior to decltype, result_of ignored a nested result<> if | ||||
|   // result_type was defined. After decltype, result_of deduces the | ||||
|   // actual return type of the function object, ignoring both | ||||
|   // result<> and result_type. | ||||
| #if defined(BOOST_HAS_DECLTYPE) | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, char>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, char>::value)); | ||||
| #else | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, int>::value)); | ||||
| #endif | ||||
|  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_template<void>(char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr(char, float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ref(char, float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr_0()>::type, int>::value));  | ||||
| @@ -168,31 +81,5 @@ int main() | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_0(X)>::type, int>::value));  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr(void)>::type, int>::value)); | ||||
|  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(double)>::type, double>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const result_of_member_function_template(double)>::type, const double>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile result_of_member_function_template(double)>::type, volatile double>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const volatile result_of_member_function_template(double)>::type, const volatile double>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int &, int)>::type, int &>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int const &, int)>::type, int const &>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int volatile &, int)>::type, int volatile &>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<result_of_member_function_template(int const volatile &, int)>::type, int const volatile &>::value)); | ||||
|  | ||||
|   typedef int (*pf_t)(int); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<pf_t(int)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<pf_t const(int)>::type,int>::value)); | ||||
|  | ||||
| #if defined(BOOST_HAS_DECLTYPE) | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of(void)>::type, unsigned int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result_of(double)>::type, short>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result_of(void)>::type, unsigned short>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result_of(void)>::type, const unsigned short>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of_template<void>(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result_of_template<void>(void)>::type, unsigned int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result_of_template<void>(double)>::type, short>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result_of_template<void>(void)>::type, unsigned short>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const volatile no_result_type_or_result_of_template<void>(void)>::type, const unsigned short>::value)); | ||||
| #endif | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|   | ||||
| @@ -154,13 +154,11 @@ void f() { | ||||
|                 ...,t<em>N</em>)</code>. The implementation permits | ||||
|                 the type <code>F</code> to be a function pointer, | ||||
|                 function reference, member function pointer, or class | ||||
|                 type.</p> <p>If your compiler does not support | ||||
|                 <code>decltype</code>, then when <code>F</code> is a | ||||
|                 class type with a member type <code>result_type</code>, | ||||
|                 type. When <code>F</code> is a class type with a | ||||
|                 member type <code>result_type</code>, | ||||
|                 <code>result_of<F(T1, T2, ..., | ||||
|                 T<em>N</em>)></code> is | ||||
|                 <code>F::result_type</code>. When <code>F</code> | ||||
|                 does not contain <code>result_type</code>,  | ||||
|                 <code>F::result_type</code>. Otherwise, | ||||
|                 <code>result_of<F(T1, T2, ..., | ||||
|                 T<em>N</em>)></code> is <code>F::result<F(T1, | ||||
|                 T2, ..., T<em>N</em>)>::type</code> when | ||||
|   | ||||
| @@ -253,33 +253,7 @@ its internal data, prior to constructing the object that it contains. | ||||
|                     | ||||
| <h2><a name="val_init"><code>template class value_initialized<T></code></a></h2> | ||||
|                     | ||||
| <pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{ | ||||
| <br>  public : | ||||
| <br>    value_initialized() : x() {} | ||||
| <br>    operator T const &() const { return x ; } | ||||
| <br>    operator T&() { return x ; } | ||||
| <br>    T const &data() const { return x ; } | ||||
| <br>    T& data() { return x ; } | ||||
| <br>    void swap( value_initialized<T>& ); | ||||
| <br> | ||||
| <br>  private : | ||||
| <br>    <i>unspecified</i> x ; | ||||
| <br>} ; | ||||
| <br> | ||||
| <br>template<class T> | ||||
| <br>T const& get ( value_initialized<T> const& x ) | ||||
| <br>{ | ||||
| <br>  return x.data() ; | ||||
| <br>} | ||||
| <br> | ||||
| <br>template<class T> | ||||
| <br>T& get ( value_initialized<T>& x ) | ||||
| <br>{ | ||||
| <br>  return x.data() ; | ||||
| <br>} | ||||
| <br> | ||||
| <br>} // namespace boost | ||||
| <br></pre> | ||||
| <pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br>  public :<br>    value_initialized() : x() {}<br>    operator T&() const { return x ; }<br>    T& data() const { return x ; }<br>    void swap( value_initialized<T>& );<br><br>  private :<br>    <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br>  return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br>  return x.data() ;<br>}<br><br>} // namespace boost<br></pre> | ||||
|                      | ||||
| <p>An object of this template class is a <code>T</code>-wrapper convertible  | ||||
|     to <code>'T&'</code> whose wrapped object (data member of type <code>T</code>)  | ||||
| @@ -297,8 +271,7 @@ its internal data, prior to constructing the object that it contains. | ||||
|      <code>T&</code>, the member function <code>data()</code>, or the | ||||
| non-member    function <code>get()</code>:  </p> | ||||
|                     | ||||
| <pre>void watch(int);<br>value_initialized<int> x; | ||||
| <br><br>watch(x) ; // operator T& used.<br>watch(x.data());<br>watch( get(x) ) // function get() used</pre> | ||||
| <pre>void watch(int);<br>value_initialized<int> x;<br><br>watch(x) ; // operator T& used.<br>watch(x.data());<br>watch( get(x) ) // function get() used</pre> | ||||
|                      | ||||
| <p>Both <code>const</code> and non-<code>const</code> objects can be wrapped.  | ||||
|     Mutable objects can be modified directly from within the wrapper but constant | ||||
| @@ -308,34 +281,37 @@ non-member    function <code>get()</code>:  </p> | ||||
|     is swappable as well, by calling its <code>swap</code> member function | ||||
|     as well as by calling <code>boost::swap</code>.</p> | ||||
|                     | ||||
| <pre>value_initialized<int> x ; <br>static_cast<int&>(x) = 1 ; // OK<br>get(x) = 1 ; // OK | ||||
| <br><br>value_initialized<int const> y ; <br>static_cast<int&>(y) = 1 ; // ERROR: cannot cast to int&<br>static_cast<int const&>(y) = 1 ; // ERROR: cannot modify a const value<br>get(y) = 1 ; // ERROR: cannot modify a const value</pre> | ||||
| <pre>value_initialized<int> x ; <br>static_cast<int&>(x) = 1 ; // OK<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> y ; <br>static_cast<int&>(y) = 1 ; // ERROR: cannot cast to int&<br>static_cast<int const&>(y) = 1 ; // ERROR: cannot modify a const value<br>get(y) = 1 ; // ERROR: cannot modify a const value</pre> | ||||
|                      | ||||
| <h3>Warning:</h3> | ||||
|                     | ||||
| <p>The <code>value_initialized</code> implementation of Boost version 1.40.0 and older | ||||
| allowed <i>non-const</i> access to the wrapped object, from a constant wrapper, | ||||
| both by its conversion operator and its <code>data()</code> member function. For example:</p> | ||||
| <p>Both the conversion operator and the <code>data()</code> member function  | ||||
|     are <code>const</code> in order to allow access to the wrapped object  | ||||
| from    a constant wrapper:</p> | ||||
|                     | ||||
| <pre>value_initialized<int> const x_c ;<br>int& xr = x_c ; // OK, conversion to int& available even though x_c is itself const. | ||||
| <br>xr = 2 ; </pre> | ||||
| <pre>void foo(int);<br>value_initialized<int> const x ;<br>foo(x);<br></pre> | ||||
|                      | ||||
| <p>The reason for this obscure behavior was that some compilers  | ||||
|      didn't accept the following valid code:</p> | ||||
| <p>But notice that this conversion operator is to <code>T&</code> although  | ||||
|     it is itself <code>const</code>. As a consequence, if <code>T</code> is | ||||
|   a  non-<code>const</code> type, you can modify the wrapped object even from | ||||
|    within a constant wrapper:</p> | ||||
|                     | ||||
| <pre>value_initialized<int> const x_c ;<br>int& xr = x_c ; // OK, conversion to int& available even though x_c is itself const.<br>xr = 2 ; </pre> | ||||
|                      | ||||
| <p>The reason for this obscure behavior is that some commonly used compilers | ||||
|      just don't accept the following valid code:</p> | ||||
|                     | ||||
| <pre>struct X<br>{<br>  operator int&() ;<br>  operator int const&() const ;   <br>};<br>X x ;<br>(x == 1 ) ; // ERROR HERE!</pre> | ||||
|                      | ||||
| <p>The current version of <code>value_initialized</code> no longer has this obscure behavior. | ||||
| As compilers nowadays widely support overloading the conversion operator by having a <code>const</code> and a <code>non-const</code> version, we have decided to fix the issue accordingly. So the current version supports the idea of logical constness. | ||||
| <br> | ||||
| <p>These compilers complain about ambiguity between the conversion operators.  | ||||
|     This complaint is incorrect, but the only workaround that I know of is  | ||||
|  to   provide only one of them, which leads to the obscure behavior just explained.<br> | ||||
|           </p> | ||||
|                     | ||||
| <h3>Recommended practice: The non-member get() idiom</h3> | ||||
|                     | ||||
| <p>The obscure behavior of being able to modify a non-<code>const</code> | ||||
| wrapped object from within a constant wrapper (as was supported by previous | ||||
| versions of <code>value_initialized</code>) | ||||
| can be avoided if access to | ||||
| wrapped object from within a constant wrapper can be avoided if access to | ||||
| the wrapped object is always performed with the <code>get()</code> idiom:</p> | ||||
|                     | ||||
| <pre>value_initialized<int> x ;<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> cx ;<br>get(x) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int> const x_c ;<br>get(x_c) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int const> const cx_c ;<br>get(cx_c) = 1 ; // ERROR: Cannot modify a const object<br></pre> | ||||
| @@ -407,9 +383,9 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler | ||||
|      </p> | ||||
|                      | ||||
| <hr>           | ||||
| <p>Revised 03 October 2009</p> | ||||
| <p>Revised 28 August 2008</p> | ||||
|                     | ||||
| <p>© Copyright Fernando Cacciola, 2002, 2009.</p> | ||||
| <p>© Copyright Fernando Cacciola, 2002, 2008.</p> | ||||
|                     | ||||
| <p>Distributed under the Boost Software License, Version 1.0. See | ||||
| <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p> | ||||
| @@ -418,4 +394,4 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler | ||||
|  <br> | ||||
|      | ||||
| </body> | ||||
| </html> | ||||
| </html> | ||||
| @@ -29,9 +29,9 @@ | ||||
| // | ||||
| struct POD | ||||
| { | ||||
|   POD () : f(0), c(0), i(0){} | ||||
|   POD () : c(0), i(0), f(0) {} | ||||
|  | ||||
|   POD ( char c_, int i_, float f_ ) : f(f_), c(c_), i(i_) {} | ||||
|   POD ( char c_, int i_, float f_ ) : c(c_), i(i_), f(f_) {} | ||||
|  | ||||
|   friend std::ostream& operator << ( std::ostream& os, POD const& pod ) | ||||
|     { return os << '(' << pod.c << ',' << pod.i << ',' << pod.f << ')' ; } | ||||
| @@ -260,7 +260,7 @@ bool test ( T const& y, T const& z ) | ||||
|   boost::value_initialized<T> const x_c ; | ||||
|   BOOST_CHECK ( y == x_c ) ; | ||||
|   BOOST_CHECK ( y == boost::get(x_c) ) ; | ||||
|   T& x_c_ref = const_cast<T&>( boost::get(x_c) ) ; | ||||
|   T& x_c_ref = x_c ; | ||||
|   x_c_ref = z ; | ||||
|   BOOST_CHECK ( x_c == z ) ; | ||||
|  | ||||
| @@ -291,7 +291,7 @@ int test_main(int, char **) | ||||
| { | ||||
|   BOOST_CHECK ( test( 0,1234 ) ) ; | ||||
|   BOOST_CHECK ( test( 0.0,12.34 ) ) ; | ||||
|   BOOST_CHECK ( test( POD(0,0,0.0), POD('a',1234,56.78f) ) ) ; | ||||
|   BOOST_CHECK ( test( POD(0,0,0.0), POD('a',1234,56.78) ) ) ; | ||||
|   BOOST_CHECK ( test( NonPOD( std::string() ), NonPOD( std::string("something") ) ) ) ; | ||||
|  | ||||
|   NonPOD NonPOD_object( std::string("NonPOD_object") ); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user