williamr@2: // tuple.hpp - Boost Tuple Library -------------------------------------- williamr@2: williamr@2: // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: // For more information, see http://www.boost.org williamr@2: williamr@2: // ----------------------------------------------------------------- williamr@2: williamr@2: #ifndef BOOST_TUPLE_HPP williamr@2: #define BOOST_TUPLE_HPP williamr@2: williamr@2: #if defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730 williamr@2: // Work around a compiler bug. williamr@2: // boost::python::tuple has to be seen by the compiler before the williamr@2: // boost::tuple class template. williamr@2: namespace boost { namespace python { class tuple; }} williamr@2: #endif williamr@2: williamr@2: #include "boost/config.hpp" williamr@2: #include "boost/static_assert.hpp" williamr@2: williamr@2: #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) williamr@2: // The MSVC version williamr@2: #include "boost/tuple/detail/tuple_basic_no_partial_spec.hpp" williamr@2: williamr@2: #else williamr@2: // other compilers williamr@2: #include "boost/ref.hpp" williamr@2: #include "boost/tuple/detail/tuple_basic.hpp" williamr@2: williamr@2: #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: using tuples::tuple; williamr@2: using tuples::make_tuple; williamr@2: using tuples::tie; williamr@2: #if !defined(BOOST_NO_USING_TEMPLATE) williamr@2: using tuples::get; williamr@2: #elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) williamr@2: // williamr@2: // The "using tuples::get" statement causes the williamr@2: // Borland compiler to ICE, use forwarding williamr@2: // functions instead: williamr@2: // williamr@2: template williamr@2: inline typename tuples::access_traits< williamr@2: typename tuples::element >::type williamr@2: >::non_const_type williamr@2: get(tuples::cons& c) { williamr@2: return tuples::get(c); williamr@2: } williamr@2: // get function for const cons-lists, returns a const reference to williamr@2: // the element. If the element is a reference, returns the reference williamr@2: // as such (that is, can return a non-const reference) williamr@2: template williamr@2: inline typename tuples::access_traits< williamr@2: typename tuples::element >::type williamr@2: >::const_type williamr@2: get(const tuples::cons& c) { williamr@2: return tuples::get(c); williamr@2: } williamr@2: #else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: // williamr@2: // MSVC, using declarations don't mix with templates well, williamr@2: // so use forwarding functions instead: williamr@2: // williamr@2: template williamr@2: typename tuples::detail::element_ref >::RET williamr@2: get(tuples::cons& t, tuples::detail::workaround_holder* = 0) williamr@2: { williamr@2: return tuples::detail::get_class::get(t); williamr@2: } williamr@2: williamr@2: template williamr@2: typename tuples::detail::element_const_ref >::RET williamr@2: get(const tuples::cons& t, tuples::detail::workaround_holder* = 0) williamr@2: { williamr@2: return tuples::detail::get_class::get(t); williamr@2: } williamr@2: #endif // BOOST_NO_USING_TEMPLATE williamr@2: williamr@2: } // end namespace boost williamr@2: williamr@2: williamr@2: #endif // BOOST_TUPLE_HPP