📄 restrict_impl.hpp
字号:
namespace detail {//--------------Implementation of restricted_indirect_device------------------//template<typename Device>restricted_indirect_device<Device>::restricted_indirect_device (param_type dev, stream_offset off, stream_offset len) : device_adapter<Device>(dev), beg_(off), pos_(off), end_(len != -1 ? off + len : -1){ if (len < -1 || off < 0) throw BOOST_IOSTREAMS_FAILURE("bad offset"); iostreams::skip(this->component(), off);}template<typename Device>inline std::streamsize restricted_indirect_device<Device>::read (char_type* s, std::streamsize n){ using namespace std; std::streamsize amt = end_ != -1 ? (std::min) (n, static_cast<std::streamsize>(end_ - pos_)) : n; std::streamsize result = iostreams::read(this->component(), s, amt); if (result != -1) pos_ += result; return result;}template<typename Device>inline std::streamsize restricted_indirect_device<Device>::write (const char_type* s, std::streamsize n){ if (end_ != -1 && pos_ + n >= end_) bad_write(); std::streamsize result = iostreams::write(this->component(), s, n); pos_ += result; return result;}template<typename Device>std::streampos restricted_indirect_device<Device>::seek (stream_offset off, BOOST_IOS::seekdir way){ stream_offset next; if (way == BOOST_IOS::beg) { next = beg_ + off; } else if (way == BOOST_IOS::cur) { next = pos_ + off; } else if (end_ != -1) { next = end_ + off; } else { // Restriction is half-open; seek relative to the actual end. pos_ = iostreams::seek(this->component(), off, BOOST_IOS::end); if (pos_ < beg_) bad_seek(); return offset_to_position(pos_ - beg_); } if (next < beg_ || end_ != -1 && next >= end_) bad_seek(); pos_ = iostreams::seek(this->component(), next - pos_, BOOST_IOS::cur); return offset_to_position(pos_ - beg_);}//--------------Implementation of restricted_direct_device--------------------//template<typename Device>restricted_direct_device<Device>::restricted_direct_device (const Device& dev, stream_offset off, stream_offset len) : device_adapter<Device>(dev), beg_(0), end_(0){ std::pair<char_type*, char_type*> seq = sequence(is_convertible<category, input>()); if ( off < 0 || len < -1 || len != -1 && off + len > seq.second - seq.first ) { throw BOOST_IOSTREAMS_FAILURE("bad offset"); } beg_ = seq.first + off; end_ = len != -1 ? seq.first + off + len : seq.second;}template<typename Device>typename restricted_direct_device<Device>::pair_typerestricted_direct_device<Device>::input_sequence(){ BOOST_STATIC_ASSERT((is_convertible<category, input>::value)); return std::make_pair(beg_, end_);}template<typename Device>typename restricted_direct_device<Device>::pair_typerestricted_direct_device<Device>::output_sequence(){ BOOST_STATIC_ASSERT((is_convertible<category, output>::value)); return std::make_pair(beg_, end_);}template<typename Device>typename restricted_direct_device<Device>::pair_typerestricted_direct_device<Device>::sequence(mpl::true_){ return iostreams::input_sequence(this->component()); }template<typename Device>typename restricted_direct_device<Device>::pair_typerestricted_direct_device<Device>::sequence(mpl::false_){ return iostreams::output_sequence(this->component()); }//--------------Implementation of restricted_filter---------------------------//template<typename Filter>restricted_filter<Filter>::restricted_filter (const Filter& flt, stream_offset off, stream_offset len) : filter_adapter<Filter>(flt), beg_(off), pos_(off), end_(len != -1 ? off + len : -1), open_(false){ if (len < -1 || off < 0) throw BOOST_IOSTREAMS_FAILURE("bad offset");}} // End namespace detail.} } // End namespaces iostreams, boost.#elif defined(BOOST_IOSTREAMS_RESTRICT)namespace boost { namespace iostreams {//--------------Implementation of restrict/slice------------------------------//// Note: The following workarounds are patterned after resolve.hpp. It has not// yet been confirmed that they are necessary.# ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //------------------------//# ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //------------------------------//template<typename T>restriction<T> BOOST_IOSTREAMS_RESTRICT( const T& t, stream_offset off, stream_offset len = -1 BOOST_IOSTREAMS_DISABLE_IF_STREAM(T) ){ return restriction<T>(t, off, len); }template<typename Ch, typename Tr>restriction< std::basic_streambuf<Ch, Tr> >BOOST_IOSTREAMS_RESTRICT( std::basic_streambuf<Ch, Tr>& sb, stream_offset off, stream_offset len = -1 ){ return restriction< std::basic_streambuf<Ch, Tr> >(sb, off, len); }template<typename Ch, typename Tr>restriction< std::basic_istream<Ch, Tr> >BOOST_IOSTREAMS_RESTRICT (std::basic_istream<Ch, Tr>& is, stream_offset off, stream_offset len = -1){ return restriction< std::basic_istream<Ch, Tr> >(is, off, len); }template<typename Ch, typename Tr>restriction< std::basic_ostream<Ch, Tr> >BOOST_IOSTREAMS_RESTRICT (std::basic_ostream<Ch, Tr>& os, stream_offset off, stream_offset len = -1){ return restriction< std::basic_ostream<Ch, Tr> >(os, off, len); }template<typename Ch, typename Tr>restriction< std::basic_iostream<Ch, Tr> >BOOST_IOSTREAMS_RESTRICT (std::basic_iostream<Ch, Tr>& io, stream_offset off, stream_offset len = -1){ return restriction< std::basic_iostream<Ch, Tr> >(io, off, len); }# else // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------//template<typename T>restriction<T> BOOST_IOSTREAMS_RESTRICT( const T& t, stream_offset off, stream_offset len = -1 BOOST_IOSTREAMS_DISABLE_IF_STREAM(T) ){ return restriction<T>(t, off, len); }restriction<std::streambuf> BOOST_IOSTREAMS_RESTRICT (std::streambuf& sb, stream_offset off, stream_offset len = -1){ return restriction<std::streambuf>(sb, off, len); }restriction<std::istream> BOOST_IOSTREAMS_RESTRICT (std::istream<Ch, Tr>& is, stream_offset off, stream_offset len = -1){ return restriction<std::istream>(is, off, len); }restriction<std::ostream> BOOST_IOSTREAMS_RESTRICT (std::ostream<Ch, Tr>& os, stream_offset off, stream_offset len = -1){ return restriction<std::ostream>(os, off, len); }restriction<std::iostream> BOOST_IOSTREAMS_RESTRICT (std::iostream<Ch, Tr>& io, stream_offset off, stream_offset len = -1){ return restriction<std::iostream>(io, off, len); }# endif // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-------------------//# else // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //---------------//template<typename T>restriction<T> BOOST_IOSTREAMS_RESTRICT (const T& t, stream_offset off, stream_offset len, mpl::true_){ // Bad overload resolution. return restriction<T>(const_cast<T&>(t, off, len));}template<typename T>restriction<T> BOOST_IOSTREAMS_RESTRICT (const T& t, stream_offset off, stream_offset len, mpl::false_){ return restriction<T>(t, off, len); }template<typename T>restriction<T> BOOST_IOSTREAMS_RESTRICT( const T& t, stream_offset off, stream_offset len = -1 BOOST_IOSTREAMS_DISABLE_IF_STREAM(T) ){ return BOOST_IOSTREAMS_RESTRICT(t, off, len, is_std_io<T>()); }# if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && \ !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && \ !defined(__GNUC__) // ---------------------------------------------------//template<typename T>restriction<T>BOOST_IOSTREAMS_RESTRICT(T& t, stream_offset off, stream_offset len = -1){ return restriction<T>(t, off, len); }# endif // Borland 5.x, VC6-7.0 or GCC 2.9x //-------------------------------//# endif // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //--------------//} } // End namespaces iostreams, boost.#endif // #if !defined(BOOST_IOSTREAMS_RESTRICT_IMPL_HPP_INCLUDED) ...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -