⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 restrict_impl.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
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 + -