From 9734556efe653a3ee1b0361c0fefb113dd44910a Mon Sep 17 00:00:00 2001 From: Joel de Guzman Date: Tue, 21 Oct 2003 23:25:17 +0000 Subject: [PATCH] made "ingnore" a const object to avoid linker errors [SVN r20449] --- include/boost/tuple/detail/tuple_basic.hpp | 294 +++++++++--------- .../detail/tuple_basic_no_partial_spec.hpp | 178 ++++++----- 2 files changed, 233 insertions(+), 239 deletions(-) diff --git a/include/boost/tuple/detail/tuple_basic.hpp b/include/boost/tuple/detail/tuple_basic.hpp index bd7b42c..5e3727e 100644 --- a/include/boost/tuple/detail/tuple_basic.hpp +++ b/include/boost/tuple/detail/tuple_basic.hpp @@ -3,36 +3,36 @@ // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) // // 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 -// 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. // -// 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. // For more information, see http://www.boost.org // Outside help: // 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 // 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, // David Abrahams. // Revision history: // 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. // Tuple objects can no hold even noncopyable types -// such as arrays. +// such as arrays. // 2001 10 22 John Maddock // Fixes for Borland C++ // 2001 08 30 David Abrahams // Added default constructor for cons<>. -// ----------------------------------------------------------------- +// ----------------------------------------------------------------- #ifndef BOOST_TUPLE_BASIC_HPP #define BOOST_TUPLE_BASIC_HPP @@ -42,7 +42,7 @@ #include "boost/type_traits/cv_traits.hpp" #include "boost/type_traits/function_traits.hpp" - + namespace boost { namespace tuples { @@ -66,16 +66,16 @@ template struct IF { } // end detail // - cons forward declaration ----------------------------------------------- -template struct cons; +template struct cons; // - tuple forward declaration ----------------------------------------------- template < - 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 T6 = null_type, class T7 = null_type, class T8 = 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 T6 = null_type, class T7 = null_type, class T8 = null_type, class T9 = null_type> -class tuple; +class tuple; // tuple_length forward declaration template struct length; @@ -84,7 +84,7 @@ template struct length; 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 class generate_error; @@ -108,12 +108,12 @@ struct get_class { template<> struct get_class<0> { - template + template inline static RET get(const cons& t) { return t.head; } - template + template inline static RET get(cons& t) { return t.head; @@ -124,7 +124,7 @@ struct get_class<0> { // -cons type accessors ---------------------------------------- -// typename tuples::element::type gets the type of the +// typename tuples::element::type gets the type of the // Nth element ot T, first element is at index 0 // ------------------------------------------------------- @@ -183,8 +183,8 @@ template struct access_traits { typedef T& 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 @@ -193,13 +193,13 @@ template inline typename access_traits< typename element >::type >::non_const_type -get(cons& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { - return detail::get_class::BOOST_NESTED_TEMPLATE +get(cons& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { + return detail::get_class::BOOST_NESTED_TEMPLATE get< typename access_traits< typename element >::type - >::non_const_type>(c); -} + >::non_const_type>(c); +} // get function for const cons-lists, returns a const reference to // the element. If the element is a reference, returns the reference @@ -208,13 +208,13 @@ template inline typename access_traits< typename element >::type >::const_type -get(const cons& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { - return detail::get_class::BOOST_NESTED_TEMPLATE +get(const cons& c BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(int, N)) { + return detail::get_class::BOOST_NESTED_TEMPLATE get< typename access_traits< typename element >::type >::const_type>(c); -} +} // -- the cons template -------------------------------------------------- namespace detail { @@ -235,7 +235,7 @@ template struct wrap_non_storeable_type { >::RET type; }; template <> struct wrap_non_storeable_type { - typedef non_storeable_type type; + typedef non_storeable_type type; }; } // detail @@ -246,49 +246,49 @@ struct cons { typedef HT head_type; typedef TT tail_type; - typedef typename + typedef typename detail::wrap_non_storeable_type::type stored_head_type; stored_head_type head; tail_type tail; - typename access_traits::non_const_type + typename access_traits::non_const_type get_head() { return head; } - typename access_traits::non_const_type - get_tail() { return tail; } + typename access_traits::non_const_type + get_tail() { return tail; } - typename access_traits::const_type + typename access_traits::const_type get_head() const { return head; } - - typename access_traits::const_type - get_tail() const { return tail; } + + typename access_traits::const_type + get_tail() const { return tail; } cons() : head(), tail() {} // cons() : head(detail::default_arg::f()), tail() {} - // the argument for head is not strictly needed, but it prevents - // array type elements. This is good, since array type elements - // cannot be supported properly in any case (no assignment, + // the argument for head is not strictly needed, but it prevents + // array type elements. This is good, since array type elements + // cannot be supported properly in any case (no assignment, // copy works only if the tails are exactly the same type, ...) - + cons(typename access_traits::parameter_type h, const tail_type& t) - : head (h), tail(t) {} + : head (h), tail(t) {} - template - cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, - T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) - : head (t1), + cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, + T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) + : head (t1), tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull()) {} - template - cons( const null_type& t1, T2& t2, T3& t3, T4& t4, T5& t5, - T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) - : head (), + cons( const null_type& t1, T2& t2, T3& t3, T4& t4, T5& t5, + T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 ) + : head (), tail (t2, t3, t4, t5, t6, t7, t8, t9, t10, detail::cnull()) {} @@ -297,18 +297,18 @@ struct cons { cons( const cons& u ) : head(u.head), tail(u.tail) {} template - cons& operator=( const cons& u ) { - head=u.head; tail=u.tail; return *this; + cons& operator=( const cons& u ) { + 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)) - cons& operator=(const cons& u) { - head = u.head; tail = u.tail; return *this; + cons& operator=(const cons& u) { + head = u.head; tail = u.tail; return *this; } template - cons& operator=( const std::pair& u ) { + cons& operator=( const std::pair& u ) { BOOST_STATIC_ASSERT(length::value == 2); // check length = 2 head = u.first; tail.head = u.second; return *this; } @@ -338,47 +338,47 @@ struct cons { typedef null_type tail_type; typedef cons self_type; - typedef typename + typedef typename detail::wrap_non_storeable_type::type stored_head_type; stored_head_type head; - - typename access_traits::non_const_type - get_head() { return head; } - - null_type get_tail() { return null_type(); } - typename access_traits::const_type + typename access_traits::non_const_type + get_head() { return head; } + + null_type get_tail() { return null_type(); } + + typename access_traits::const_type 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::f()) {} cons() : head() {} cons(typename access_traits::parameter_type h, const null_type& = null_type()) - : head (h) {} + : head (h) {} template - cons(T1& t1, const null_type&, const null_type&, const null_type&, - 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&) : head (t1) {} - cons(const null_type&, - const null_type&, const null_type&, const null_type&, - const null_type&, const null_type&, 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&) : head () {} template cons( const cons& u ) : head(u.head) {} - + template - cons& operator=(const cons& u ) + cons& operator=(const cons& u ) { 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 cons& operator=(const cons& u) { head = u.head; return *this; } @@ -421,12 +421,12 @@ struct length { namespace detail { // Tuple to cons mapper -------------------------------------------------- -template struct map_tuple_to_cons { - typedef cons::type > type; }; @@ -442,46 +442,46 @@ struct map_tuple_to_cons -class tuple : - public detail::map_tuple_to_cons::type +class tuple : + public detail::map_tuple_to_cons::type { public: - typedef typename + typedef typename detail::map_tuple_to_cons::type inherited; typedef typename inherited::head_type head_type; - typedef typename inherited::tail_type tail_type; + typedef typename inherited::tail_type tail_type; -// access_traits::parameter_type takes non-reference types as const T& +// access_traits::parameter_type takes non-reference types as const T& tuple() {} - + tuple(typename access_traits::parameter_type t0) - : inherited(t0, detail::cnull(), detail::cnull(), detail::cnull(), - 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()) {} tuple(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1) - : inherited(t0, t1, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), + : inherited(t0, t1, detail::cnull(), detail::cnull(), + detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull()) {} tuple(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2) - : inherited(t0, t1, t2, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), + : inherited(t0, t1, t2, detail::cnull(), detail::cnull(), + detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull()) {} tuple(typename access_traits::parameter_type t0, typename access_traits::parameter_type t1, typename access_traits::parameter_type t2, typename access_traits::parameter_type t3) - : inherited(t0, t1, t2, t3, detail::cnull(), detail::cnull(), - detail::cnull(), detail::cnull(), detail::cnull(), + : inherited(t0, t1, t2, t3, detail::cnull(), detail::cnull(), + detail::cnull(), detail::cnull(), detail::cnull(), detail::cnull()) {} tuple(typename access_traits::parameter_type t0, @@ -489,7 +489,7 @@ public: typename access_traits::parameter_type t2, typename access_traits::parameter_type t3, typename access_traits::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()) {} tuple(typename access_traits::parameter_type t0, @@ -498,7 +498,7 @@ public: typename access_traits::parameter_type t3, typename access_traits::parameter_type t4, typename access_traits::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()) {} tuple(typename access_traits::parameter_type t0, @@ -508,7 +508,7 @@ public: typename access_traits::parameter_type t4, typename access_traits::parameter_type t5, typename access_traits::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()) {} tuple(typename access_traits::parameter_type t0, @@ -519,7 +519,7 @@ public: typename access_traits::parameter_type t5, typename access_traits::parameter_type t6, typename access_traits::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()) {} tuple(typename access_traits::parameter_type t0, @@ -550,16 +550,16 @@ public: tuple(const cons& p) : inherited(p) {} template - tuple& operator=(const cons& k) { - inherited::operator=(k); + tuple& operator=(const cons& k) { + inherited::operator=(k); return *this; } template - tuple& operator=(const std::pair& k) { + tuple& operator=(const std::pair& k) { BOOST_STATIC_ASSERT(length::value == 2);// check_length = 2 this->head = k.first; - this->tail.head = k.second; + this->tail.head = k.second; return *this; } @@ -567,8 +567,8 @@ public: // The empty tuple template <> -class tuple : - public null_type +class tuple : + public null_type { public: typedef null_type inherited; @@ -579,7 +579,7 @@ public: namespace detail { struct swallow_assign { - + template swallow_assign& operator=(const T&) { return *this; @@ -588,10 +588,8 @@ struct swallow_assign { } // namespace detail -// "ignore" allows tuple positions to be ignored when using "tie". -namespace { - detail::swallow_assign ignore; -} +// "ignore" allows tuple positions to be ignored when using "tie". +detail::swallow_assign const ignore = detail::swallow_assign(); // --------------------------------------------------------------------------- // The call_traits for make_tuple @@ -603,7 +601,7 @@ namespace { // from template foo(T& t) : make_tuple_traits::type // Conversions: -// T -> T, +// T -> T, // references -> compile_time_error // reference_wrapper -> T& // const reference_wrapper -> T& @@ -612,19 +610,19 @@ namespace { template struct make_tuple_traits { - typedef T type; + typedef T type; // commented away, see below (JJ) - // typedef typename IF< + // typedef typename IF< // boost::is_function::value, // T&, // 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 -// 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. // 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 @@ -639,17 +637,17 @@ struct make_tuple_traits { typedef typename detail::generate_error:: do_not_use_with_reference_type error; -}; +}; // 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 -// 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. template struct make_tuple_traits { typedef const T (&type)[n]; }; -template +template struct make_tuple_traits { typedef const T (&type)[n]; }; @@ -658,17 +656,17 @@ template struct make_tuple_traits { typedef const volatile T (&type)[n]; }; -template +template struct make_tuple_traits { typedef const volatile T (&type)[n]; }; -template +template struct make_tuple_traits >{ typedef T& type; }; -template +template struct make_tuple_traits >{ typedef T& type; }; @@ -681,20 +679,20 @@ namespace detail { // a helper traits to make the make_tuple functions shorter (Vesa Karvonen's // suggestion) template < - 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 T6 = null_type, class T7 = null_type, class T8 = 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 T6 = null_type, class T7 = null_type, class T8 = null_type, class T9 = null_type > struct make_tuple_mapper { typedef - tuple::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, - typename make_tuple_traits::type, + tuple::type, + typename make_tuple_traits::type, + typename make_tuple_traits::type, + typename make_tuple_traits::type, + typename make_tuple_traits::type, + typename make_tuple_traits::type, + typename make_tuple_traits::type, typename make_tuple_traits::type, typename make_tuple_traits::type, typename make_tuple_traits::type> type; @@ -704,7 +702,7 @@ struct make_tuple_mapper { // -make_tuple function templates ----------------------------------- inline tuple<> make_tuple() { - return tuple<>(); + return tuple<>(); } template @@ -740,7 +738,7 @@ inline typename detail::make_tuple_mapper::type make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4) { typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1, t2, t3, t4); + return t(t0, t1, t2, t3, t4); } template @@ -748,7 +746,7 @@ inline typename detail::make_tuple_mapper::type make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5) { typedef typename detail::make_tuple_mapper::type t; - return t(t0, t1, t2, t3, t4, t5); + return t(t0, t1, t2, t3, t4, t5); } template @@ -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) { typedef typename detail::make_tuple_mapper ::type t; - return t(t0, t1, t2, t3, t4, t5, t6, t7); + return t(t0, t1, t2, t3, t4, t5, t6, t7); } template::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::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 tie(T1& t1, T2& t2, T3& t3, T4& t4) { } template -inline tuple +inline tuple tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) { return tuple (t1, t2, t3, t4, t5); } template -inline tuple +inline tuple tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) { return tuple (t1, t2, t3, t4, t5, t6); } template -inline tuple +inline tuple tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) { return tuple (t1, t2, t3, t4, t5, t6, t7); } -template -inline tuple +inline tuple tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) { - return tuple + return tuple (t1, t2, t3, t4, t5, t6, t7, t8); } -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, +inline tuple +tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9) { - return tuple + return tuple (t1, t2, t3, t4, t5, t6, t7, t8, t9); } -template -inline tuple -tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, +inline tuple +tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9, T10& t10) { - return tuple + return tuple (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); } diff --git a/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp b/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp index 03a5eb8..f4cdde9 100644 --- a/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp +++ b/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp @@ -5,28 +5,28 @@ // Copyright (C) 2001 Gary Powell (gary.powell@sierra.com) // // 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 -// 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. // -// 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. -// 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) // 10 02 01 Fixed "null_type" constructors. // Implemented comparison operators globally. // Hide element_type_ref and element_type_const_ref. // (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<() // to the same used by std::pair<>, added cnull_type() (GP) // 03 02 01 Initial Version from original tuple.hpp code by JJ. (DG) -// ----------------------------------------------------------------- +// ----------------------------------------------------------------- #ifndef BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP #define BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP @@ -44,20 +44,20 @@ namespace boost { namespace tuples { // null_type denotes the end of a list built with "cons" - struct null_type + struct null_type { null_type() {} null_type(const null_type&, const null_type&) {} }; - + // a helper function to provide a const null_type type temporary inline const null_type cnull_type() { return null_type(); } // forward declaration of tuple template< - typename T1 = null_type, - typename T2 = null_type, - typename T3 = null_type, + typename T1 = null_type, + typename T2 = null_type, + typename T3 = null_type, typename T4 = null_type, typename T5 = null_type, typename T6 = null_type, @@ -114,7 +114,7 @@ namespace tuples { static typename add_const::type>::type #else static typename add_const_reference::type -#endif +#endif execute( cons const& u, long ) { return u.get_tail(); @@ -139,14 +139,14 @@ namespace tuples { template void execute( cons const&, int); }; - + template Other const& init_head( Other const& u, ... ) { return u; } - + template typename add_reference::type>::type init_head( cons const& u, int ) @@ -155,7 +155,7 @@ namespace tuples { } inline char**** init_head(null_type const&, int); - + } // end of namespace detail // cons builds a heterogenous list of types @@ -176,13 +176,13 @@ namespace tuples { tail_type tail; 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; } tail_cref get_tail() const { return tail; } cons() : head(), tail() {} - + #if defined BOOST_MSVC template cons(head_cref h /* = head_type() */, // causes MSVC 6.5 to barf. @@ -197,7 +197,7 @@ namespace tuples { #else template - explicit cons(head_cref h, const T& t) : + explicit cons(head_cref h, const T& t) : head(h), tail(t.head, t.tail) { } @@ -224,13 +224,13 @@ namespace tuples { return *this; } }; - + namespace detail { // Determines if the parameter is null_type template struct is_null_type { enum { RET = 0 }; }; template<> struct is_null_type { enum { RET = 1 }; }; - + /* Build a cons structure from the given Head and Tail. If both are null_type, return null_type. */ template @@ -250,15 +250,15 @@ namespace tuples { // Map the N elements of a tuple into a cons list template< - typename T1, - typename T2 = null_type, - typename T3 = null_type, - typename T4 = null_type, - typename T5 = null_type, - typename T6 = null_type, - typename T7 = null_type, - typename T8 = null_type, - typename T9 = null_type, + typename T1, + typename T2 = null_type, + typename T3 = null_type, + typename T4 = null_type, + typename T5 = null_type, + typename T6 = null_type, + typename T7 = null_type, + typename T8 = null_type, + typename T9 = null_type, typename T10 = null_type > struct map_tuple_to_cons @@ -403,7 +403,7 @@ namespace tuples { { BOOST_STATIC_CONSTANT(int, value = 1 + length::value); }; - + template<> struct length > { BOOST_STATIC_CONSTANT(int, value = 0); }; @@ -461,9 +461,9 @@ namespace tuples { // tuple class template< - typename T1, - typename T2, - typename T3, + typename T1, + typename T2, + typename T3, typename T4, typename T5, typename T6, @@ -472,7 +472,7 @@ namespace tuples { typename T9, typename T10 > - class tuple : + class tuple : public detail::map_tuple_to_cons::cons1 { 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( t1_cref t1, t2_cref t2, @@ -524,9 +524,9 @@ namespace tuples { 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())))))))))) {} - + template - tuple(const cons& other) : + tuple(const cons& other) : cons1(other.head, other.tail) { } @@ -622,7 +622,7 @@ namespace tuples { { return tuple(t1, t2, t3, t4, t5, t6); } - + // Make a tuple template inline @@ -671,7 +671,7 @@ namespace tuples { // Tie variables into a tuple template inline - tuple, + tuple, detail::assign_to_pointee > tie(T1& t1, T2& t2) { @@ -682,8 +682,8 @@ namespace tuples { // Tie variables into a tuple template inline - tuple, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, detail::assign_to_pointee > tie(T1& t1, T2& t2, T3& t3) { @@ -695,9 +695,9 @@ namespace tuples { // Tie variables into a tuple template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > tie(T1& t1, T2& t2, T3& t3, T4& t4) { @@ -710,10 +710,10 @@ namespace tuples { // Tie variables into a tuple template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5) { @@ -727,11 +727,11 @@ namespace tuples { // Tie variables into a tuple template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6) { @@ -746,12 +746,12 @@ namespace tuples { // Tie variables into a tuple template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > 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 template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > 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 template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > 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 template inline - tuple, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, - detail::assign_to_pointee, + tuple, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, + detail::assign_to_pointee, detail::assign_to_pointee > 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), detail::assign_to_pointee(&t10)); } - // "ignore" allows tuple positions to be ignored when using "tie". - namespace { -#if (defined(BOOST_MSVC) && BOOST_MSVC <= 1300) || (defined(__DECCXX_VER) && __DECCXX_VER <= 60590031) - static -#endif - detail::swallow_assign ignore; - } + // "ignore" allows tuple positions to be ignored when using "tie". + +detail::swallow_assign const ignore = detail::swallow_assign(); } // namespace tuples } // namespace boost