dictionary_filter.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 222 行
HPP
222 行
// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)// (C) Copyright 2003-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.#ifndef BOOST_IOSTREAMS_DICTIONARY_FILTER_HPP_INCLUDED#define BOOST_IOSTREAMS_DICTIONARY_FILTER_HPP_INCLUDED#include <algorithm> // swap.#include <cassert>#include <cstdio> // EOF.#include <iostream> // cin, cout.#include <cctype>#include <map>#include <boost/config.hpp> // BOOST_NO_STDC_NAMESPACE.#include <boost/iostreams/concepts.hpp>#include <boost/iostreams/filter/stdio.hpp>#include <boost/iostreams/operations.hpp>#ifdef BOOST_NO_STDC_NAMESPACEnamespace std { using ::isalpha; using ::isupper; using ::toupper; using ::tolower;}#endifnamespace boost { namespace iostreams { namespace example {class dictionary {public: void add(std::string key, const std::string& value); void replace(std::string& key);private: typedef std::map<std::string, std::string> map_type; void tolower(std::string& str); map_type map_;};class dictionary_stdio_filter : public stdio_filter {public: dictionary_stdio_filter(dictionary& d) : dictionary_(d) { }private: void do_filter() { using namespace std; while (true) { int c = std::cin.get(); if (c == EOF || !std::isalpha((unsigned char) c)) { dictionary_.replace(current_word_); cout.write( current_word_.data(), static_cast<std::streamsize>(current_word_.size()) ); current_word_.erase(); if (c == EOF) break; cout.put(c); } else { current_word_ += c; } } } dictionary& dictionary_; std::string current_word_;};class dictionary_input_filter : public input_filter {public: dictionary_input_filter(dictionary& d) : dictionary_(d), off_(std::string::npos), eof_(false) { } template<typename Source> int get(Source& src) { // Handle unfinished business. if (off_ != std::string::npos && off_ < current_word_.size()) return current_word_[off_++]; if (off_ == current_word_.size()) { current_word_.erase(); off_ = std::string::npos; } if (eof_) return EOF; // Compute curent word. while (true) { int c; if ((c = iostreams::get(src)) == WOULD_BLOCK) return WOULD_BLOCK; if (c == EOF || !std::isalpha((unsigned char) c)) { dictionary_.replace(current_word_); off_ = 0; if (c == EOF) eof_ = true; else current_word_ += c; break; } else { current_word_ += c; } } return this->get(src); // Note: current_word_ is not empty. } template<typename Source> void close(Source&) { current_word_.erase(); off_ = std::string::npos; eof_ = false; }private: dictionary& dictionary_; std::string current_word_; std::string::size_type off_; bool eof_;};class dictionary_output_filter : public output_filter {public: typedef std::map<std::string, std::string> map_type; dictionary_output_filter(dictionary& d) : dictionary_(d), off_(std::string::npos) { } template<typename Sink> bool put(Sink& dest, int c) { if (off_ != std::string::npos && !write_current_word(dest)) return false; if (!std::isalpha((unsigned char) c)) { dictionary_.replace(current_word_); off_ = 0; } current_word_ += c; return true; } template<typename Sink> void close(Sink& dest) { // Reset current_word_ and off_, saving old values. std::string current_word; std::string::size_type off = 0; current_word.swap(current_word_); std::swap(off, off_); // Write remaining characters to dest. if (off == std::string::npos) { dictionary_.replace(current_word); off = 0; } if (!current_word.empty()) iostreams::write( dest, current_word.data() + off, static_cast<std::streamsize>(current_word.size() - off) ); }private: template<typename Sink> bool write_current_word(Sink& dest) { using namespace std; std::streamsize amt = static_cast<std::streamsize>(current_word_.size() - off_); std::streamsize result = iostreams::write(dest, current_word_.data() + off_, amt); if (result == amt) { current_word_.erase(); off_ = string::npos; return true; } else { off_ += result; return false; } } dictionary& dictionary_; std::string current_word_; std::string::size_type off_;};//------------------Implementation of dictionary------------------------------//inline void dictionary::add(std::string key, const std::string& value){ tolower(key); map_[key] = value;}inline void dictionary::replace(std::string& key){ using namespace std; string copy(key); tolower(copy); map_type::iterator it = map_.find(key); if (it == map_.end()) return; string& value = it->second; if (!value.empty() && !key.empty() && std::isupper((unsigned char) key[0])) value[0] = std::toupper((unsigned char) value[0]); key = value; return;}inline void dictionary::tolower(std::string& str){ for (std::string::size_type z = 0, len = str.size(); z < len; ++z) str[z] = std::tolower((unsigned char) str[z]);}} } } // End namespaces example, iostreams, boost.#endif // #ifndef BOOST_IOSTREAMS_DICTIONARY_FILTER_HPP_INCLUDED
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?