/usr/include/boost/iostreams/checked_operations.hpp is in libboost1.55-dev 1.55.0+dfsg-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | // (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 <boost/iostreams/categories.hpp>
#include <boost/iostreams/detail/dispatch.hpp>
#include <boost/iostreams/detail/error.hpp>
#include <boost/iostreams/detail/config/unreachable_return.hpp>
#include <boost/iostreams/get.hpp>
#include <boost/iostreams/put.hpp>
#include <boost/iostreams/read.hpp>
#include <boost/iostreams/seek.hpp>
#include <boost/iostreams/traits.hpp>
#include <boost/iostreams/write.hpp>
#include <boost/throw_exception.hpp>
// Must come last.
#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
namespace boost { namespace iostreams {
namespace detail {
template<typename T>
struct read_write_if_impl;
template<typename T>
struct seek_if_impl;
} // End namespace detail.
template<typename T>
typename int_type_of<T>::type get_if(T& t)
{
typedef typename detail::dispatch<T, input, output>::type tag;
return detail::read_write_if_impl<tag>::get(t);
}
template<typename T>
inline std::streamsize
read_if(T& t, typename char_type_of<T>::type* s, std::streamsize n)
{
typedef typename detail::dispatch<T, input, output>::type tag;
return detail::read_write_if_impl<tag>::read(t, s, n);
}
template<typename T>
bool put_if(T& t, typename char_type_of<T>::type c)
{
typedef typename detail::dispatch<T, output, input>::type tag;
return detail::read_write_if_impl<tag>::put(t, c);
}
template<typename T>
inline std::streamsize write_if
(T& t, const typename char_type_of<T>::type* s, std::streamsize n)
{
typedef typename detail::dispatch<T, output, input>::type tag;
return detail::read_write_if_impl<tag>::write(t, s, n);
}
template<typename T>
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<T, random_access, any_tag>::type tag;
return seek_if_impl<tag>::seek(t, off, way, which);
}
namespace detail {
//------------------Specializations of read_write_if_impl---------------------//
template<>
struct read_write_if_impl<input> {
template<typename T>
static typename int_type_of<T>::type get(T& t)
{ return iostreams::get(t); }
template<typename T>
static std::streamsize
read(T& t, typename char_type_of<T>::type* s, std::streamsize n)
{ return iostreams::read(t, s, n); }
template<typename T>
static bool put(T&, typename char_type_of<T>::type)
{ boost::throw_exception(cant_write());
BOOST_IOSTREAMS_UNREACHABLE_RETURN(false) }
template<typename T>
static std::streamsize
write(T&, const typename char_type_of<T>::type*, std::streamsize)
{ boost::throw_exception(cant_write());
BOOST_IOSTREAMS_UNREACHABLE_RETURN(0) }
};
template<>
struct read_write_if_impl<output> {
template<typename T>
static typename int_type_of<T>::type get(T&)
{ boost::throw_exception(cant_read());
BOOST_IOSTREAMS_UNREACHABLE_RETURN(0) }
template<typename T>
static std::streamsize
read(T&, typename char_type_of<T>::type*, std::streamsize)
{ boost::throw_exception(cant_read());
BOOST_IOSTREAMS_UNREACHABLE_RETURN(0) }
template<typename T>
static bool put(T& t, typename char_type_of<T>::type c)
{ return iostreams::put(t, c); }
template<typename T>
static std::streamsize
write( T& t, const typename char_type_of<T>::type* s,
std::streamsize n )
{ return iostreams::write(t, s, n); }
};
//------------------Specializations of seek_if_impl---------------------------//
template<>
struct seek_if_impl<random_access> {
template<typename T>
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<any_tag> {
template<typename T>
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 <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED
|