filters.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 187 行

HPP
187
字号
// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)// (C) Copyright 2004-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 the definitions of several constants used by the test program.#ifndef BOOST_IOSTREAMS_TEST_FILTERS_HPP_INCLUDED#define BOOST_IOSTREAMS_TEST_FILTERS_HPP_INCLUDED#include <boost/config.hpp>                 #include <algorithm>                            // min.#include <cctype>                               // to_upper, to_lower.#include <cstdlib>                              // to_upper, to_lower (VC6).#include <cstddef>                              // ptrdiff_t.#include <vector>#include <boost/iostreams/char_traits.hpp>#include <boost/iostreams/concepts.hpp>#include <boost/iostreams/constants.hpp>#include <boost/iostreams/detail/buffer.hpp>#include <boost/iostreams/detail/iostream.hpp>  // seekdir, streamsize.#include <boost/iostreams/detail/streambuf.hpp>#include <boost/iostreams/operations.hpp>#include <boost/iostreams/pipeline.hpp>#include <boost/type_traits/is_convertible.hpp>#ifdef BOOST_NO_STDC_NAMESPACEnamespace std { using ::toupper; using ::tolower; }#endif// Must come last.#include <boost/iostreams/detail/config/disable_warnings.hpp>namespace boost { namespace iostreams { namespace test {struct toupper_filter : public input_filter {    template<typename Source>    int get(Source& s)     {         int c = boost::iostreams::get(s);        return c != EOF && c != WOULD_BLOCK ?            std::toupper((unsigned char) c) :            c;    }};BOOST_IOSTREAMS_PIPABLE(toupper_filter, 0)struct tolower_filter : public output_filter {    template<typename Sink>    bool put(Sink& s, char c)    {         return boost::iostreams::put(                   s, (char) std::tolower((unsigned char) c)               );     }};BOOST_IOSTREAMS_PIPABLE(tolower_filter, 0)struct toupper_multichar_filter : public multichar_input_filter {    template<typename Source>    std::streamsize read(Source& s, char* buf, std::streamsize n)    {        std::streamsize result = boost::iostreams::read(s, buf, n);        if (result == -1)            return -1;        for (int z = 0; z < result; ++z)            buf[z] = (char) std::toupper((unsigned char) buf[z]);        return result;    }};BOOST_IOSTREAMS_PIPABLE(toupper_multichar_filter, 0)struct tolower_multichar_filter : public multichar_output_filter {    template<typename Sink>    std::streamsize write(Sink& s, const char* buf, std::streamsize n)    {        std::streamsize result;        for (result = 0; result < n; ++result) {            char c = (char) std::tolower((unsigned char) buf[result]);            if (!boost::iostreams::put(s, c))                break;        }        return result;    }};BOOST_IOSTREAMS_PIPABLE(tolower_multichar_filter, 0)struct padding_filter : dual_use_filter {    explicit padding_filter(char pad_char)         : pad_char_(pad_char), use_pad_char_(false), eof_(false)        { }    template<typename Source>    int get(Source& src)     {         int result;        if (use_pad_char_) {            result = eof_ ? EOF : pad_char_;            use_pad_char_ = false;        } else {            result = boost::iostreams::get(src);            if (result != EOF && result != WOULD_BLOCK)                use_pad_char_ = true;            eof_ = result == EOF;        }        return result;    }    template<typename Sink>    bool put(Sink& s, char c)     {         if (use_pad_char_) {            if (!boost::iostreams::put(s, pad_char_))                return false;            use_pad_char_ = false;        }         if (!boost::iostreams::put(s, c))            return false;        if (!boost::iostreams::put(s, pad_char_))            use_pad_char_ = true;        return true;    }    char  pad_char_;    bool  use_pad_char_;    bool  eof_;};BOOST_IOSTREAMS_PIPABLE(padding_filter, 0)struct flushable_output_filter {    typedef char char_type;    struct category         : output_filter_tag,           flushable_tag        { };    template<typename Sink>    bool put(Sink&, char c)     {         buf_.push_back(c);         return true;     }    template<typename Sink>    bool flush(Sink& s)     {         if (!buf_.empty()) {            boost::iostreams::write(s, &buf_[0], (std::streamsize) buf_.size());            buf_.clear();        }        return true;    }    std::vector<char> buf_;};BOOST_IOSTREAMS_PIPABLE(flushable_output_filter, 0)struct identity_seekable_filter : filter<seekable> {    template<typename Source>    int get(Source& s) { return boost::iostreams::get(s); }    template<typename Sink>    bool put(Sink& s, char c) { return boost::iostreams::put(s, c); }    template<typename Device>    std::streampos seek(Device& d, stream_offset off, BOOST_IOS::seekdir way)    { return boost::iostreams::seek(d, off, way); }};BOOST_IOSTREAMS_PIPABLE(identity_seekable_filter, 0)struct identity_seekable_multichar_filter : multichar_filter<seekable> {    template<typename Source>    std::streamsize read(Source& s, char* buf, std::streamsize n)    { return boost::iostreams::read(s, buf, n); }    template<typename Sink>    std::streamsize write(Sink& s, const char* buf, std::streamsize n)    { return boost::iostreams::write(s, buf, n); }    template<typename Device>    std::streampos seek(Device& d, stream_offset off, BOOST_IOS::seekdir way)    { return boost::iostreams::seek(d, off, way); }};BOOST_IOSTREAMS_PIPABLE(identity_seekable_multichar_filter, 0)} } } // End namespaces detail, iostreams, boost.#include <boost/iostreams/detail/config/enable_warnings.hpp>#endif // #ifndef BOOST_IOSTREAMS_TEST_FILTERS_HPP_INCLUDED

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?