Use an inline function instead of a static object for boost::tuples::ignore, avoiding problems with the ODR and Borland precompiled headers. Fixes #2656

[SVN r62684]
This commit is contained in:
Steven Watanabe
2010-06-09 19:00:56 +00:00
parent 1b07c1a2d4
commit 7b6203747a

View File

@ -599,18 +599,21 @@ public:
// Swallows any assignment (by Doug Gregor) // Swallows any assignment (by Doug Gregor)
namespace detail { namespace detail {
struct swallow_assign;
typedef void (detail::swallow_assign::*ignore_t)();
struct swallow_assign { struct swallow_assign {
swallow_assign(ignore_t(*)(ignore_t)) {}
template<typename T> template<typename T>
swallow_assign const& operator=(const T&) const { swallow_assign const& operator=(const T&) const {
return *this; return *this;
} }
}; };
} // namespace detail } // namespace detail
// "ignore" allows tuple positions to be ignored when using "tie". // "ignore" allows tuple positions to be ignored when using "tie".
detail::swallow_assign const ignore = detail::swallow_assign(); inline detail::ignore_t ignore(detail::ignore_t) { return 0; }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// The call_traits for make_tuple // The call_traits for make_tuple
@ -692,6 +695,10 @@ struct make_tuple_traits<const reference_wrapper<T> >{
typedef T& type; typedef T& type;
}; };
template<>
struct make_tuple_traits<detail::ignore_t(detail::ignore_t)> {
typedef detail::swallow_assign type;
};
@ -813,71 +820,131 @@ make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3,
return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9); return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
} }
namespace detail {
template<class T>
struct tie_traits {
typedef T& type;
};
template<>
struct tie_traits<ignore_t(ignore_t)> {
typedef swallow_assign type;
};
template<>
struct tie_traits<void> {
typedef null_type type;
};
template <
class T0 = void, class T1 = void, class T2 = void,
class T3 = void, class T4 = void, class T5 = void,
class T6 = void, class T7 = void, class T8 = void,
class T9 = void
>
struct tie_mapper {
typedef
tuple<typename tie_traits<T0>::type,
typename tie_traits<T1>::type,
typename tie_traits<T2>::type,
typename tie_traits<T3>::type,
typename tie_traits<T4>::type,
typename tie_traits<T5>::type,
typename tie_traits<T6>::type,
typename tie_traits<T7>::type,
typename tie_traits<T8>::type,
typename tie_traits<T9>::type> type;
};
}
// Tie function templates ------------------------------------------------- // Tie function templates -------------------------------------------------
template<class T1> template<class T0>
inline tuple<T1&> tie(T1& t1) { inline typename detail::tie_mapper<T0>::type
return tuple<T1&> (t1); tie(T0& t0) {
typedef typename detail::tie_mapper<T0>::type t;
return t(t0);
} }
template<class T1, class T2> template<class T0, class T1>
inline tuple<T1&, T2&> tie(T1& t1, T2& t2) { inline typename detail::tie_mapper<T0, T1>::type
return tuple<T1&, T2&> (t1, t2); tie(T0& t0, T1& t1) {
typedef typename detail::tie_mapper<T0, T1>::type t;
return t(t0, t1);
} }
template<class T1, class T2, class T3> template<class T0, class T1, class T2>
inline tuple<T1&, T2&, T3&> tie(T1& t1, T2& t2, T3& t3) { inline typename detail::tie_mapper<T0, T1, T2>::type
return tuple<T1&, T2&, T3&> (t1, t2, t3); tie(T0& t0, T1& t1, T2& t2) {
typedef typename detail::tie_mapper<T0, T1, T2>::type t;
return t(t0, t1, t2);
} }
template<class T1, class T2, class T3, class T4> template<class T0, class T1, class T2, class T3>
inline tuple<T1&, T2&, T3&, T4&> tie(T1& t1, T2& t2, T3& t3, T4& t4) { inline typename detail::tie_mapper<T0, T1, T2, T3>::type
return tuple<T1&, T2&, T3&, T4&> (t1, t2, t3, t4); tie(T0& t0, T1& t1, T2& t2, T3& t3) {
typedef typename detail::tie_mapper<T0, T1, T2, T3>::type t;
return t(t0, t1, t2, t3);
} }
template<class T1, class T2, class T3, class T4, class T5> template<class T0, class T1, class T2, class T3, class T4>
inline tuple<T1&, T2&, T3&, T4&, T5&> inline typename detail::tie_mapper<T0, T1, T2, T3, T4>::type
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) { tie(T0& t0, T1& t1, T2& t2, T3& t3,
return tuple<T1&, T2&, T3&, T4&, T5&> (t1, t2, t3, t4, t5); T4& t4) {
typedef typename detail::tie_mapper<T0, T1, T2, T3, T4>::type t;
return t(t0, t1, t2, t3, t4);
} }
template<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>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&> inline typename detail::tie_mapper<T0, T1, T2, T3, T4, T5>::type
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) { tie(T0& t0, T1& t1, T2& t2, T3& t3,
return tuple<T1&, T2&, T3&, T4&, T5&, T6&> (t1, t2, t3, t4, t5, t6); T4& t4, T5& t5) {
typedef typename detail::tie_mapper<T0, T1, T2, T3, T4, T5>::type t;
return t(t0, t1, t2, t3, t4, t5);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7> template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> inline typename detail::tie_mapper<T0, T1, T2, T3, T4, T5, T6>::type
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) { tie(T0& t0, T1& t1, T2& t2, T3& t3,
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> (t1, t2, t3, t4, t5, t6, t7); T4& t4, T5& t5, T6& t6) {
typedef typename detail::tie_mapper
<T0, T1, T2, T3, T4, T5, T6>::type t;
return t(t0, t1, t2, t3, t4, t5, t6);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
class T8> class T7>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&> inline typename detail::tie_mapper<T0, T1, T2, T3, T4, T5, T6, T7>::type
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) { tie(T0& t0, T1& t1, T2& t2, T3& t3,
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&> T4& t4, T5& t5, T6& t6, T7& t7) {
(t1, t2, t3, t4, t5, t6, t7, t8); typedef typename detail::tie_mapper
<T0, T1, T2, T3, T4, T5, T6, T7>::type t;
return t(t0, t1, t2, t3, t4, t5, t6, t7);
} }
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
class T8, class T9> class T7, class T8>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&> inline typename detail::tie_mapper
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, <T0, T1, T2, T3, T4, T5, T6, T7, T8>::type
T9& t9) { tie(T0& t0, T1& t1, T2& t2, T3& t3,
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&> T4& t4, T5& t5, T6& t6, T7& t7,
(t1, t2, t3, t4, t5, t6, t7, t8, t9); T8& t8) {
typedef typename detail::tie_mapper
<T0, T1, T2, T3, T4, T5, T6, T7, T8>::type t;
return t(t0, 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 T0, class T1, class T2, class T3, class T4, class T5, class T6,
class T8, class T9, class T10> class T7, class T8, class T9>
inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&> inline typename detail::tie_mapper
tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type
T9& t9, T10& t10) { tie(T0& t0, T1& t1, T2& t2, T3& t3,
return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&> T4& t4, T5& t5, T6& t6, T7& t7,
(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10); T8& t8, T9& t9) {
typedef typename detail::tie_mapper
<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type t;
return t(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
} }
} // end of namespace tuples } // end of namespace tuples