Chris@16: // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) Chris@16: // (C) Copyright 2003-2007 Jonathan Turkanis Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) Chris@16: Chris@16: // See http://www.boost.org/libs/iostreams for documentation. Chris@16: Chris@16: #ifndef BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED Chris@16: #define BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include // partial spec, put size_t in std. Chris@16: #include // std::size_t. Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include // true_. Chris@16: #include Chris@16: #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) Chris@16: # include Chris@16: #endif // #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) Chris@16: #include Chris@16: Chris@16: // Must come last. Chris@16: #include // VC7.1 C4224. Chris@16: Chris@16: namespace boost { namespace iostreams { namespace detail { Chris@16: Chris@16: //------------------Definition of resolve-------------------------------------// Chris@16: Chris@16: #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //-------------------------// Chris@16: Chris@16: template Chris@16: struct resolve_traits { Chris@16: typedef typename Chris@16: mpl::if_< Chris@16: boost::detail::is_incrementable, Chris@16: output_iterator_adapter, Chris@16: const T& Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-------------------------------// Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve( const T& t Chris@16: BOOST_IOSTREAMS_DISABLE_IF_STREAM(T) Chris@16: Chris@16: // I suspect that the compilers which require this workaround may Chris@16: // be correct, but I'm not sure why :( Chris@16: #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) ||\ Chris@16: BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205)) || \ Chris@16: BOOST_WORKAROUND(BOOST_IOSTREAMS_GCC, BOOST_TESTED_AT(400)) ||\ Chris@16: BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(1110)) Chris@16: /**/ Chris@16: , typename disable_if< is_iterator_range >::type* = 0 Chris@16: #endif Chris@16: ) Chris@16: { Chris@16: typedef typename resolve_traits::type return_type; Chris@16: return return_type(t); Chris@16: } Chris@16: Chris@16: template Chris@16: mode_adapter< Mode, std::basic_streambuf > Chris@16: resolve(std::basic_streambuf& sb) Chris@16: { return mode_adapter< Mode, std::basic_streambuf >(wrap(sb)); } Chris@16: Chris@16: template Chris@16: mode_adapter< Mode, std::basic_istream > Chris@16: resolve(std::basic_istream& is) Chris@16: { return mode_adapter< Mode, std::basic_istream >(wrap(is)); } Chris@16: Chris@16: template Chris@16: mode_adapter< Mode, std::basic_ostream > Chris@16: resolve(std::basic_ostream& os) Chris@16: { return mode_adapter< Mode, std::basic_ostream >(wrap(os)); } Chris@16: Chris@16: template Chris@16: mode_adapter< Mode, std::basic_iostream > Chris@16: resolve(std::basic_iostream& io) Chris@16: { return mode_adapter< Mode, std::basic_iostream >(wrap(io)); } Chris@16: Chris@16: template Chris@16: array_adapter resolve(Ch (&array)[N]) Chris@16: { return array_adapter(array); } Chris@16: Chris@16: # if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) Chris@16: template Chris@16: range_adapter< Mode, boost::iterator_range > Chris@16: resolve(const boost::iterator_range& rng) Chris@16: { return range_adapter< Mode, boost::iterator_range >(rng); } Chris@16: # endif // #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) Chris@16: Chris@16: # else // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //---------------------// Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve( const T& t Chris@16: BOOST_IOSTREAMS_DISABLE_IF_STREAM(T) Chris@16: #if defined(__GNUC__) Chris@16: , typename disable_if< is_iterator_range >::type* = 0 Chris@16: #endif Chris@16: ) Chris@16: { Chris@16: typedef typename resolve_traits::type return_type; Chris@16: return return_type(t); Chris@16: } Chris@16: Chris@16: template Chris@16: mode_adapter Chris@16: resolve(std::streambuf& sb) Chris@16: { return mode_adapter(wrap(sb)); } Chris@16: Chris@16: template Chris@16: mode_adapter Chris@16: resolve(std::istream& is) Chris@16: { return mode_adapter(wrap(is)); } Chris@16: Chris@16: template Chris@16: mode_adapter Chris@16: resolve(std::ostream& os) Chris@16: { return mode_adapter(wrap(os)); } Chris@16: Chris@16: template Chris@16: mode_adapter Chris@16: resolve(std::iostream& io) Chris@16: { return mode_adapter(wrap(io)); } Chris@16: Chris@16: template Chris@16: array_adapter resolve(Ch (&array)[N]) Chris@16: { return array_adapter(array); } Chris@16: Chris@16: template Chris@16: range_adapter< Mode, boost::iterator_range > Chris@16: resolve(const boost::iterator_range& rng) Chris@16: { return range_adapter< Mode, boost::iterator_range >(rng); } Chris@16: Chris@16: # endif // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------// Chris@16: #else // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //----------------// Chris@16: Chris@16: template Chris@16: struct resolve_traits { Chris@16: // Note: test for is_iterator_range must come before test for output Chris@16: // iterator. Chris@16: typedef typename Chris@16: iostreams::select< // Disambiguation for Tru64. Chris@16: is_std_io, Chris@16: mode_adapter, Chris@16: is_iterator_range, Chris@16: range_adapter, Chris@16: is_dereferenceable, Chris@16: output_iterator_adapter, Chris@16: is_array, Chris@16: array_adapter, Chris@16: else_, Chris@16: #if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) Chris@16: const T& Chris@16: #else Chris@16: T Chris@16: #endif Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve(const T& t, mpl::true_) Chris@16: { // Bad overload resolution. Chris@16: typedef typename resolve_traits::type return_type; Chris@16: return return_type(wrap(const_cast(t))); Chris@16: } Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve(const T& t, mpl::false_) Chris@16: { Chris@16: typedef typename resolve_traits::type return_type; Chris@16: return return_type(t); Chris@16: } Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve(const T& t BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)) Chris@16: { return resolve(t, is_std_io()); } Chris@16: Chris@16: # if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && \ Chris@16: !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && \ Chris@16: !defined(__GNUC__) // ---------------------------------------------------// Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve(T& t, mpl::true_) Chris@16: { Chris@16: typedef typename resolve_traits::type return_type; Chris@16: return return_type(wrap(t)); Chris@16: } Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve(T& t, mpl::false_) Chris@16: { Chris@16: typedef typename resolve_traits::type return_type; Chris@16: return return_type(t); Chris@16: } Chris@16: Chris@16: template Chris@16: typename resolve_traits::type Chris@16: resolve(T& t BOOST_IOSTREAMS_ENABLE_IF_STREAM(T)) Chris@16: { return resolve(t, is_std_io()); } Chris@16: Chris@16: # endif // Borland 5.x, VC6-7.0 or GCC 2.9x //--------------------------------// Chris@16: #endif // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //---------------// Chris@16: Chris@16: } } } // End namespaces detail, iostreams, boost. Chris@16: Chris@16: #include // VC7.1 4224. Chris@16: Chris@16: #endif // BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED