Subject: [Boost-bugs] [Boost C++ Libraries] #2130: De-pessimize compilation complexity for get<N> et. al.
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2008-07-19 23:55:47
#2130: De-pessimize compilation complexity for get<N> et. al.
--------------------------+-------------------------------------------------
Reporter: dave | Owner: jefffaust
Type: Bugs | Status: new
Milestone: Boost 1.36.0 | Component: tuple
Version: Boost 1.35.0 | Severity: Problem
Keywords: |
--------------------------+-------------------------------------------------
With some hints from Stephen Watanabe, I came up with the following proof-
of-concept, which avoids the O(N^2) instantiation behavior of
{{{get<0>(t)}}}, {{{get<1>(t)}}}, ... {{{get<N>(t)}}}.
Seems to me that Boost.Tuple code is pretty old and crufty, and we could
improve it a lot even for broken compilers. If we're going to "ship" a
TR1, it ought to be best-of-breed, right?
{{{
#!cpp
// Copyright David Abrahams 2008. Distributed under the Boost
// Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <cassert>
template <unsigned N>
struct tuple_drop_front
{
template <class Tuple> // compute resultant tuple
struct result_
{
typedef typename
tuple_drop_front<N-1>::template
result_<Tuple>::type::tail_type
type;
};
template <class Tuple>
typename result_<Tuple>::type const&
operator()(Tuple const& x) const
{
return tuple_drop_front<N-1>()(x).tail;
}
template <class Tuple>
typename result_<Tuple>::type&
operator()(Tuple& x) const
{
return tuple_drop_front<N-1>()(x).tail;
}
};
template <>
struct tuple_drop_front<0>
{
template <class Tuple>
struct result_
{
typedef Tuple type;
};
template <class Tuple>
Tuple const&
operator()(Tuple const& x) const
{
return x;
}
template <class Tuple>
Tuple&
operator()(Tuple& x) const
{
return x;
}
};
template <unsigned N, class Tuple>
typename tuple_drop_front<N>::template result_<Tuple>::type::head_type&
get(Tuple& t)
{
return tuple_drop_front<N>()(t).head;
}
template <unsigned N, class Tuple>
typename tuple_drop_front<N>::template result_<Tuple>::type::head_type
const&
get(Tuple const& t)
{
return tuple_drop_front<N>()(t).head;
}
struct null_type {};
template <class HT, class TT = null_type>
struct cons
{
cons() : head(), tail() {}
template <class T, class U>
cons(T const& x, U const& y) : head(x), tail(y) {}
template <class T, class U>
cons(T& x, U& y) : head(x), tail(y) {}
template <class T, class U>
cons(T const& x, U& y) : head(x), tail(y) {}
template <class T, class U>
cons(T& x, U const& y) : head(x), tail(y) {}
template <class T>
cons(T const& x) : head(x), tail() {}
typedef HT head_type;
HT head;
typedef TT tail_type;
TT tail;
};
int main()
{
assert( get<0>( cons<int>(42) ) == 42 );
assert( get<0>( cons<int, cons<long> >(42, 10) ) == 42 );
assert( get<1>( cons<int, cons<long> >(42, 10) ) == 10 );
assert( get<0>( cons<int, cons<long, cons<char> > >(42, 3) ) == 42 );
assert( get<1>( cons<int, cons<long, cons<char> > >(42, 3) ) == 3 );
assert( get<2>( cons<int, cons<long, cons<char> > >(42, 3) ) == 0 );
}
}}}
-- Ticket URL: <http://svn.boost.org/trac/boost/ticket/2130> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:49:58 UTC