// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) // (C) Copyright 2005-2007 Jonathan Turkanis // 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.) // See http://www.boost.org/libs/iostreams for documentation. // Contains implementations of get, read, put, write and seek which // check a device's mode at runtime instead of compile time. #ifndef BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED #define BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED #include #include #include #include #include #include #include #include #include #include #include // Must come last. #include // MSVC. namespace boost { namespace iostreams { namespace detail { template struct read_write_if_impl; template struct seek_if_impl; } // End namespace detail. template typename int_type_of::type get_if(T& t) { typedef typename detail::dispatch::type tag; return detail::read_write_if_impl::get(t); } template inline std::streamsize read_if(T& t, typename char_type_of::type* s, std::streamsize n) { typedef typename detail::dispatch::type tag; return detail::read_write_if_impl::read(t, s, n); } template bool put_if(T& t, typename char_type_of::type c) { typedef typename detail::dispatch::type tag; return detail::read_write_if_impl::put(t, c); } template inline std::streamsize write_if (T& t, const typename char_type_of::type* s, std::streamsize n) { typedef typename detail::dispatch::type tag; return detail::read_write_if_impl::write(t, s, n); } template inline std::streampos seek_if( T& t, stream_offset off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out ) { using namespace detail; typedef typename dispatch::type tag; return seek_if_impl::seek(t, off, way, which); } namespace detail { //------------------Specializations of read_write_if_impl---------------------// template<> struct read_write_if_impl { template static typename int_type_of::type get(T& t) { return iostreams::get(t); } template static std::streamsize read(T& t, typename char_type_of::type* s, std::streamsize n) { return iostreams::read(t, s, n); } template static bool put(T&, typename char_type_of::type) { boost::throw_exception(cant_write()); BOOST_IOSTREAMS_UNREACHABLE_RETURN(false) } template static std::streamsize write(T&, const typename char_type_of::type*, std::streamsize) { boost::throw_exception(cant_write()); BOOST_IOSTREAMS_UNREACHABLE_RETURN(0) } }; template<> struct read_write_if_impl { template static typename int_type_of::type get(T&) { boost::throw_exception(cant_read()); BOOST_IOSTREAMS_UNREACHABLE_RETURN(0) } template static std::streamsize read(T&, typename char_type_of::type*, std::streamsize) { boost::throw_exception(cant_read()); BOOST_IOSTREAMS_UNREACHABLE_RETURN(0) } template static bool put(T& t, typename char_type_of::type c) { return iostreams::put(t, c); } template static std::streamsize write( T& t, const typename char_type_of::type* s, std::streamsize n ) { return iostreams::write(t, s, n); } }; //------------------Specializations of seek_if_impl---------------------------// template<> struct seek_if_impl { template static std::streampos seek( T& t, stream_offset off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which ) { return iostreams::seek(t, off, way, which); } }; template<> struct seek_if_impl { template static std::streampos seek(T&, stream_offset, BOOST_IOS::seekdir, BOOST_IOS::openmode) { boost::throw_exception(cant_seek()); BOOST_IOSTREAMS_UNREACHABLE_RETURN(std::streampos()) } }; } // End namespace detail. } } // End namespaces iostreams, boost. #include // MSVC. #endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED