| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | //  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
 | 
					
						
							| 
									
										
										
										
											2003-12-03 13:34:11 +00:00
										 |  |  | //  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).
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  See http://www.boost.org/libs/utility for most recent version including documentation.
 | 
					
						
							| 
									
										
										
										
											2000-08-02 10:58:59 +00:00
										 |  |  | //  see libs/utility/compressed_pair.hpp
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  | /* Release notes:
 | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |    20 Jan 2001: | 
					
						
							|  |  |  |         Fixed obvious bugs (David Abrahams) | 
					
						
							| 
									
										
										
										
											2002-01-19 12:38:14 +00:00
										 |  |  |    07 Oct 2000: | 
					
						
							|  |  |  |       Added better single argument constructor support. | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  |    03 Oct 2000: | 
					
						
							|  |  |  |       Added VC6 support (JM). | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    23rd July 2000: | 
					
						
							|  |  |  |       Additional comments added. (JM) | 
					
						
							|  |  |  |    Jan 2000: | 
					
						
							|  |  |  |       Original version: this version crippled for use with crippled compilers | 
					
						
							|  |  |  |       - John Maddock Jan 2000. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_OB_COMPRESSED_PAIR_HPP
 | 
					
						
							|  |  |  | #define BOOST_OB_COMPRESSED_PAIR_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2001-02-19 12:52:30 +00:00
										 |  |  | #ifndef BOOST_OBJECT_TYPE_TRAITS_HPP
 | 
					
						
							| 
									
										
										
										
											2001-02-18 11:43:01 +00:00
										 |  |  | #include <boost/type_traits/object_traits.hpp>
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-02-19 12:52:30 +00:00
										 |  |  | #ifndef BOOST_SAME_TRAITS_HPP
 | 
					
						
							|  |  |  | #include <boost/type_traits/same_traits.hpp>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | #ifndef BOOST_CALL_TRAITS_HPP
 | 
					
						
							|  |  |  | #include <boost/call_traits.hpp>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-02-02 18:36:12 +00:00
										 |  |  | #ifdef BOOST_MSVC6_MEMBER_TEMPLATES
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // use member templates to emulate
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | // partial specialisation.  Note that due to
 | 
					
						
							|  |  |  | // problems with overload resolution with VC6
 | 
					
						
							|  |  |  | // each of the compressed_pair versions that follow
 | 
					
						
							|  |  |  | // have one template single-argument constructor
 | 
					
						
							|  |  |  | // in place of two specific constructors:
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2001-01-10 12:21:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | namespace detail{ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | template <class A, class T1, class T2> | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  | struct best_conversion_traits | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | { | 
					
						
							|  |  |  |    typedef char one; | 
					
						
							|  |  |  |    typedef char (&two)[2]; | 
					
						
							|  |  |  |    static A a; | 
					
						
							|  |  |  |    static one test(T1); | 
					
						
							|  |  |  |    static two test(T2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    enum { value = sizeof(test(a)) }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <int> | 
					
						
							|  |  |  | struct init_one; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct init_one<1> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class A, class T1, class T2> | 
					
						
							|  |  |  |    static void init(const A& a, T1* p1, T2*) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       *p1 = a; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct init_one<2> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class A, class T1, class T2> | 
					
						
							|  |  |  |    static void init(const A& a, T1*, T2* p2) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       *p2 = a; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // T1 != T2, both non-empty
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair_0 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    T1 _first; | 
					
						
							|  |  |  |    T2 _second; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair_0() : _first(), _second() {} | 
					
						
							|  |  |  |             compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {} | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    template <class A> | 
					
						
							|  |  |  |    explicit compressed_pair_0(const A& val) | 
					
						
							|  |  |  |    { | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, &_second); | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2001-01-10 12:21:30 +00:00
										 |  |  |    compressed_pair_0(const ::boost::compressed_pair<T1,T2>& x) | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       : _first(x.first()), _second(x.second()) {} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-25 04:45:52 +00:00
										 |  |  | #if 0
 | 
					
						
							|  |  |  |   compressed_pair_0& operator=(const compressed_pair_0& x) { | 
					
						
							|  |  |  |     cout << "assigning compressed pair 0" << endl; | 
					
						
							|  |  |  |     _first = x._first; | 
					
						
							|  |  |  |     _second = x._second; | 
					
						
							|  |  |  |     cout << "finished assigning compressed pair 0" << endl; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  |    first_reference       first()       { return _first; } | 
					
						
							|  |  |  |    first_const_reference first() const { return _first; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return _second; } | 
					
						
							|  |  |  |    second_const_reference second() const { return _second; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair_0& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       using std::swap; | 
					
						
							|  |  |  |       swap(_first, y._first); | 
					
						
							|  |  |  |       swap(_second, y._second); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | // T1 != T2, T2 empty
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair_1 : T2 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    T1 _first; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair_1() : T2(), _first() {} | 
					
						
							|  |  |  |             compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {} | 
					
						
							| 
									
										
										
										
											2001-01-25 04:45:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    template <class A> | 
					
						
							|  |  |  |    explicit compressed_pair_1(const A& val) | 
					
						
							|  |  |  |    { | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, static_cast<T2*>(this)); | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2001-01-25 04:45:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-10 12:21:30 +00:00
										 |  |  |    compressed_pair_1(const ::boost::compressed_pair<T1,T2>& x) | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       : T2(x.second()), _first(x.first()) {} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-13 12:26:19 +00:00
										 |  |  | #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
 | 
					
						
							| 
									
										
										
										
											2001-01-25 04:45:52 +00:00
										 |  |  |   // Total weirdness. If the assignment to _first is moved after
 | 
					
						
							|  |  |  |   // the call to the inherited operator=, then this breaks graph/test/graph.cpp
 | 
					
						
							|  |  |  |   // by way of iterator_adaptor.
 | 
					
						
							|  |  |  |   compressed_pair_1& operator=(const compressed_pair_1& x) { | 
					
						
							|  |  |  |     _first = x._first; | 
					
						
							|  |  |  |     T2::operator=(x); | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  |    first_reference       first()       { return _first; } | 
					
						
							|  |  |  |    first_const_reference first() const { return _first; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return *this; } | 
					
						
							|  |  |  |    second_const_reference second() const { return *this; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair_1& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       // no need to swap empty base class:
 | 
					
						
							|  |  |  |       using std::swap; | 
					
						
							|  |  |  |       swap(_first, y._first); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | // T1 != T2, T1 empty
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair_2 : T1 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    T2 _second; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair_2() : T1(), _second() {} | 
					
						
							|  |  |  |             compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {} | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    template <class A> | 
					
						
							|  |  |  |    explicit compressed_pair_2(const A& val) | 
					
						
							|  |  |  |    { | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), &_second); | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2001-01-10 12:21:30 +00:00
										 |  |  |    compressed_pair_2(const ::boost::compressed_pair<T1,T2>& x) | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       : T1(x.first()), _second(x.second()) {} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-25 04:45:52 +00:00
										 |  |  | #if 0
 | 
					
						
							|  |  |  |   compressed_pair_2& operator=(const compressed_pair_2& x) { | 
					
						
							|  |  |  |     cout << "assigning compressed pair 2" << endl; | 
					
						
							|  |  |  |     T1::operator=(x); | 
					
						
							|  |  |  |     _second = x._second; | 
					
						
							|  |  |  |     cout << "finished assigning compressed pair 2" << endl; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  |    first_reference       first()       { return *this; } | 
					
						
							|  |  |  |    first_const_reference first() const { return *this; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return _second; } | 
					
						
							|  |  |  |    second_const_reference second() const { return _second; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair_2& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       // no need to swap empty base class:
 | 
					
						
							|  |  |  |       using std::swap; | 
					
						
							|  |  |  |       swap(_second, y._second); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | // T1 != T2, both empty
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair_3 : T1, T2 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair_3() : T1(), T2() {} | 
					
						
							|  |  |  |             compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {} | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    template <class A> | 
					
						
							|  |  |  |    explicit compressed_pair_3(const A& val) | 
					
						
							|  |  |  |    { | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), static_cast<T2*>(this)); | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2001-01-10 12:21:30 +00:00
										 |  |  |    compressed_pair_3(const ::boost::compressed_pair<T1,T2>& x) | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |       : T1(x.first()), T2(x.second()) {} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    first_reference       first()       { return *this; } | 
					
						
							|  |  |  |    first_const_reference first() const { return *this; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return *this; } | 
					
						
							|  |  |  |    second_const_reference second() const { return *this; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair_3& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       // no need to swap empty base classes:
 | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // T1 == T2, and empty
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair_4 : T1 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair_4() : T1() {} | 
					
						
							| 
									
										
										
										
											2004-01-26 11:29:07 +00:00
										 |  |  |             compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {} | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    // only one single argument constructor since T1 == T2
 | 
					
						
							| 
									
										
										
										
											2004-01-26 11:29:07 +00:00
										 |  |  |    explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {} | 
					
						
							| 
									
										
										
										
											2001-01-20 21:59:55 +00:00
										 |  |  |    compressed_pair_4(const ::boost::compressed_pair<T1,T2>& x) | 
					
						
							| 
									
										
										
										
											2004-01-26 11:29:07 +00:00
										 |  |  |       : T1(x.first()), m_second(x.second()) {} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    first_reference       first()       { return *this; } | 
					
						
							|  |  |  |    first_const_reference first() const { return *this; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-26 11:29:07 +00:00
										 |  |  |    second_reference       second()       { return m_second; } | 
					
						
							|  |  |  |    second_const_reference second() const { return m_second; } | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair_4& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       // no need to swap empty base classes:
 | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2004-01-26 11:29:07 +00:00
										 |  |  | private: | 
					
						
							|  |  |  |    T2 m_second; | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // T1 == T2, not empty
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair_5 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    T1 _first; | 
					
						
							|  |  |  |    T2 _second; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair_5() : _first(), _second() {} | 
					
						
							|  |  |  |             compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {} | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    // only one single argument constructor since T1 == T2
 | 
					
						
							| 
									
										
										
										
											2001-01-10 12:21:30 +00:00
										 |  |  |    explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {} | 
					
						
							|  |  |  |    compressed_pair_5(const ::boost::compressed_pair<T1,T2>& c)  | 
					
						
							|  |  |  |       : _first(c.first()), _second(c.second()) {} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    first_reference       first()       { return _first; } | 
					
						
							|  |  |  |    first_const_reference first() const { return _first; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return _second; } | 
					
						
							|  |  |  |    second_const_reference second() const { return _second; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair_5& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       using std::swap; | 
					
						
							|  |  |  |       swap(_first, y._first); | 
					
						
							|  |  |  |       swap(_second, y._second); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <bool e1, bool e2, bool same> | 
					
						
							|  |  |  | struct compressed_pair_chooser | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class T1, class T2> | 
					
						
							|  |  |  |    struct rebind | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       typedef compressed_pair_0<T1, T2> type; | 
					
						
							|  |  |  |    }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct compressed_pair_chooser<false, true, false> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class T1, class T2> | 
					
						
							|  |  |  |    struct rebind | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       typedef compressed_pair_1<T1, T2> type; | 
					
						
							|  |  |  |    }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct compressed_pair_chooser<true, false, false> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class T1, class T2> | 
					
						
							|  |  |  |    struct rebind | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       typedef compressed_pair_2<T1, T2> type; | 
					
						
							|  |  |  |    }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct compressed_pair_chooser<true, true, false> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class T1, class T2> | 
					
						
							|  |  |  |    struct rebind | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       typedef compressed_pair_3<T1, T2> type; | 
					
						
							|  |  |  |    }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct compressed_pair_chooser<true, true, true> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class T1, class T2> | 
					
						
							|  |  |  |    struct rebind | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       typedef compressed_pair_4<T1, T2> type; | 
					
						
							|  |  |  |    }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct compressed_pair_chooser<false, false, true> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    template <class T1, class T2> | 
					
						
							|  |  |  |    struct rebind | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       typedef compressed_pair_5<T1, T2> type; | 
					
						
							|  |  |  |    }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | struct compressed_pair_traits | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    typedef compressed_pair_chooser<is_empty<T1>::value, is_empty<T2>::value, is_same<T1,T2>::value> chooser; | 
					
						
							|  |  |  |    typedef typename chooser::template rebind<T1, T2> bound_type; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef typename bound_type::type type; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair : public detail::compressed_pair_traits<T1, T2>::type | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    typedef typename detail::compressed_pair_traits<T1, T2>::type base_type; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair() : base_type() {} | 
					
						
							|  |  |  |             compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {} | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  |    template <class A> | 
					
						
							|  |  |  |    explicit compressed_pair(const A& x) : base_type(x){} | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    first_reference       first()       { return base_type::first(); } | 
					
						
							|  |  |  |    first_const_reference first() const { return base_type::first(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return base_type::second(); } | 
					
						
							|  |  |  |    second_const_reference second() const { return base_type::second(); } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    x.swap(y); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | // no partial specialisation, no member templates:
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | class compressed_pair | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |    T1 _first; | 
					
						
							|  |  |  |    T2 _second; | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |    typedef T1                                                 first_type; | 
					
						
							|  |  |  |    typedef T2                                                 second_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::param_type       first_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::param_type      second_param_type; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::reference        first_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::reference       second_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<first_type>::const_reference  first_const_reference; | 
					
						
							|  |  |  |    typedef typename call_traits<second_type>::const_reference second_const_reference; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             compressed_pair() : _first(), _second() {} | 
					
						
							|  |  |  |             compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {} | 
					
						
							|  |  |  |    explicit compressed_pair(first_param_type x) : _first(x), _second() {} | 
					
						
							| 
									
										
										
										
											2000-07-24 17:59:52 +00:00
										 |  |  |    // can't define this in case T1 == T2:
 | 
					
						
							|  |  |  |    // explicit compressed_pair(second_param_type y) : _first(), _second(y) {}
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    first_reference       first()       { return _first; } | 
					
						
							|  |  |  |    first_const_reference first() const { return _first; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    second_reference       second()       { return _second; } | 
					
						
							|  |  |  |    second_const_reference second() const { return _second; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    void swap(compressed_pair& y) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       using std::swap; | 
					
						
							|  |  |  |       swap(_first, y._first); | 
					
						
							|  |  |  |       swap(_second, y._second); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class T1, class T2> | 
					
						
							|  |  |  | inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    x.swap(y); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-03 11:47:24 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-07 16:04:40 +00:00
										 |  |  | } // boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // BOOST_OB_COMPRESSED_PAIR_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-07 10:53:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-12-21 12:27:22 +00:00
										 |  |  | 
 |