shell_comments_filter.hpp

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

HPP
223
字号
// (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.// Adapted from an example of James Kanze, with suggestions from Peter Dimov.// See http://www.gabi-soft.fr/codebase-en.html.#ifndef BOOST_IOSTREAMS_SHELL_COMMENTS_FILTER_HPP_INCLUDED#define BOOST_IOSTREAMS_SHELL_COMMENTS_FILTER_HPP_INCLUDED#include <cassert>#include <cstdio>    // EOF.#include <iostream>  // cin, cout.#include <boost/iostreams/concepts.hpp>#include <boost/iostreams/detail/ios.hpp>  // BOOST_IOS.#include <boost/iostreams/filter/stdio.hpp>#include <boost/iostreams/operations.hpp>namespace boost { namespace iostreams { namespace example {class shell_comments_stdio_filter : public stdio_filter {public:    explicit shell_comments_stdio_filter(char comment_char = '#')        : comment_char_(comment_char)        { }private:    void do_filter()    {        bool  skip = false;        int   c;        while ((c = std::cin.get()) != EOF) {            skip = c == comment_char_ ?                true :                c == '\n' ?                    false :                    skip;            if (!skip)                std::cout.put(c);        }    }    char comment_char_;};class shell_comments_input_filter : public input_filter {public:    explicit shell_comments_input_filter(char comment_char = '#')        : comment_char_(comment_char), skip_(false)        { }    template<typename Source>    int get(Source& src)    {        int c;        while (true) {            if ((c = boost::iostreams::get(src)) == EOF || c == WOULD_BLOCK)                break;            skip_ = c == comment_char_ ?                true :                c == '\n' ?                    false :                    skip_;            if (!skip_)                break;        }        return c;    }    template<typename Source>    void close(Source&) { skip_ = false; }private:    char comment_char_;    bool skip_;};class shell_comments_output_filter : public output_filter {public:    explicit shell_comments_output_filter(char comment_char = '#')        : comment_char_(comment_char), skip_(false)        { }    template<typename Sink>    bool put(Sink& dest, int c)    {        skip_ = c == comment_char_ ?            true :            c == '\n' ?                false :                skip_;        if (skip_)            return true;        return iostreams::put(dest, c);    }    template<typename Source>    void close(Source&) { skip_ = false; }private:    char comment_char_;    bool skip_;};class shell_comments_dual_use_filter : public dual_use_filter {public:    explicit shell_comments_dual_use_filter(char comment_char = '#')        : comment_char_(comment_char), skip_(false)        { }    template<typename Source>    int get(Source& src)    {        int c;        while (true) {            if ((c = boost::iostreams::get(src)) == EOF || c == WOULD_BLOCK)                break;            skip_ = c == comment_char_ ?                true :                c == '\n' ?                    false :                    skip_;            if (!skip_)                break;        }        return c;    }    template<typename Sink>    bool put(Sink& dest, int c)    {        skip_ = c == comment_char_ ?            true :            c == '\n' ?                false :                skip_;        if (skip_)            return true;        return iostreams::put(dest, c);    }    template<typename Device>    void close(Device&, BOOST_IOS::openmode) { skip_ = false; }private:    char comment_char_;    bool skip_;};class shell_comments_multichar_input_filter : public multichar_input_filter {public:    explicit shell_comments_multichar_input_filter(char comment_char = '#')        : comment_char_(comment_char), skip_(false)        { }    template<typename Source>    std::streamsize read(Source& src, char* s, std::streamsize n)    {        for (std::streamsize z = 0; z < n; ++z) {            int c;            while (true) {                if ((c = boost::iostreams::get(src)) == EOF)                    return z != 0 ? z : -1;                else if (c == WOULD_BLOCK)                    return z;                skip_ = c == comment_char_ ?                    true :                    c == '\n' ?                        false :                        skip_;                if (!skip_)                    break;            }            s[z] = c;        }        return n;    }    template<typename Source>    void close(Source&) { skip_ = false; }private:    char comment_char_;    bool skip_;};class shell_comments_multichar_output_filter : public multichar_output_filter {public:    explicit shell_comments_multichar_output_filter(char comment_char = '#')        : comment_char_(comment_char), skip_(false)        { }    template<typename Sink>    std::streamsize write(Sink& dest, const char* s, std::streamsize n)    {        std::streamsize z;        for (z = 0; z < n; ++z) {            int c = s[z];            skip_ = c == comment_char_ ?                true :                c == '\n' ?                    false :                    skip_;            if (skip_)                continue;            if (!iostreams::put(dest, c))                break;        }        return z;    }    template<typename Source>    void close(Source&) { skip_ = false; }private:    char comment_char_;    bool skip_;};} } }       // End namespaces example, iostreams, boost.#endif // #ifndef BOOST_IOSTREAMS_SHELL_COMMENTS_FILTER_HPP_INCLUDED

⌨️ 快捷键说明

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