diff options
Diffstat (limited to 'src/third_party/boost-1.69.0/boost/iostreams/filter/regex.hpp')
-rw-r--r-- | src/third_party/boost-1.69.0/boost/iostreams/filter/regex.hpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/third_party/boost-1.69.0/boost/iostreams/filter/regex.hpp b/src/third_party/boost-1.69.0/boost/iostreams/filter/regex.hpp new file mode 100644 index 00000000000..e943553c61b --- /dev/null +++ b/src/third_party/boost-1.69.0/boost/iostreams/filter/regex.hpp @@ -0,0 +1,98 @@ +// (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_REGEX_FILTER_HPP_INCLUDED +#define BOOST_IOSTREAMS_REGEX_FILTER_HPP_INCLUDED + +#if defined(_MSC_VER) +# pragma once +#endif + +#include <memory> // allocator. +#include <boost/function.hpp> +#include <boost/iostreams/filter/aggregate.hpp> +#include <boost/iostreams/pipeline.hpp> +#include <boost/regex.hpp> + +namespace boost { namespace iostreams { + +template< typename Ch, + typename Tr = regex_traits<Ch>, + typename Alloc = std::allocator<Ch> > +class basic_regex_filter : public aggregate_filter<Ch, Alloc> { +private: + typedef aggregate_filter<Ch, Alloc> base_type; +public: + typedef typename base_type::char_type char_type; + typedef typename base_type::category category; + typedef std::basic_string<Ch> string_type; + typedef basic_regex<Ch, Tr> regex_type; + typedef regex_constants::match_flag_type flag_type; + typedef match_results<const Ch*> match_type; + typedef function1<string_type, const match_type&> formatter; + + basic_regex_filter( const regex_type& re, + const formatter& replace, + flag_type flags = regex_constants::match_default ) + : re_(re), replace_(replace), flags_(flags) { } + basic_regex_filter( const regex_type& re, + const string_type& fmt, + flag_type flags = regex_constants::match_default, + flag_type fmt_flags = regex_constants::format_default ) + : re_(re), replace_(simple_formatter(fmt, fmt_flags)), flags_(flags) { } + basic_regex_filter( const regex_type& re, + const char_type* fmt, + flag_type flags = regex_constants::match_default, + flag_type fmt_flags = regex_constants::format_default ) + : re_(re), replace_(simple_formatter(fmt, fmt_flags)), flags_(flags) { } +private: + typedef typename base_type::vector_type vector_type; + void do_filter(const vector_type& src, vector_type& dest) + { + typedef regex_iterator<const Ch*, Ch, Tr> iterator; + if (src.empty()) + return; + iterator first(&src[0], &src[0] + src.size(), re_, flags_); + iterator last; + const Ch* suffix = 0; + for (; first != last; ++first) { + dest.insert( dest.end(), + first->prefix().first, + first->prefix().second ); + string_type replacement = replace_(*first); + dest.insert( dest.end(), + replacement.begin(), + replacement.end() ); + suffix = first->suffix().first; + } + if (suffix) { + dest.insert(dest.end(), suffix, &src[0] + src.size()); + } else { + dest.insert(dest.end(), &src[0], &src[0] + src.size()); + } + } + struct simple_formatter { + simple_formatter(const string_type& fmt, flag_type fmt_flags) + : fmt_(fmt), fmt_flags_(fmt_flags) { } + string_type operator() (const match_type& match) const + { return match.format(fmt_, fmt_flags_); } + string_type fmt_; + flag_type fmt_flags_; + }; + regex_type re_; + formatter replace_; + flag_type flags_; +}; +BOOST_IOSTREAMS_PIPABLE(basic_regex_filter, 3) + +typedef basic_regex_filter<char> regex_filter; +typedef basic_regex_filter<wchar_t> wregex_filter; + + +} } // End namespaces iostreams, boost. + +#endif // #ifndef BOOST_IOSTREAMS_REGEX_FILTER_HPP_INCLUDED |