made "ingnore" a const object to avoid linker errors

[SVN r20449]
This commit is contained in:
Joel de Guzman
2003-10-21 23:25:17 +00:00
parent c8e03a518b
commit 9734556efe
2 changed files with 233 additions and 239 deletions

View File

@ -3,36 +3,36 @@
// Copyright (C) 1999, 2000 Jaakko J<>rvi (jaakko.jarvi@cs.utu.fi) // Copyright (C) 1999, 2000 Jaakko J<>rvi (jaakko.jarvi@cs.utu.fi)
// //
// Permission to copy, use, sell and distribute this software is granted // Permission to copy, use, sell and distribute this software is granted
// provided this copyright notice appears in all copies. // provided this copyright notice appears in all copies.
// Permission to modify the code and to distribute modified code is granted // Permission to modify the code and to distribute modified code is granted
// provided this copyright notice appears in all copies, and a notice // provided this copyright notice appears in all copies, and a notice
// that the code was modified is included with the copyright notice. // that the code was modified is included with the copyright notice.
// //
// This software is provided "as is" without express or implied warranty, // This software is provided "as is" without express or implied warranty,
// and with no claim as to its suitability for any purpose. // and with no claim as to its suitability for any purpose.
// For more information, see http://www.boost.org // For more information, see http://www.boost.org
// Outside help: // Outside help:
// This and that, Gary Powell. // This and that, Gary Powell.
// Fixed return types for get_head/get_tail // Fixed return types for get_head/get_tail
// ( and other bugs ) per suggestion of Jens Maurer // ( and other bugs ) per suggestion of Jens Maurer
// simplified element type accessors + bug fix (Jeremy Siek) // simplified element type accessors + bug fix (Jeremy Siek)
// Several changes/additions according to suggestions by Doug Gregor, // Several changes/additions according to suggestions by Doug Gregor,
// William Kempf, Vesa Karvonen, John Max Skaller, Ed Brey, Beman Dawes, // William Kempf, Vesa Karvonen, John Max Skaller, Ed Brey, Beman Dawes,
// David Abrahams. // David Abrahams.
// Revision history: // Revision history:
// 2002 05 01 Hugo Duncan: Fix for Borland after Jaakko's previous changes // 2002 05 01 Hugo Duncan: Fix for Borland after Jaakko's previous changes
// 2002 04 18 Jaakko: tuple element types can be void or plain function // 2002 04 18 Jaakko: tuple element types can be void or plain function
// types, as long as no object is created. // types, as long as no object is created.
// Tuple objects can no hold even noncopyable types // Tuple objects can no hold even noncopyable types
// such as arrays. // such as arrays.
// 2001 10 22 John Maddock // 2001 10 22 John Maddock
// Fixes for Borland C++ // Fixes for Borland C++
// 2001 08 30 David Abrahams // 2001 08 30 David Abrahams
// Added default constructor for cons<>. // Added default constructor for cons<>.
// ----------------------------------------------------------------- // -----------------------------------------------------------------
#ifndef BOOST_TUPLE_BASIC_HPP #ifndef BOOST_TUPLE_BASIC_HPP
#define BOOST_TUPLE_BASIC_HPP #define BOOST_TUPLE_BASIC_HPP
@ -42,7 +42,7 @@
#include "boost/type_traits/cv_traits.hpp" #include "boost/type_traits/cv_traits.hpp"
#include "boost/type_traits/function_traits.hpp" #include "boost/type_traits/function_traits.hpp"
namespace boost { namespace boost {
namespace tuples { namespace tuples {
@ -66,16 +66,16 @@ template <class Then, class Else> struct IF<false, Then, Else> {
} // end detail } // end detail
// - cons forward declaration ----------------------------------------------- // - cons forward declaration -----------------------------------------------
template <class HT, class TT> struct cons; template <class HT, class TT> struct cons;
// - tuple forward declaration ----------------------------------------------- // - tuple forward declaration -----------------------------------------------
template < template <
class T0 = null_type, class T1 = null_type, class T2 = null_type, class T0 = null_type, class T1 = null_type, class T2 = null_type,
class T3 = null_type, class T4 = null_type, class T5 = null_type, class T3 = null_type, class T4 = null_type, class T5 = null_type,
class T6 = null_type, class T7 = null_type, class T8 = null_type, class T6 = null_type, class T7 = null_type, class T8 = null_type,
class T9 = null_type> class T9 = null_type>
class tuple; class tuple;
// tuple_length forward declaration // tuple_length forward declaration
template<class T> struct length; template<class T> struct length;
@ -84,7 +84,7 @@ template<class T> struct length;
namespace detail { namespace detail {
// -- generate error template, referencing to non-existing members of this // -- generate error template, referencing to non-existing members of this
// template is used to produce compilation errors intentionally // template is used to produce compilation errors intentionally
template<class T> template<class T>
class generate_error; class generate_error;
@ -108,12 +108,12 @@ struct get_class {
template<> template<>
struct get_class<0> { struct get_class<0> {
template<class RET, class HT, class TT> template<class RET, class HT, class TT>
inline static RET get(const cons<HT, TT>& t) inline static RET get(const cons<HT, TT>& t)
{ {
return t.head; return t.head;
} }
template<class RET, class HT, class TT> template<class RET, class HT, class TT>
inline static RET get(cons<HT, TT>& t) inline static RET get(cons<HT, TT>& t)
{ {
return t.head; return t.head;
@ -124,7 +124,7 @@ struct get_class<0> {
// -cons type accessors ---------------------------------------- // -cons type accessors ----------------------------------------
// typename tuples::element<N,T>::type gets the type of the // typename tuples::element<N,T>::type gets the type of the
// Nth element ot T, first element is at index 0 // Nth element ot T, first element is at index 0
// ------------------------------------------------------- // -------------------------------------------------------
@ -183,8 +183,8 @@ template <class T> struct access_traits<T&> {
typedef T& const_type; typedef T& const_type;
typedef T& non_const_type; typedef T& non_const_type;
typedef T& parameter_type; typedef T& parameter_type;
}; };
// get function for non-const cons-lists, returns a reference to the element // get function for non-const cons-lists, returns a reference to the element
@ -193,13 +193,13 @@ template<int N, class HT, class TT>
inline typename access_traits< inline typename access_traits<
typename element<N, cons<HT, TT> >::type typename element<N, cons<HT, TT> >::type
>::non_const_type >::non_const_type
get(cons<HT, TT>& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { get(cons<HT, TT>& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) {
return detail::get_class<N>::BOOST_NESTED_TEMPLATE return detail::get_class<N>::BOOST_NESTED_TEMPLATE
get< get<
typename access_traits< typename access_traits<
typename element<N, cons<HT, TT> >::type typename element<N, cons<HT, TT> >::type
>::non_const_type>(c); >::non_const_type>(c);
} }
// get function for const cons-lists, returns a const reference to // get function for const cons-lists, returns a const reference to
// the element. If the element is a reference, returns the reference // the element. If the element is a reference, returns the reference
@ -208,13 +208,13 @@ template<int N, class HT, class TT>
inline typename access_traits< inline typename access_traits<
typename element<N, cons<HT, TT> >::type typename element<N, cons<HT, TT> >::type
>::const_type >::const_type
get(const cons<HT, TT>& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { get(const cons<HT, TT>& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) {
return detail::get_class<N>::BOOST_NESTED_TEMPLATE return detail::get_class<N>::BOOST_NESTED_TEMPLATE
get< get<
typename access_traits< typename access_traits<
typename element<N, cons<HT, TT> >::type typename element<N, cons<HT, TT> >::type
>::const_type>(c); >::const_type>(c);
} }
// -- the cons template -------------------------------------------------- // -- the cons template --------------------------------------------------
namespace detail { namespace detail {
@ -235,7 +235,7 @@ template <class T> struct wrap_non_storeable_type {
>::RET type; >::RET type;
}; };
template <> struct wrap_non_storeable_type<void> { template <> struct wrap_non_storeable_type<void> {
typedef non_storeable_type<void> type; typedef non_storeable_type<void> type;
}; };
} // detail } // detail
@ -246,49 +246,49 @@ struct cons {
typedef HT head_type; typedef HT head_type;
typedef TT tail_type; typedef TT tail_type;
typedef typename typedef typename
detail::wrap_non_storeable_type<head_type>::type stored_head_type; detail::wrap_non_storeable_type<head_type>::type stored_head_type;
stored_head_type head; stored_head_type head;
tail_type tail; tail_type tail;
typename access_traits<stored_head_type>::non_const_type typename access_traits<stored_head_type>::non_const_type
get_head() { return head; } get_head() { return head; }
typename access_traits<tail_type>::non_const_type typename access_traits<tail_type>::non_const_type
get_tail() { return tail; } get_tail() { return tail; }
typename access_traits<stored_head_type>::const_type typename access_traits<stored_head_type>::const_type
get_head() const { return head; } get_head() const { return head; }
typename access_traits<tail_type>::const_type typename access_traits<tail_type>::const_type
get_tail() const { return tail; } get_tail() const { return tail; }
cons() : head(), tail() {} cons() : head(), tail() {}
// cons() : head(detail::default_arg<HT>::f()), tail() {} // cons() : head(detail::default_arg<HT>::f()), tail() {}
// the argument for head is not strictly needed, but it prevents // the argument for head is not strictly needed, but it prevents
// array type elements. This is good, since array type elements // array type elements. This is good, since array type elements
// cannot be supported properly in any case (no assignment, // cannot be supported properly in any case (no assignment,
// copy works only if the tails are exactly the same type, ...) // copy works only if the tails are exactly the same type, ...)
cons(typename access_traits<stored_head_type>::parameter_type h, cons(typename access_traits<stored_head_type>::parameter_type h,
const tail_type& t) const tail_type& t)
: head (h), tail(t) {} : head (h), tail(t) {}
template <class T1, class T2, class T3, class T4, class T5, template <class T1, class T2, class T3, class T4, class T5,
class T6, class T7, class T8, class T9, class T10> class T6, class T7, class T8, class T9, class T10>
cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5,
T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 )
: head (t1), : head (t1),
tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull()) tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull())
{} {}
template <class T2, class T3, class T4, class T5, template <class T2, class T3, class T4, class T5,
class T6, class T7, class T8, class T9, class T10> class T6, class T7, class T8, class T9, class T10>
cons( const null_type& t1, T2& t2, T3& t3, T4& t4, T5& t5, cons( const null_type& t1, T2& t2, T3& t3, T4& t4, T5& t5,
T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 )
: head (), : head (),
tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull()) tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull())
{} {}
@ -297,18 +297,18 @@ struct cons {
cons( const cons<HT2, TT2>& u ) : head(u.head), tail(u.tail) {} cons( const cons<HT2, TT2>& u ) : head(u.head), tail(u.tail) {}
template <class HT2, class TT2> template <class HT2, class TT2>
cons& operator=( const cons<HT2, TT2>& u ) { cons& operator=( const cons<HT2, TT2>& u ) {
head=u.head; tail=u.tail; return *this; head=u.head; tail=u.tail; return *this;
} }
// must define assignment operator explicitly, implicit version is // must define assignment operator explicitly, implicit version is
// illformed if HT is a reference (12.8. (12)) // illformed if HT is a reference (12.8. (12))
cons& operator=(const cons& u) { cons& operator=(const cons& u) {
head = u.head; tail = u.tail; return *this; head = u.head; tail = u.tail; return *this;
} }
template <class T1, class T2> template <class T1, class T2>
cons& operator=( const std::pair<T1, T2>& u ) { cons& operator=( const std::pair<T1, T2>& u ) {
BOOST_STATIC_ASSERT(length<cons>::value == 2); // check length = 2 BOOST_STATIC_ASSERT(length<cons>::value == 2); // check length = 2
head = u.first; tail.head = u.second; return *this; head = u.first; tail.head = u.second; return *this;
} }
@ -338,47 +338,47 @@ struct cons<HT, null_type> {
typedef null_type tail_type; typedef null_type tail_type;
typedef cons<HT, null_type> self_type; typedef cons<HT, null_type> self_type;
typedef typename typedef typename
detail::wrap_non_storeable_type<head_type>::type stored_head_type; detail::wrap_non_storeable_type<head_type>::type stored_head_type;
stored_head_type head; stored_head_type head;
typename access_traits<stored_head_type>::non_const_type
get_head() { return head; }
null_type get_tail() { return null_type(); }
typename access_traits<stored_head_type>::const_type typename access_traits<stored_head_type>::non_const_type
get_head() { return head; }
null_type get_tail() { return null_type(); }
typename access_traits<stored_head_type>::const_type
get_head() const { return head; } get_head() const { return head; }
const null_type get_tail() const { return null_type(); } const null_type get_tail() const { return null_type(); }
// cons() : head(detail::default_arg<HT>::f()) {} // cons() : head(detail::default_arg<HT>::f()) {}
cons() : head() {} cons() : head() {}
cons(typename access_traits<stored_head_type>::parameter_type h, cons(typename access_traits<stored_head_type>::parameter_type h,
const null_type& = null_type()) const null_type& = null_type())
: head (h) {} : head (h) {}
template<class T1> template<class T1>
cons(T1& t1, const null_type&, const null_type&, const null_type&, cons(T1& t1, const null_type&, const null_type&, const null_type&,
const null_type&, const null_type&, const null_type&, const null_type&, const null_type&, const null_type&,
const null_type&, const null_type&, const null_type&) const null_type&, const null_type&, const null_type&)
: head (t1) {} : head (t1) {}
cons(const null_type&, cons(const null_type&,
const null_type&, const null_type&, const null_type&, const null_type&, const null_type&, const null_type&,
const null_type&, const null_type&, const null_type&, const null_type&, const null_type&, const null_type&,
const null_type&, const null_type&, const null_type&) const null_type&, const null_type&, const null_type&)
: head () {} : head () {}
template <class HT2> template <class HT2>
cons( const cons<HT2, null_type>& u ) : head(u.head) {} cons( const cons<HT2, null_type>& u ) : head(u.head) {}
template <class HT2> template <class HT2>
cons& operator=(const cons<HT2, null_type>& u ) cons& operator=(const cons<HT2, null_type>& u )
{ head = u.head; return *this; } { head = u.head; return *this; }
// must define assignment operator explicitely, implicit version // must define assignment operator explicitely, implicit version
// is illformed if HT is a reference // is illformed if HT is a reference
cons& operator=(const cons& u) { head = u.head; return *this; } cons& operator=(const cons& u) { head = u.head; return *this; }
@ -421,12 +421,12 @@ struct length<null_type> {
namespace detail { namespace detail {
// Tuple to cons mapper -------------------------------------------------- // Tuple to cons mapper --------------------------------------------------
template <class T0, class T1, class T2, class T3, class T4, template <class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9> class T5, class T6, class T7, class T8, class T9>
struct map_tuple_to_cons struct map_tuple_to_cons
{ {
typedef cons<T0, typedef cons<T0,
typename map_tuple_to_cons<T1, T2, T3, T4, T5, typename map_tuple_to_cons<T1, T2, T3, T4, T5,
T6, T7, T8, T9, null_type>::type T6, T7, T8, T9, null_type>::type
> type; > type;
}; };
@ -442,46 +442,46 @@ struct map_tuple_to_cons<null_type, null_type, null_type, null_type, null_type,
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// -- tuple ------------------------------------------------------ // -- tuple ------------------------------------------------------
template <class T0, class T1, class T2, class T3, class T4, template <class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9> class T5, class T6, class T7, class T8, class T9>
class tuple : class tuple :
public detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type public detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type
{ {
public: public:
typedef typename typedef typename
detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type inherited; detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type inherited;
typedef typename inherited::head_type head_type; typedef typename inherited::head_type head_type;
typedef typename inherited::tail_type tail_type; typedef typename inherited::tail_type tail_type;
// access_traits<T>::parameter_type takes non-reference types as const T& // access_traits<T>::parameter_type takes non-reference types as const T&
tuple() {} tuple() {}
tuple(typename access_traits<T0>::parameter_type t0) tuple(typename access_traits<T0>::parameter_type t0)
: inherited(t0, detail::cnull(), detail::cnull(), detail::cnull(), : inherited(t0, detail::cnull(), detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull()) {} detail::cnull(), detail::cnull(), detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
typename access_traits<T1>::parameter_type t1) typename access_traits<T1>::parameter_type t1)
: inherited(t0, t1, detail::cnull(), detail::cnull(), : inherited(t0, t1, detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull()) {} detail::cnull(), detail::cnull(), detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
typename access_traits<T1>::parameter_type t1, typename access_traits<T1>::parameter_type t1,
typename access_traits<T2>::parameter_type t2) typename access_traits<T2>::parameter_type t2)
: inherited(t0, t1, t2, detail::cnull(), detail::cnull(), : inherited(t0, t1, t2, detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull()) {} detail::cnull(), detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
typename access_traits<T1>::parameter_type t1, typename access_traits<T1>::parameter_type t1,
typename access_traits<T2>::parameter_type t2, typename access_traits<T2>::parameter_type t2,
typename access_traits<T3>::parameter_type t3) typename access_traits<T3>::parameter_type t3)
: inherited(t0, t1, t2, t3, detail::cnull(), detail::cnull(), : inherited(t0, t1, t2, t3, detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(),
detail::cnull()) {} detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
@ -489,7 +489,7 @@ public:
typename access_traits<T2>::parameter_type t2, typename access_traits<T2>::parameter_type t2,
typename access_traits<T3>::parameter_type t3, typename access_traits<T3>::parameter_type t3,
typename access_traits<T4>::parameter_type t4) typename access_traits<T4>::parameter_type t4)
: inherited(t0, t1, t2, t3, t4, detail::cnull(), detail::cnull(), : inherited(t0, t1, t2, t3, t4, detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull(), detail::cnull()) {} detail::cnull(), detail::cnull(), detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
@ -498,7 +498,7 @@ public:
typename access_traits<T3>::parameter_type t3, typename access_traits<T3>::parameter_type t3,
typename access_traits<T4>::parameter_type t4, typename access_traits<T4>::parameter_type t4,
typename access_traits<T5>::parameter_type t5) typename access_traits<T5>::parameter_type t5)
: inherited(t0, t1, t2, t3, t4, t5, detail::cnull(), detail::cnull(), : inherited(t0, t1, t2, t3, t4, t5, detail::cnull(), detail::cnull(),
detail::cnull(), detail::cnull()) {} detail::cnull(), detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
@ -508,7 +508,7 @@ public:
typename access_traits<T4>::parameter_type t4, typename access_traits<T4>::parameter_type t4,
typename access_traits<T5>::parameter_type t5, typename access_traits<T5>::parameter_type t5,
typename access_traits<T6>::parameter_type t6) typename access_traits<T6>::parameter_type t6)
: inherited(t0, t1, t2, t3, t4, t5, t6, detail::cnull(), : inherited(t0, t1, t2, t3, t4, t5, t6, detail::cnull(),
detail::cnull(), detail::cnull()) {} detail::cnull(), detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
@ -519,7 +519,7 @@ public:
typename access_traits<T5>::parameter_type t5, typename access_traits<T5>::parameter_type t5,
typename access_traits<T6>::parameter_type t6, typename access_traits<T6>::parameter_type t6,
typename access_traits<T7>::parameter_type t7) typename access_traits<T7>::parameter_type t7)
: inherited(t0, t1, t2, t3, t4, t5, t6, t7, detail::cnull(), : inherited(t0, t1, t2, t3, t4, t5, t6, t7, detail::cnull(),
detail::cnull()) {} detail::cnull()) {}
tuple(typename access_traits<T0>::parameter_type t0, tuple(typename access_traits<T0>::parameter_type t0,
@ -550,16 +550,16 @@ public:
tuple(const cons<U1, U2>& p) : inherited(p) {} tuple(const cons<U1, U2>& p) : inherited(p) {}
template <class U1, class U2> template <class U1, class U2>
tuple& operator=(const cons<U1, U2>& k) { tuple& operator=(const cons<U1, U2>& k) {
inherited::operator=(k); inherited::operator=(k);
return *this; return *this;
} }
template <class U1, class U2> template <class U1, class U2>
tuple& operator=(const std::pair<U1, U2>& k) { tuple& operator=(const std::pair<U1, U2>& k) {
BOOST_STATIC_ASSERT(length<tuple>::value == 2);// check_length = 2 BOOST_STATIC_ASSERT(length<tuple>::value == 2);// check_length = 2
this->head = k.first; this->head = k.first;
this->tail.head = k.second; this->tail.head = k.second;
return *this; return *this;
} }
@ -567,8 +567,8 @@ public:
// The empty tuple // The empty tuple
template <> template <>
class tuple<null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type> : class tuple<null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type> :
public null_type public null_type
{ {
public: public:
typedef null_type inherited; typedef null_type inherited;
@ -579,7 +579,7 @@ public:
namespace detail { namespace detail {
struct swallow_assign { struct swallow_assign {
template<typename T> template<typename T>
swallow_assign& operator=(const T&) { swallow_assign& operator=(const T&) {
return *this; return *this;
@ -588,10 +588,8 @@ struct swallow_assign {
} // namespace detail } // namespace detail
// "ignore" allows tuple positions to be ignored when using "tie". // "ignore" allows tuple positions to be ignored when using "tie".
namespace { detail::swallow_assign const ignore = detail::swallow_assign();
detail::swallow_assign ignore;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// The call_traits for make_tuple // The call_traits for make_tuple
@ -603,7 +601,7 @@ namespace {
// from template<class T> foo(T& t) : make_tuple_traits<T>::type // from template<class T> foo(T& t) : make_tuple_traits<T>::type
// Conversions: // Conversions:
// T -> T, // T -> T,
// references -> compile_time_error // references -> compile_time_error
// reference_wrapper<T> -> T& // reference_wrapper<T> -> T&
// const reference_wrapper<T> -> T& // const reference_wrapper<T> -> T&
@ -612,19 +610,19 @@ namespace {
template<class T> template<class T>
struct make_tuple_traits { struct make_tuple_traits {
typedef T type; typedef T type;
// commented away, see below (JJ) // commented away, see below (JJ)
// typedef typename IF< // typedef typename IF<
// boost::is_function<T>::value, // boost::is_function<T>::value,
// T&, // T&,
// T>::RET type; // T>::RET type;
}; };
// The is_function test was there originally for plain function types, // The is_function test was there originally for plain function types,
// which can't be stored as such (we must either store them as references or // which can't be stored as such (we must either store them as references or
// pointers). Such a type could be formed if make_tuple was called with a // pointers). Such a type could be formed if make_tuple was called with a
// reference to a function. // reference to a function.
// But this would mean that a const qualified function type was formed in // But this would mean that a const qualified function type was formed in
// the make_tuple function and hence make_tuple can't take a function // the make_tuple function and hence make_tuple can't take a function
@ -639,17 +637,17 @@ struct make_tuple_traits<T&> {
typedef typename typedef typename
detail::generate_error<T&>:: detail::generate_error<T&>::
do_not_use_with_reference_type error; do_not_use_with_reference_type error;
}; };
// Arrays can't be stored as plain types; convert them to references. // Arrays can't be stored as plain types; convert them to references.
// All arrays are converted to const. This is because make_tuple takes its // All arrays are converted to const. This is because make_tuple takes its
// parameters as const T& and thus the knowledge of the potential // parameters as const T& and thus the knowledge of the potential
// non-constness of actual argument is lost. // non-constness of actual argument is lost.
template<class T, int n> struct make_tuple_traits <T[n]> { template<class T, int n> struct make_tuple_traits <T[n]> {
typedef const T (&type)[n]; typedef const T (&type)[n];
}; };
template<class T, int n> template<class T, int n>
struct make_tuple_traits<const T[n]> { struct make_tuple_traits<const T[n]> {
typedef const T (&type)[n]; typedef const T (&type)[n];
}; };
@ -658,17 +656,17 @@ template<class T, int n> struct make_tuple_traits<volatile T[n]> {
typedef const volatile T (&type)[n]; typedef const volatile T (&type)[n];
}; };
template<class T, int n> template<class T, int n>
struct make_tuple_traits<const volatile T[n]> { struct make_tuple_traits<const volatile T[n]> {
typedef const volatile T (&type)[n]; typedef const volatile T (&type)[n];
}; };
template<class T> template<class T>
struct make_tuple_traits<reference_wrapper<T> >{ struct make_tuple_traits<reference_wrapper<T> >{
typedef T& type; typedef T& type;
}; };
template<class T> template<class T>
struct make_tuple_traits<const reference_wrapper<T> >{ struct make_tuple_traits<const reference_wrapper<T> >{
typedef T& type; typedef T& type;
}; };
@ -681,20 +679,20 @@ namespace detail {
// a helper traits to make the make_tuple functions shorter (Vesa Karvonen's // a helper traits to make the make_tuple functions shorter (Vesa Karvonen's
// suggestion) // suggestion)
template < template <
class T0 = null_type, class T1 = null_type, class T2 = null_type, class T0 = null_type, class T1 = null_type, class T2 = null_type,
class T3 = null_type, class T4 = null_type, class T5 = null_type, class T3 = null_type, class T4 = null_type, class T5 = null_type,
class T6 = null_type, class T7 = null_type, class T8 = null_type, class T6 = null_type, class T7 = null_type, class T8 = null_type,
class T9 = null_type class T9 = null_type
> >
struct make_tuple_mapper { struct make_tuple_mapper {
typedef typedef
tuple<typename make_tuple_traits<T0>::type, tuple<typename make_tuple_traits<T0>::type,
typename make_tuple_traits<T1>::type, typename make_tuple_traits<T1>::type,
typename make_tuple_traits<T2>::type, typename make_tuple_traits<T2>::type,
typename make_tuple_traits<T3>::type, typename make_tuple_traits<T3>::type,
typename make_tuple_traits<T4>::type, typename make_tuple_traits<T4>::type,
typename make_tuple_traits<T5>::type, typename make_tuple_traits<T5>::type,
typename make_tuple_traits<T6>::type, typename make_tuple_traits<T6>::type,
typename make_tuple_traits<T7>::type, typename make_tuple_traits<T7>::type,
typename make_tuple_traits<T8>::type, typename make_tuple_traits<T8>::type,
typename make_tuple_traits<T9>::type> type; typename make_tuple_traits<T9>::type> type;
@ -704,7 +702,7 @@ struct make_tuple_mapper {
// -make_tuple function templates ----------------------------------- // -make_tuple function templates -----------------------------------
inline tuple<> make_tuple() { inline tuple<> make_tuple() {
return tuple<>(); return tuple<>();
} }
template<class T0> template<class T0>
@ -740,7 +738,7 @@ inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
const T4& t4) { const T4& t4) {
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type t; typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type t;
return t(t0, t1, t2, t3, t4); return t(t0, t1, t2, t3, t4);
} }
template<class T0, class T1, class T2, class T3, class T4, class T5> template<class T0, class T1, class T2, class T3, class T4, class T5>
@ -748,7 +746,7 @@ inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
const T4& t4, const T5& t5) { const T4& t4, const T5& t5) {
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type t; typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type t;
return t(t0, t1, t2, t3, t4, t5); return t(t0, t1, t2, t3, t4, t5);
} }
template<class T0, class T1, class T2, class T3, class T4, class T5, class T6> template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
@ -767,7 +765,7 @@ make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
const T4& t4, const T5& t5, const T6& t6, const T7& t7) { const T4& t4, const T5& t5, const T6& t6, const T7& t7) {
typedef typename detail::make_tuple_mapper typedef typename detail::make_tuple_mapper
<T0, T1, T2, T3, T4, T5, T6, T7>::type t; <T0, T1, T2, T3, T4, T5, T6, T7>::type t;
return t(t0, t1, t2, t3, t4, t5, t6, t7); return t(t0, t1, t2, t3, t4, t5, t6, t7);
} }
template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
@ -779,7 +777,7 @@ make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
const T8& t8) { const T8& t8) {
typedef typename detail::make_tuple_mapper typedef typename detail::make_tuple_mapper
<T0, T1, T2, T3, T4, T5, T6, T7, T8>::type t; <T0, T1, T2, T3, T4, T5, T6, T7, T8>::type t;
return t(t0, t1, t2, t3, t4, t5, t6, t7, t8); return t(t0, t1, t2, t3, t4, t5, t6, t7, t8);
} }
template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
@ -791,7 +789,7 @@ make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
const T8& t8, const T9& t9) { const T8& t8, const T9& t9) {
typedef typename detail::make_tuple_mapper typedef typename detail::make_tuple_mapper
<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type t; <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type t;
return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9); return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
} }
@ -818,46 +816,46 @@ inline tuple<T1&, T2&, T3&, T4&> tie(T1& t1, T2& t2, T3& t3, T4& t4) {
} }
template<class T1, class T2, class T3, class T4, class T5> template<class T1, class T2, class T3, class T4, class T5>
inline tuple<T1&, T2&, T3&, T4&, T5&> inline tuple<T1&, T2&, T3&, T4&, T5&>
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) { tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) {
return tuple<T1&, T2&, T3&, T4&, T5&> (t1, t2, t3, t4, t5); return tuple<T1&, T2&, T3&, T4&, T5&> (t1, t2, t3, t4, t5);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6> template<class T1, class T2, class T3, class T4, class T5, class T6>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&> inline tuple<T1&, T2&, T3&, T4&, T5&, T6&>
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) { tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) {
return tuple<T1&, T2&, T3&, T4&, T5&, T6&> (t1, t2, t3, t4, t5, t6); return tuple<T1&, T2&, T3&, T4&, T5&, T6&> (t1, t2, t3, t4, t5, t6);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7> template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&>
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) { tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) {
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> (t1, t2, t3, t4, t5, t6, t7); return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> (t1, t2, t3, t4, t5, t6, t7);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
class T8> class T8>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&> inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&>
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) { tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) {
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&> return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&>
(t1, t2, t3, t4, t5, t6, t7, t8); (t1, t2, t3, t4, t5, t6, t7, t8);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
class T8, class T9> class T8, class T9>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&> inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&>
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8,
T9& t9) { T9& t9) {
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&> return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&>
(t1, t2, t3, t4, t5, t6, t7, t8, t9); (t1, t2, t3, t4, t5, t6, t7, t8, t9);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
class T8, class T9, class T10> class T8, class T9, class T10>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&> inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&>
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8,
T9& t9, T10& t10) { T9& t9, T10& t10) {
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&> return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&>
(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
} }

View File

@ -5,28 +5,28 @@
// Copyright (C) 2001 Gary Powell (gary.powell@sierra.com) // Copyright (C) 2001 Gary Powell (gary.powell@sierra.com)
// //
// Permission to copy, use, sell and distribute this software is granted // Permission to copy, use, sell and distribute this software is granted
// provided this copyright notice appears in all copies. // provided this copyright notice appears in all copies.
// Permission to modify the code and to distribute modified code is granted // Permission to modify the code and to distribute modified code is granted
// provided this copyright notice appears in all copies, and a notice // provided this copyright notice appears in all copies, and a notice
// that the code was modified is included with the copyright notice. // that the code was modified is included with the copyright notice.
// //
// This software is provided "as is" without express or implied warranty, // This software is provided "as is" without express or implied warranty,
// and with no claim as to its suitability for any purpose. // and with no claim as to its suitability for any purpose.
// For more information, see http://www.boost.org or http://lambda.cs.utu.fi // For more information, see http://www.boost.org or http://lambda.cs.utu.fi
// Revision History // Revision History
// 14 02 01 Remove extra ';'. Also, fixed 10-parameter to make_tuple. (DG) // 14 02 01 Remove extra ';'. Also, fixed 10-parameter to make_tuple. (DG)
// 10 02 01 Fixed "null_type" constructors. // 10 02 01 Fixed "null_type" constructors.
// Implemented comparison operators globally. // Implemented comparison operators globally.
// Hide element_type_ref and element_type_const_ref. // Hide element_type_ref and element_type_const_ref.
// (DG). // (DG).
// 09 02 01 Extended to tuples of length 10. Changed comparison for // 09 02 01 Extended to tuples of length 10. Changed comparison for
// operator<() // operator<()
// to the same used by std::pair<>, added cnull_type() (GP) // to the same used by std::pair<>, added cnull_type() (GP)
// 03 02 01 Initial Version from original tuple.hpp code by JJ. (DG) // 03 02 01 Initial Version from original tuple.hpp code by JJ. (DG)
// ----------------------------------------------------------------- // -----------------------------------------------------------------
#ifndef BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP #ifndef BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
#define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP #define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP
@ -44,20 +44,20 @@ namespace boost {
namespace tuples { namespace tuples {
// null_type denotes the end of a list built with "cons" // null_type denotes the end of a list built with "cons"
struct null_type struct null_type
{ {
null_type() {} null_type() {}
null_type(const null_type&, const null_type&) {} null_type(const null_type&, const null_type&) {}
}; };
// a helper function to provide a const null_type type temporary // a helper function to provide a const null_type type temporary
inline const null_type cnull_type() { return null_type(); } inline const null_type cnull_type() { return null_type(); }
// forward declaration of tuple // forward declaration of tuple
template< template<
typename T1 = null_type, typename T1 = null_type,
typename T2 = null_type, typename T2 = null_type,
typename T3 = null_type, typename T3 = null_type,
typename T4 = null_type, typename T4 = null_type,
typename T5 = null_type, typename T5 = null_type,
typename T6 = null_type, typename T6 = null_type,
@ -114,7 +114,7 @@ namespace tuples {
static typename add_const<typename add_reference<T>::type>::type static typename add_const<typename add_reference<T>::type>::type
#else #else
static typename add_const_reference<T>::type static typename add_const_reference<T>::type
#endif #endif
execute( cons<H,T> const& u, long ) execute( cons<H,T> const& u, long )
{ {
return u.get_tail(); return u.get_tail();
@ -139,14 +139,14 @@ namespace tuples {
template <class H, class T> template <class H, class T>
void execute( cons<H,T> const&, int); void execute( cons<H,T> const&, int);
}; };
template <class Other> template <class Other>
Other const& Other const&
init_head( Other const& u, ... ) init_head( Other const& u, ... )
{ {
return u; return u;
} }
template <class H, class T> template <class H, class T>
typename add_reference<typename add_const<H>::type>::type typename add_reference<typename add_const<H>::type>::type
init_head( cons<H,T> const& u, int ) init_head( cons<H,T> const& u, int )
@ -155,7 +155,7 @@ namespace tuples {
} }
inline char**** init_head(null_type const&, int); inline char**** init_head(null_type const&, int);
} // end of namespace detail } // end of namespace detail
// cons builds a heterogenous list of types // cons builds a heterogenous list of types
@ -176,13 +176,13 @@ namespace tuples {
tail_type tail; tail_type tail;
head_ref get_head() { return head; } head_ref get_head() { return head; }
tail_ref get_tail() { return tail; } tail_ref get_tail() { return tail; }
head_cref get_head() const { return head; } head_cref get_head() const { return head; }
tail_cref get_tail() const { return tail; } tail_cref get_tail() const { return tail; }
cons() : head(), tail() {} cons() : head(), tail() {}
#if defined BOOST_MSVC #if defined BOOST_MSVC
template<typename Tail> template<typename Tail>
cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf. cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf.
@ -197,7 +197,7 @@ namespace tuples {
#else #else
template<typename T> template<typename T>
explicit cons(head_cref h, const T& t) : explicit cons(head_cref h, const T& t) :
head(h), tail(t.head, t.tail) head(h), tail(t.head, t.tail)
{ {
} }
@ -224,13 +224,13 @@ namespace tuples {
return *this; return *this;
} }
}; };
namespace detail { namespace detail {
// Determines if the parameter is null_type // Determines if the parameter is null_type
template<typename T> struct is_null_type { enum { RET = 0 }; }; template<typename T> struct is_null_type { enum { RET = 0 }; };
template<> struct is_null_type<null_type> { enum { RET = 1 }; }; template<> struct is_null_type<null_type> { enum { RET = 1 }; };
/* Build a cons structure from the given Head and Tail. If both are null_type, /* Build a cons structure from the given Head and Tail. If both are null_type,
return null_type. */ return null_type. */
template<typename Head, typename Tail> template<typename Head, typename Tail>
@ -250,15 +250,15 @@ namespace tuples {
// Map the N elements of a tuple into a cons list // Map the N elements of a tuple into a cons list
template< template<
typename T1, typename T1,
typename T2 = null_type, typename T2 = null_type,
typename T3 = null_type, typename T3 = null_type,
typename T4 = null_type, typename T4 = null_type,
typename T5 = null_type, typename T5 = null_type,
typename T6 = null_type, typename T6 = null_type,
typename T7 = null_type, typename T7 = null_type,
typename T8 = null_type, typename T8 = null_type,
typename T9 = null_type, typename T9 = null_type,
typename T10 = null_type typename T10 = null_type
> >
struct map_tuple_to_cons struct map_tuple_to_cons
@ -403,7 +403,7 @@ namespace tuples {
{ {
BOOST_STATIC_CONSTANT(int, value = 1 + length<typename Tuple::tail_type>::value); BOOST_STATIC_CONSTANT(int, value = 1 + length<typename Tuple::tail_type>::value);
}; };
template<> struct length<tuple<> > { template<> struct length<tuple<> > {
BOOST_STATIC_CONSTANT(int, value = 0); BOOST_STATIC_CONSTANT(int, value = 0);
}; };
@ -461,9 +461,9 @@ namespace tuples {
// tuple class // tuple class
template< template<
typename T1, typename T1,
typename T2, typename T2,
typename T3, typename T3,
typename T4, typename T4,
typename T5, typename T5,
typename T6, typename T6,
@ -472,7 +472,7 @@ namespace tuples {
typename T9, typename T9,
typename T10 typename T10
> >
class tuple : class tuple :
public detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::cons1 public detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::cons1
{ {
private: private:
@ -504,7 +504,7 @@ namespace tuples {
tuple() : cons1(T1(), cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10())))))))))) tuple() : cons1(T1(), cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
{} {}
tuple( tuple(
t1_cref t1, t1_cref t1,
t2_cref t2, t2_cref t2,
@ -524,9 +524,9 @@ namespace tuples {
explicit tuple(t1_cref t1) explicit tuple(t1_cref t1)
: cons1(t1, cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10())))))))))) : cons1(t1, cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
{} {}
template<typename Head, typename Tail> template<typename Head, typename Tail>
tuple(const cons<Head, Tail>& other) : tuple(const cons<Head, Tail>& other) :
cons1(other.head, other.tail) cons1(other.head, other.tail)
{ {
} }
@ -622,7 +622,7 @@ namespace tuples {
{ {
return tuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6); return tuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
} }
// Make a tuple // Make a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
inline inline
@ -671,7 +671,7 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2> template<typename T1, typename T2>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2> > detail::assign_to_pointee<T2> >
tie(T1& t1, T2& t2) tie(T1& t1, T2& t2)
{ {
@ -682,8 +682,8 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3> template<typename T1, typename T2, typename T3>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3> > detail::assign_to_pointee<T3> >
tie(T1& t1, T2& t2, T3& t3) tie(T1& t1, T2& t2, T3& t3)
{ {
@ -695,9 +695,9 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4> template<typename T1, typename T2, typename T3, typename T4>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4> > detail::assign_to_pointee<T4> >
tie(T1& t1, T2& t2, T3& t3, T4& t4) tie(T1& t1, T2& t2, T3& t3, T4& t4)
{ {
@ -710,10 +710,10 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5> template<typename T1, typename T2, typename T3, typename T4, typename T5>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4>, detail::assign_to_pointee<T4>,
detail::assign_to_pointee<T5> > detail::assign_to_pointee<T5> >
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5) tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5)
{ {
@ -727,11 +727,11 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4>, detail::assign_to_pointee<T4>,
detail::assign_to_pointee<T5>, detail::assign_to_pointee<T5>,
detail::assign_to_pointee<T6> > detail::assign_to_pointee<T6> >
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6) tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6)
{ {
@ -746,12 +746,12 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4>, detail::assign_to_pointee<T4>,
detail::assign_to_pointee<T5>, detail::assign_to_pointee<T5>,
detail::assign_to_pointee<T6>, detail::assign_to_pointee<T6>,
detail::assign_to_pointee<T7> > detail::assign_to_pointee<T7> >
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7) tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7)
{ {
@ -767,13 +767,13 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4>, detail::assign_to_pointee<T4>,
detail::assign_to_pointee<T5>, detail::assign_to_pointee<T5>,
detail::assign_to_pointee<T6>, detail::assign_to_pointee<T6>,
detail::assign_to_pointee<T7>, detail::assign_to_pointee<T7>,
detail::assign_to_pointee<T8> > detail::assign_to_pointee<T8> >
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8) tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8)
{ {
@ -790,14 +790,14 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4>, detail::assign_to_pointee<T4>,
detail::assign_to_pointee<T5>, detail::assign_to_pointee<T5>,
detail::assign_to_pointee<T6>, detail::assign_to_pointee<T6>,
detail::assign_to_pointee<T7>, detail::assign_to_pointee<T7>,
detail::assign_to_pointee<T8>, detail::assign_to_pointee<T8>,
detail::assign_to_pointee<T9> > detail::assign_to_pointee<T9> >
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9) tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9)
{ {
@ -814,15 +814,15 @@ namespace tuples {
// Tie variables into a tuple // Tie variables into a tuple
template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
inline inline
tuple<detail::assign_to_pointee<T1>, tuple<detail::assign_to_pointee<T1>,
detail::assign_to_pointee<T2>, detail::assign_to_pointee<T2>,
detail::assign_to_pointee<T3>, detail::assign_to_pointee<T3>,
detail::assign_to_pointee<T4>, detail::assign_to_pointee<T4>,
detail::assign_to_pointee<T5>, detail::assign_to_pointee<T5>,
detail::assign_to_pointee<T6>, detail::assign_to_pointee<T6>,
detail::assign_to_pointee<T7>, detail::assign_to_pointee<T7>,
detail::assign_to_pointee<T8>, detail::assign_to_pointee<T8>,
detail::assign_to_pointee<T9>, detail::assign_to_pointee<T9>,
detail::assign_to_pointee<T10> > detail::assign_to_pointee<T10> >
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9, T10 &t10) tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9, T10 &t10)
{ {
@ -837,13 +837,9 @@ namespace tuples {
detail::assign_to_pointee<T9>(&t9), detail::assign_to_pointee<T9>(&t9),
detail::assign_to_pointee<T10>(&t10)); detail::assign_to_pointee<T10>(&t10));
} }
// "ignore" allows tuple positions to be ignored when using "tie". // "ignore" allows tuple positions to be ignored when using "tie".
namespace {
#if (defined(BOOST_MSVC) && BOOST_MSVC <= 1300) || (defined(__DECCXX_VER) && __DECCXX_VER <= 60590031) detail::swallow_assign const ignore = detail::swallow_assign();
static
#endif
detail::swallow_assign ignore;
}
} // namespace tuples } // namespace tuples
} // namespace boost } // namespace boost