1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- ///////////////////////////////////////////////////////////////////////////////
- // adaptor.hpp
- //
- // Copyright 2008 Eric Niebler. 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)
- // MS compatible compilers support
- namespace boost { namespace xpressive { namespace detail
- {
- ///////////////////////////////////////////////////////////////////////////////
- // xpression_adaptor
- //
- // wrap a static xpression in a matchable interface so it can be stored
- // in and invoked from a basic_regex object.
- template<typename Xpr, typename Base>
- struct xpression_adaptor
- : Base // either matchable or matchable_ex
- {
- typedef typename Base::iterator_type iterator_type;
- typedef typename iterator_value<iterator_type>::type char_type;
- Xpr xpr_;
- xpression_adaptor(Xpr const &xpr)
-
- // Ugh, gcc has an optimizer bug which elides this c'tor call
- // resulting in pure virtual function calls.
- __attribute__((__noinline__))
-
- : xpr_(xpr)
- {
- }
- virtual bool match(match_state<iterator_type> &state) const
- {
- typedef typename boost::unwrap_reference<Xpr const>::type xpr_type;
- return implicit_cast<xpr_type &>(this->xpr_).match(state);
- }
- void link(xpression_linker<char_type> &linker) const
- {
- this->xpr_.link(linker);
- }
- void peek(xpression_peeker<char_type> &peeker) const
- {
- this->xpr_.peek(peeker);
- }
- private:
- xpression_adaptor &operator =(xpression_adaptor const &);
- };
- ///////////////////////////////////////////////////////////////////////////////
- // make_adaptor
- //
- template<typename Base, typename Xpr>
- inline intrusive_ptr<Base const> make_adaptor(Xpr const &xpr)
- {
- return intrusive_ptr<Base const>(new xpression_adaptor<Xpr, Base>(xpr));
- }
- }}} // namespace boost::xpressive::detail
|