annotate DEPENDENCIES/generic/include/boost/iostreams/detail/resolve.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
Chris@16 2 // (C) Copyright 2003-2007 Jonathan Turkanis
Chris@16 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
Chris@16 5
Chris@16 6 // See http://www.boost.org/libs/iostreams for documentation.
Chris@16 7
Chris@16 8 #ifndef BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED
Chris@16 9 #define BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED
Chris@16 10
Chris@16 11 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
Chris@16 12 # pragma once
Chris@16 13 #endif
Chris@16 14
Chris@16 15 #include <boost/config.hpp> // partial spec, put size_t in std.
Chris@16 16 #include <cstddef> // std::size_t.
Chris@16 17 #include <boost/detail/is_incrementable.hpp>
Chris@16 18 #include <boost/detail/workaround.hpp>
Chris@16 19 #include <boost/iostreams/detail/adapter/mode_adapter.hpp>
Chris@16 20 #include <boost/iostreams/detail/adapter/output_iterator_adapter.hpp>
Chris@16 21 #include <boost/iostreams/detail/adapter/range_adapter.hpp>
Chris@16 22 #include <boost/iostreams/detail/config/gcc.hpp>
Chris@16 23 #include <boost/iostreams/detail/config/overload_resolution.hpp>
Chris@16 24 #include <boost/iostreams/detail/config/wide_streams.hpp>
Chris@16 25 #include <boost/iostreams/detail/enable_if_stream.hpp>
Chris@16 26 #include <boost/iostreams/detail/is_dereferenceable.hpp>
Chris@16 27 #include <boost/iostreams/detail/is_iterator_range.hpp>
Chris@16 28 #include <boost/iostreams/detail/select.hpp>
Chris@16 29 #include <boost/iostreams/detail/wrap_unwrap.hpp>
Chris@16 30 #include <boost/iostreams/device/array.hpp>
Chris@16 31 #include <boost/iostreams/traits.hpp>
Chris@16 32 #include <boost/mpl/and.hpp>
Chris@16 33 #include <boost/mpl/bool.hpp> // true_.
Chris@16 34 #include <boost/mpl/if.hpp>
Chris@16 35 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
Chris@16 36 # include <boost/range/iterator_range.hpp>
Chris@16 37 #endif // #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
Chris@16 38 #include <boost/type_traits/is_array.hpp>
Chris@16 39
Chris@16 40 // Must come last.
Chris@16 41 #include <boost/iostreams/detail/config/disable_warnings.hpp> // VC7.1 C4224.
Chris@16 42
Chris@16 43 namespace boost { namespace iostreams { namespace detail {
Chris@16 44
Chris@16 45 //------------------Definition of resolve-------------------------------------//
Chris@16 46
Chris@16 47 #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //-------------------------//
Chris@16 48
Chris@16 49 template<typename Mode, typename Ch, typename T>
Chris@16 50 struct resolve_traits {
Chris@16 51 typedef typename
Chris@16 52 mpl::if_<
Chris@16 53 boost::detail::is_incrementable<T>,
Chris@16 54 output_iterator_adapter<Mode, Ch, T>,
Chris@16 55 const T&
Chris@16 56 >::type type;
Chris@16 57 };
Chris@16 58
Chris@16 59 # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-------------------------------//
Chris@16 60
Chris@16 61 template<typename Mode, typename Ch, typename T>
Chris@16 62 typename resolve_traits<Mode, Ch, T>::type
Chris@16 63 resolve( const T& t
Chris@16 64 BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)
Chris@16 65
Chris@16 66 // I suspect that the compilers which require this workaround may
Chris@16 67 // be correct, but I'm not sure why :(
Chris@16 68 #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) ||\
Chris@16 69 BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205)) || \
Chris@16 70 BOOST_WORKAROUND(BOOST_IOSTREAMS_GCC, BOOST_TESTED_AT(400)) ||\
Chris@16 71 BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(1110))
Chris@16 72 /**/
Chris@16 73 , typename disable_if< is_iterator_range<T> >::type* = 0
Chris@16 74 #endif
Chris@16 75 )
Chris@16 76 {
Chris@16 77 typedef typename resolve_traits<Mode, Ch, T>::type return_type;
Chris@16 78 return return_type(t);
Chris@16 79 }
Chris@16 80
Chris@16 81 template<typename Mode, typename Ch, typename Tr>
Chris@16 82 mode_adapter< Mode, std::basic_streambuf<Ch, Tr> >
Chris@16 83 resolve(std::basic_streambuf<Ch, Tr>& sb)
Chris@16 84 { return mode_adapter< Mode, std::basic_streambuf<Ch, Tr> >(wrap(sb)); }
Chris@16 85
Chris@16 86 template<typename Mode, typename Ch, typename Tr>
Chris@16 87 mode_adapter< Mode, std::basic_istream<Ch, Tr> >
Chris@16 88 resolve(std::basic_istream<Ch, Tr>& is)
Chris@16 89 { return mode_adapter< Mode, std::basic_istream<Ch, Tr> >(wrap(is)); }
Chris@16 90
Chris@16 91 template<typename Mode, typename Ch, typename Tr>
Chris@16 92 mode_adapter< Mode, std::basic_ostream<Ch, Tr> >
Chris@16 93 resolve(std::basic_ostream<Ch, Tr>& os)
Chris@16 94 { return mode_adapter< Mode, std::basic_ostream<Ch, Tr> >(wrap(os)); }
Chris@16 95
Chris@16 96 template<typename Mode, typename Ch, typename Tr>
Chris@16 97 mode_adapter< Mode, std::basic_iostream<Ch, Tr> >
Chris@16 98 resolve(std::basic_iostream<Ch, Tr>& io)
Chris@16 99 { return mode_adapter< Mode, std::basic_iostream<Ch, Tr> >(wrap(io)); }
Chris@16 100
Chris@16 101 template<typename Mode, typename Ch, std::size_t N>
Chris@16 102 array_adapter<Mode, Ch> resolve(Ch (&array)[N])
Chris@16 103 { return array_adapter<Mode, Ch>(array); }
Chris@16 104
Chris@16 105 # if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
Chris@16 106 template<typename Mode, typename Ch, typename Iter>
Chris@16 107 range_adapter< Mode, boost::iterator_range<Iter> >
Chris@16 108 resolve(const boost::iterator_range<Iter>& rng)
Chris@16 109 { return range_adapter< Mode, boost::iterator_range<Iter> >(rng); }
Chris@16 110 # endif // #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
Chris@16 111
Chris@16 112 # else // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //---------------------//
Chris@16 113
Chris@16 114 template<typename Mode, typename Ch, typename T>
Chris@16 115 typename resolve_traits<Mode, Ch, T>::type
Chris@16 116 resolve( const T& t
Chris@16 117 BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)
Chris@16 118 #if defined(__GNUC__)
Chris@16 119 , typename disable_if< is_iterator_range<T> >::type* = 0
Chris@16 120 #endif
Chris@16 121 )
Chris@16 122 {
Chris@16 123 typedef typename resolve_traits<Mode, Ch, T>::type return_type;
Chris@16 124 return return_type(t);
Chris@16 125 }
Chris@16 126
Chris@16 127 template<typename Mode, typename Ch>
Chris@16 128 mode_adapter<Mode, std::streambuf>
Chris@16 129 resolve(std::streambuf& sb)
Chris@16 130 { return mode_adapter<Mode, std::streambuf>(wrap(sb)); }
Chris@16 131
Chris@16 132 template<typename Mode, typename Ch>
Chris@16 133 mode_adapter<Mode, std::istream>
Chris@16 134 resolve(std::istream& is)
Chris@16 135 { return mode_adapter<Mode, std::istream>(wrap(is)); }
Chris@16 136
Chris@16 137 template<typename Mode, typename Ch>
Chris@16 138 mode_adapter<Mode, std::ostream>
Chris@16 139 resolve(std::ostream& os)
Chris@16 140 { return mode_adapter<Mode, std::ostream>(wrap(os)); }
Chris@16 141
Chris@16 142 template<typename Mode, typename Ch>
Chris@16 143 mode_adapter<Mode, std::iostream>
Chris@16 144 resolve(std::iostream& io)
Chris@16 145 { return mode_adapter<Mode, std::iostream>(wrap(io)); }
Chris@16 146
Chris@16 147 template<typename Mode, typename Ch, std::size_t N>
Chris@16 148 array_adapter<Mode, Ch> resolve(Ch (&array)[N])
Chris@16 149 { return array_adapter<Mode, Ch>(array); }
Chris@16 150
Chris@16 151 template<typename Mode, typename Ch, typename Iter>
Chris@16 152 range_adapter< Mode, boost::iterator_range<Iter> >
Chris@16 153 resolve(const boost::iterator_range<Iter>& rng)
Chris@16 154 { return range_adapter< Mode, boost::iterator_range<Iter> >(rng); }
Chris@16 155
Chris@16 156 # endif // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------//
Chris@16 157 #else // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //----------------//
Chris@16 158
Chris@16 159 template<typename Mode, typename Ch, typename T>
Chris@16 160 struct resolve_traits {
Chris@16 161 // Note: test for is_iterator_range must come before test for output
Chris@16 162 // iterator.
Chris@16 163 typedef typename
Chris@16 164 iostreams::select< // Disambiguation for Tru64.
Chris@16 165 is_std_io<T>,
Chris@16 166 mode_adapter<Mode, T>,
Chris@16 167 is_iterator_range<T>,
Chris@16 168 range_adapter<Mode, T>,
Chris@16 169 is_dereferenceable<T>,
Chris@16 170 output_iterator_adapter<Mode, Ch, T>,
Chris@16 171 is_array<T>,
Chris@16 172 array_adapter<Mode, T>,
Chris@16 173 else_,
Chris@16 174 #if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
Chris@16 175 const T&
Chris@16 176 #else
Chris@16 177 T
Chris@16 178 #endif
Chris@16 179 >::type type;
Chris@16 180 };
Chris@16 181
Chris@16 182 template<typename Mode, typename Ch, typename T>
Chris@16 183 typename resolve_traits<Mode, Ch, T>::type
Chris@16 184 resolve(const T& t, mpl::true_)
Chris@16 185 { // Bad overload resolution.
Chris@16 186 typedef typename resolve_traits<Mode, Ch, T>::type return_type;
Chris@16 187 return return_type(wrap(const_cast<T&>(t)));
Chris@16 188 }
Chris@16 189
Chris@16 190 template<typename Mode, typename Ch, typename T>
Chris@16 191 typename resolve_traits<Mode, Ch, T>::type
Chris@16 192 resolve(const T& t, mpl::false_)
Chris@16 193 {
Chris@16 194 typedef typename resolve_traits<Mode, Ch, T>::type return_type;
Chris@16 195 return return_type(t);
Chris@16 196 }
Chris@16 197
Chris@16 198 template<typename Mode, typename Ch, typename T>
Chris@16 199 typename resolve_traits<Mode, Ch, T>::type
Chris@16 200 resolve(const T& t BOOST_IOSTREAMS_DISABLE_IF_STREAM(T))
Chris@16 201 { return resolve<Mode, Ch>(t, is_std_io<T>()); }
Chris@16 202
Chris@16 203 # if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && \
Chris@16 204 !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && \
Chris@16 205 !defined(__GNUC__) // ---------------------------------------------------//
Chris@16 206
Chris@16 207 template<typename Mode, typename Ch, typename T>
Chris@16 208 typename resolve_traits<Mode, Ch, T>::type
Chris@16 209 resolve(T& t, mpl::true_)
Chris@16 210 {
Chris@16 211 typedef typename resolve_traits<Mode, Ch, T>::type return_type;
Chris@16 212 return return_type(wrap(t));
Chris@16 213 }
Chris@16 214
Chris@16 215 template<typename Mode, typename Ch, typename T>
Chris@16 216 typename resolve_traits<Mode, Ch, T>::type
Chris@16 217 resolve(T& t, mpl::false_)
Chris@16 218 {
Chris@16 219 typedef typename resolve_traits<Mode, Ch, T>::type return_type;
Chris@16 220 return return_type(t);
Chris@16 221 }
Chris@16 222
Chris@16 223 template<typename Mode, typename Ch, typename T>
Chris@16 224 typename resolve_traits<Mode, Ch, T>::type
Chris@16 225 resolve(T& t BOOST_IOSTREAMS_ENABLE_IF_STREAM(T))
Chris@16 226 { return resolve<Mode, Ch>(t, is_std_io<T>()); }
Chris@16 227
Chris@16 228 # endif // Borland 5.x, VC6-7.0 or GCC 2.9x //--------------------------------//
Chris@16 229 #endif // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //---------------//
Chris@16 230
Chris@16 231 } } } // End namespaces detail, iostreams, boost.
Chris@16 232
Chris@16 233 #include <boost/iostreams/detail/config/enable_warnings.hpp> // VC7.1 4224.
Chris@16 234
Chris@16 235 #endif // BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED