| 
									
										
										
										
											2003-12-03 13:34:11 +00:00
										 |  |  | //  boost::compressed_pair test program   
 | 
					
						
							| 
									
										
										
										
											2000-08-02 10:58:59 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2003-12-03 13:34:11 +00:00
										 |  |  | //  (C) Copyright John Maddock 2000. 
 | 
					
						
							|  |  |  | //  Use, modification and distribution are 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).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-02 10:58:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // standalone test program for <boost/call_traits.hpp>
 | 
					
						
							| 
									
										
										
										
											2002-03-19 11:33:00 +00:00
										 |  |  | // 18 Mar 2002:
 | 
					
						
							|  |  |  | //    Changed some names to prevent conflicts with some new type_traits additions.
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | // 03 Oct 2000:
 | 
					
						
							|  |  |  | //    Enabled extra tests for VC6.
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <cassert>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <iomanip>
 | 
					
						
							|  |  |  | #include <algorithm>
 | 
					
						
							|  |  |  | #include <typeinfo>
 | 
					
						
							|  |  |  | #include <boost/call_traits.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | #include <boost/type_traits/type_traits_test.hpp>
 | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // a way prevent warnings for unused variables
 | 
					
						
							|  |  |  | template<class T> inline void unused_variable(const T&) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // struct contained models a type that contains a type (for example std::pair)
 | 
					
						
							|  |  |  | // arrays are contained by value, and have to be treated as a special case:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | template <class T> | 
					
						
							|  |  |  | struct contained | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    // define our typedefs first, arrays are stored by value
 | 
					
						
							|  |  |  |    // so value_type is not the same as result_type:
 | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T>::param_type       param_type; | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T>::reference        reference; | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T>::const_reference  const_reference; | 
					
						
							|  |  |  |    typedef T                                                value_type; | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T>::value_type       result_type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    // stored value:
 | 
					
						
							|  |  |  |    value_type v_; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    // constructors:
 | 
					
						
							|  |  |  |    contained() {} | 
					
						
							|  |  |  |    contained(param_type p) : v_(p){} | 
					
						
							|  |  |  |    // return byval:
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    result_type value()const { return v_; } | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    // return by_ref:
 | 
					
						
							|  |  |  |    reference get() { return v_; } | 
					
						
							|  |  |  |    const_reference const_get()const { return v_; } | 
					
						
							|  |  |  |    // pass value:
 | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  |    void call(param_type){} | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | template <class T, std::size_t N> | 
					
						
							|  |  |  | struct contained<T[N]> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T[N]>::param_type       param_type; | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T[N]>::reference        reference; | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T[N]>::const_reference  const_reference; | 
					
						
							|  |  |  |    typedef T                                                   value_type[N]; | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T[N]>::value_type       result_type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    value_type v_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    contained(param_type p) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       std::copy(p, p+N, v_); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    // return byval:
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    result_type value()const { return v_; } | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    // return by_ref:
 | 
					
						
							|  |  |  |    reference get() { return v_; } | 
					
						
							|  |  |  |    const_reference const_get()const { return v_; } | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  |    void call(param_type){} | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | template <class T> | 
					
						
							| 
									
										
										
										
											2002-03-19 11:33:00 +00:00
										 |  |  | contained<typename boost::call_traits<T>::value_type> test_wrap_type(const T& t) | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    typedef typename boost::call_traits<T>::value_type ct; | 
					
						
							|  |  |  |    return contained<ct>(t); | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | namespace test{ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | std::pair< | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    typename boost::call_traits<T1>::value_type, | 
					
						
							|  |  |  |    typename boost::call_traits<T2>::value_type> | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |       make_pair(const T1& t1, const T2& t2) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    return std::pair< | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |       typename boost::call_traits<T1>::value_type, | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |       typename boost::call_traits<T2>::value_type>(t1, t2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | } // namespace test
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | // struct call_traits_checker:
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | // verifies behaviour of contained example:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | template <class T> | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | struct call_traits_checker | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T>::param_type param_type; | 
					
						
							|  |  |  |    void operator()(param_type); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class T> | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | void call_traits_checker<T>::operator()(param_type p) | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    T t(p); | 
					
						
							|  |  |  |    contained<T> c(t); | 
					
						
							|  |  |  |    cout << "checking contained<" << typeid(T).name() << ">..." << endl; | 
					
						
							|  |  |  |    assert(t == c.value()); | 
					
						
							|  |  |  |    assert(t == c.get()); | 
					
						
							|  |  |  |    assert(t == c.const_get()); | 
					
						
							| 
									
										
										
										
											2001-03-04 11:08:29 +00:00
										 |  |  | #ifndef __ICL
 | 
					
						
							| 
									
										
										
										
											2000-10-01 11:57:00 +00:00
										 |  |  |    //cout << "typeof contained<" << typeid(T).name() << ">::v_ is:           " << typeid(&contained<T>::v_).name() << endl;
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    cout << "typeof contained<" << typeid(T).name() << ">::value() is:      " << typeid(&contained<T>::value).name() << endl; | 
					
						
							|  |  |  |    cout << "typeof contained<" << typeid(T).name() << ">::get() is:        " << typeid(&contained<T>::get).name() << endl; | 
					
						
							|  |  |  |    cout << "typeof contained<" << typeid(T).name() << ">::const_get() is:  " << typeid(&contained<T>::const_get).name() << endl; | 
					
						
							|  |  |  |    cout << "typeof contained<" << typeid(T).name() << ">::call() is:       " << typeid(&contained<T>::call).name() << endl; | 
					
						
							|  |  |  |    cout << endl; | 
					
						
							| 
									
										
										
										
											2001-03-04 11:08:29 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | template <class T, std::size_t N> | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | struct call_traits_checker<T[N]> | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    typedef typename boost::call_traits<T[N]>::param_type param_type; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    void operator()(param_type t) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       contained<T[N]> c(t); | 
					
						
							|  |  |  |       cout << "checking contained<" << typeid(T[N]).name() << ">..." << endl; | 
					
						
							|  |  |  |       unsigned int i = 0; | 
					
						
							|  |  |  |       for(i = 0; i < N; ++i) | 
					
						
							|  |  |  |          assert(t[i] == c.value()[i]); | 
					
						
							|  |  |  |       for(i = 0; i < N; ++i) | 
					
						
							|  |  |  |          assert(t[i] == c.get()[i]); | 
					
						
							|  |  |  |       for(i = 0; i < N; ++i) | 
					
						
							|  |  |  |          assert(t[i] == c.const_get()[i]); | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |       cout << "typeof contained<" << typeid(T[N]).name() << ">::v_ is:         " << typeid(&contained<T[N]>::v_).name() << endl; | 
					
						
							|  |  |  |       cout << "typeof contained<" << typeid(T[N]).name() << ">::value is:      " << typeid(&contained<T[N]>::value).name() << endl; | 
					
						
							|  |  |  |       cout << "typeof contained<" << typeid(T[N]).name() << ">::get is:        " << typeid(&contained<T[N]>::get).name() << endl; | 
					
						
							|  |  |  |       cout << "typeof contained<" << typeid(T[N]).name() << ">::const_get is:  " << typeid(&contained<T[N]>::const_get).name() << endl; | 
					
						
							|  |  |  |       cout << "typeof contained<" << typeid(T[N]).name() << ">::call is:       " << typeid(&contained<T[N]>::call).name() << endl; | 
					
						
							|  |  |  |       cout << endl; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // check_wrap:
 | 
					
						
							| 
									
										
										
										
											2001-10-30 11:41:35 +00:00
										 |  |  | template <class W, class U> | 
					
						
							|  |  |  | void check_wrap(const W& w, const U& u) | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-10-30 11:41:35 +00:00
										 |  |  |    cout << "checking " << typeid(W).name() << "..." << endl; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    assert(w.value() == u); | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // check_make_pair:
 | 
					
						
							|  |  |  | // verifies behaviour of "make_pair":
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | template <class T, class U, class V> | 
					
						
							|  |  |  | void check_make_pair(T c, U u, V v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    cout << "checking std::pair<" << typeid(c.first).name() << ", " << typeid(c.second).name() << ">..." << endl; | 
					
						
							|  |  |  |    assert(c.first == u); | 
					
						
							|  |  |  |    assert(c.second == v); | 
					
						
							|  |  |  |    cout << endl; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | struct comparible_UDT | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    int i_; | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    comparible_UDT() : i_(2){} | 
					
						
							| 
									
										
										
										
											2001-09-22 11:52:56 +00:00
										 |  |  |    comparible_UDT(const comparible_UDT& other) : i_(other.i_){} | 
					
						
							|  |  |  |    comparible_UDT& operator=(const comparible_UDT& other) | 
					
						
							|  |  |  |    {  | 
					
						
							|  |  |  |       i_ = other.i_; | 
					
						
							|  |  |  |       return *this; | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    bool operator == (const comparible_UDT& v){ return v.i_ == i_; } | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | int main(int argc, char *argv[ ]) | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    call_traits_checker<comparible_UDT> c1; | 
					
						
							|  |  |  |    comparible_UDT u; | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    c1(u); | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    call_traits_checker<int> c2; | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    int i = 2; | 
					
						
							|  |  |  |    c2(i); | 
					
						
							|  |  |  |    int* pi = &i; | 
					
						
							| 
									
										
										
										
											2001-09-22 11:52:56 +00:00
										 |  |  |    int a[2] = {1,2}; | 
					
						
							| 
									
										
										
										
											2002-02-02 18:36:12 +00:00
										 |  |  | #if defined(BOOST_MSVC6_MEMBER_TEMPLATES) && !defined(__ICL)
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    call_traits_checker<int*> c3; | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    c3(pi); | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    call_traits_checker<int&> c4; | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    c4(i); | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    call_traits_checker<const int&> c5; | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    c5(i); | 
					
						
							| 
									
										
										
										
											2001-10-08 11:35:05 +00:00
										 |  |  | #if !defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(__MWERKS__) && !defined(__SUNPRO_CC)
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    call_traits_checker<int[2]> c6; | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  |    c6(a); | 
					
						
							| 
									
										
										
										
											2000-10-01 11:57:00 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-19 11:33:00 +00:00
										 |  |  |    check_wrap(test_wrap_type(2), 2); | 
					
						
							| 
									
										
										
										
											2001-10-08 11:35:05 +00:00
										 |  |  | #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(__SUNPRO_CC)
 | 
					
						
							| 
									
										
										
										
											2002-03-19 11:33:00 +00:00
										 |  |  |    check_wrap(test_wrap_type(a), a); | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    check_make_pair(test::make_pair(a, a), a, a); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    // cv-qualifiers applied to reference types should have no effect
 | 
					
						
							|  |  |  |    // declare these here for later use with is_reference and remove_reference:
 | 
					
						
							|  |  |  |    typedef int& r_type; | 
					
						
							|  |  |  |    typedef const r_type cr_type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    type_test(comparible_UDT, boost::call_traits<comparible_UDT>::value_type) | 
					
						
							|  |  |  |    type_test(comparible_UDT&, boost::call_traits<comparible_UDT>::reference) | 
					
						
							|  |  |  |    type_test(const comparible_UDT&, boost::call_traits<comparible_UDT>::const_reference) | 
					
						
							|  |  |  |    type_test(const comparible_UDT&, boost::call_traits<comparible_UDT>::param_type) | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    type_test(int, boost::call_traits<int>::value_type) | 
					
						
							|  |  |  |    type_test(int&, boost::call_traits<int>::reference) | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<int>::const_reference) | 
					
						
							|  |  |  |    type_test(const int, boost::call_traits<int>::param_type) | 
					
						
							|  |  |  |    type_test(int*, boost::call_traits<int*>::value_type) | 
					
						
							|  |  |  |    type_test(int*&, boost::call_traits<int*>::reference) | 
					
						
							|  |  |  |    type_test(int*const&, boost::call_traits<int*>::const_reference) | 
					
						
							|  |  |  |    type_test(int*const, boost::call_traits<int*>::param_type) | 
					
						
							| 
									
										
										
										
											2002-02-02 18:36:12 +00:00
										 |  |  | #if defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    type_test(int&, boost::call_traits<int&>::value_type) | 
					
						
							|  |  |  |    type_test(int&, boost::call_traits<int&>::reference) | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<int&>::const_reference) | 
					
						
							|  |  |  |    type_test(int&, boost::call_traits<int&>::param_type) | 
					
						
							| 
									
										
										
										
											2002-03-01 17:43:00 +00:00
										 |  |  | #if !(defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC__ == 3) && (__GNUC_MINOR__ < 1)))
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    type_test(int&, boost::call_traits<cr_type>::value_type) | 
					
						
							|  |  |  |    type_test(int&, boost::call_traits<cr_type>::reference) | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<cr_type>::const_reference) | 
					
						
							|  |  |  |    type_test(int&, boost::call_traits<cr_type>::param_type) | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2000-09-09 10:20:24 +00:00
										 |  |  |    std::cout << "Your compiler cannot instantiate call_traits<int&const>, skipping four tests (4 errors)" << std::endl; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    failures += 4; | 
					
						
							|  |  |  |    test_count += 4; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<const int&>::value_type) | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<const int&>::reference) | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<const int&>::const_reference) | 
					
						
							|  |  |  |    type_test(const int&, boost::call_traits<const int&>::param_type) | 
					
						
							| 
									
										
										
										
											2000-10-01 11:57:00 +00:00
										 |  |  | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    type_test(const int*, boost::call_traits<int[3]>::value_type) | 
					
						
							|  |  |  |    type_test(int(&)[3], boost::call_traits<int[3]>::reference) | 
					
						
							|  |  |  |    type_test(const int(&)[3], boost::call_traits<int[3]>::const_reference) | 
					
						
							|  |  |  |    type_test(const int*const, boost::call_traits<int[3]>::param_type) | 
					
						
							|  |  |  |    type_test(const int*, boost::call_traits<const int[3]>::value_type) | 
					
						
							|  |  |  |    type_test(const int(&)[3], boost::call_traits<const int[3]>::reference) | 
					
						
							|  |  |  |    type_test(const int(&)[3], boost::call_traits<const int[3]>::const_reference) | 
					
						
							|  |  |  |    type_test(const int*const, boost::call_traits<const int[3]>::param_type) | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  |    // test with abstract base class:
 | 
					
						
							|  |  |  |    type_test(test_abc1, boost::call_traits<test_abc1>::value_type) | 
					
						
							|  |  |  |    type_test(test_abc1&, boost::call_traits<test_abc1>::reference) | 
					
						
							|  |  |  |    type_test(const test_abc1&, boost::call_traits<test_abc1>::const_reference) | 
					
						
							|  |  |  |    type_test(const test_abc1&, boost::call_traits<test_abc1>::param_type) | 
					
						
							| 
									
										
										
										
											2000-10-01 11:57:00 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  |    std::cout << "You're compiler does not support partial template specialiation, skipping 8 tests (8 errors)" << std::endl; | 
					
						
							|  |  |  |    failures += 12; | 
					
						
							|  |  |  |    test_count += 12; | 
					
						
							| 
									
										
										
										
											2000-10-01 11:57:00 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  |    std::cout << "You're compiler does not support partial template specialiation, skipping 20 tests (20 errors)" << std::endl; | 
					
						
							|  |  |  |    failures += 24; | 
					
						
							|  |  |  |    test_count += 24; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  |    // test with an incomplete type:
 | 
					
						
							|  |  |  |    type_test(incomplete_type, boost::call_traits<incomplete_type>::value_type) | 
					
						
							|  |  |  |    type_test(incomplete_type&, boost::call_traits<incomplete_type>::reference) | 
					
						
							|  |  |  |    type_test(const incomplete_type&, boost::call_traits<incomplete_type>::const_reference) | 
					
						
							|  |  |  |    type_test(const incomplete_type&, boost::call_traits<incomplete_type>::param_type) | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  |    return check_result(argc, argv); | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // define call_traits tests to check that the assertions in the docs do actually work
 | 
					
						
							|  |  |  | // this is an instantiate only set of tests:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | template <typename T, bool isarray = false> | 
					
						
							|  |  |  | struct call_traits_test | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  |    typedef ::boost::call_traits<T> ct; | 
					
						
							|  |  |  |    typedef typename ct::param_type param_type; | 
					
						
							|  |  |  |    typedef typename ct::reference reference; | 
					
						
							|  |  |  |    typedef typename ct::const_reference const_reference; | 
					
						
							|  |  |  |    typedef typename ct::value_type value_type; | 
					
						
							|  |  |  |    static void assert_construct(param_type val); | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <typename T, bool isarray> | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  | void call_traits_test<T, isarray>::assert_construct(typename call_traits_test<T, isarray>::param_type val) | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    //
 | 
					
						
							|  |  |  |    // this is to check that the call_traits assertions are valid:
 | 
					
						
							|  |  |  |    T t(val); | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  |    value_type v(t); | 
					
						
							|  |  |  |    reference r(t); | 
					
						
							|  |  |  |    const_reference cr(t); | 
					
						
							|  |  |  |    param_type p(t); | 
					
						
							|  |  |  |    value_type v2(v); | 
					
						
							|  |  |  |    value_type v3(r); | 
					
						
							|  |  |  |    value_type v4(p); | 
					
						
							|  |  |  |    reference r2(v); | 
					
						
							|  |  |  |    reference r3(r); | 
					
						
							|  |  |  |    const_reference cr2(v); | 
					
						
							|  |  |  |    const_reference cr3(r); | 
					
						
							|  |  |  |    const_reference cr4(cr); | 
					
						
							|  |  |  |    const_reference cr5(p); | 
					
						
							|  |  |  |    param_type p2(v); | 
					
						
							|  |  |  |    param_type p3(r); | 
					
						
							|  |  |  |    param_type p4(p); | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  |     | 
					
						
							|  |  |  |    unused_variable(v2); | 
					
						
							|  |  |  |    unused_variable(v3); | 
					
						
							|  |  |  |    unused_variable(v4); | 
					
						
							|  |  |  |    unused_variable(r2); | 
					
						
							|  |  |  |    unused_variable(r3); | 
					
						
							|  |  |  |    unused_variable(cr2); | 
					
						
							|  |  |  |    unused_variable(cr3); | 
					
						
							|  |  |  |    unused_variable(cr4); | 
					
						
							|  |  |  |    unused_variable(cr5); | 
					
						
							|  |  |  |    unused_variable(p2); | 
					
						
							|  |  |  |    unused_variable(p3); | 
					
						
							|  |  |  |    unused_variable(p4); | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | template <typename T> | 
					
						
							|  |  |  | struct call_traits_test<T, true> | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  |    typedef ::boost::call_traits<T> ct; | 
					
						
							|  |  |  |    typedef typename ct::param_type param_type; | 
					
						
							|  |  |  |    typedef typename ct::reference reference; | 
					
						
							|  |  |  |    typedef typename ct::const_reference const_reference; | 
					
						
							|  |  |  |    typedef typename ct::value_type value_type; | 
					
						
							|  |  |  |    static void assert_construct(param_type val); | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <typename T> | 
					
						
							| 
									
										
										
										
											2000-10-12 21:01:49 +00:00
										 |  |  | void call_traits_test<T, true>::assert_construct(typename boost::call_traits<T>::param_type val) | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    //
 | 
					
						
							|  |  |  |    // this is to check that the call_traits assertions are valid:
 | 
					
						
							|  |  |  |    T t; | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  |    value_type v(t); | 
					
						
							|  |  |  |    value_type v5(val); | 
					
						
							|  |  |  |    reference r = t; | 
					
						
							|  |  |  |    const_reference cr = t; | 
					
						
							|  |  |  |    reference r2 = r; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    #ifndef __BORLANDC__
 | 
					
						
							|  |  |  |    // C++ Builder buglet:
 | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  |    const_reference cr2 = r; | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-29 11:39:42 +00:00
										 |  |  |    param_type p(t); | 
					
						
							|  |  |  |    value_type v2(v); | 
					
						
							|  |  |  |    const_reference cr3 = cr; | 
					
						
							|  |  |  |    value_type v3(r); | 
					
						
							|  |  |  |    value_type v4(p); | 
					
						
							|  |  |  |    param_type p2(v); | 
					
						
							|  |  |  |    param_type p3(r); | 
					
						
							|  |  |  |    param_type p4(p); | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  |     | 
					
						
							|  |  |  |    unused_variable(v2); | 
					
						
							|  |  |  |    unused_variable(v3); | 
					
						
							|  |  |  |    unused_variable(v4); | 
					
						
							|  |  |  |    unused_variable(v5); | 
					
						
							| 
									
										
										
										
											2001-10-30 11:41:35 +00:00
										 |  |  | #ifndef __BORLANDC__
 | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  |    unused_variable(r2); | 
					
						
							|  |  |  |    unused_variable(cr2); | 
					
						
							| 
									
										
										
										
											2001-10-30 11:41:35 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-09-24 23:21:16 +00:00
										 |  |  |    unused_variable(cr3); | 
					
						
							|  |  |  |    unused_variable(p2); | 
					
						
							|  |  |  |    unused_variable(p3); | 
					
						
							|  |  |  |    unused_variable(p4); | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif //BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // now check call_traits assertions by instantiating call_traits_test:
 | 
					
						
							|  |  |  | template struct call_traits_test<int>; | 
					
						
							|  |  |  | template struct call_traits_test<const int>; | 
					
						
							|  |  |  | template struct call_traits_test<int*>; | 
					
						
							| 
									
										
										
										
											2002-02-02 18:36:12 +00:00
										 |  |  | #if defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | template struct call_traits_test<int&>; | 
					
						
							|  |  |  | template struct call_traits_test<const int&>; | 
					
						
							| 
									
										
										
										
											2001-10-11 12:04:00 +00:00
										 |  |  | #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(__SUNPRO_CC)
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | template struct call_traits_test<int[2], true>; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-10-01 11:57:00 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-01 14:57:40 +00:00
										 |  |  | #if defined(BOOST_MSVC) && _MSC_VER <= 1300
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  | unsigned int expected_failures = 14; | 
					
						
							| 
									
										
										
										
											2001-05-08 11:16:35 +00:00
										 |  |  | #elif defined(__SUNPRO_CC)
 | 
					
						
							| 
									
										
										
										
											2001-10-08 11:35:05 +00:00
										 |  |  | #if(__SUNPRO_CC <= 0x520)
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  | unsigned int expected_failures = 18; | 
					
						
							| 
									
										
										
										
											2002-03-05 20:41:37 +00:00
										 |  |  | #elif(__SUNPRO_CC < 0x530)
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  | unsigned int expected_failures = 17; | 
					
						
							| 
									
										
										
										
											2001-10-08 11:35:05 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | unsigned int expected_failures = 6; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | #elif defined(__BORLANDC__)
 | 
					
						
							|  |  |  | unsigned int expected_failures = 2; | 
					
						
							| 
									
										
										
										
											2002-03-01 12:27:01 +00:00
										 |  |  | #elif (defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC__ == 3) && (__GNUC_MINOR__ < 1)))
 | 
					
						
							| 
									
										
										
										
											2001-02-20 12:17:55 +00:00
										 |  |  | unsigned int expected_failures = 4; | 
					
						
							| 
									
										
										
										
											2002-01-08 13:01:15 +00:00
										 |  |  | #elif defined(__HP_aCC)
 | 
					
						
							| 
									
										
										
										
											2002-02-14 12:57:32 +00:00
										 |  |  | unsigned int expected_failures = 24; | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | unsigned int expected_failures = 0; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 |