Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // compile.hpp Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_XPRESSIVE_DETAIL_STATIC_COMPILE_HPP_EAN_10_04_2005 Chris@16: #define BOOST_XPRESSIVE_DETAIL_STATIC_COMPILE_HPP_EAN_10_04_2005 Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // static_compile_impl2 Chris@16: template Chris@16: void static_compile_impl2(Xpr const &xpr, shared_ptr > const &impl, Traits const &tr) Chris@16: { Chris@16: typedef typename iterator_value::type char_type; Chris@16: impl->tracking_clear(); Chris@16: impl->traits_ = new traits_holder(tr); Chris@16: Chris@16: // "compile" the regex and wrap it in an xpression_adaptor. Chris@16: typedef xpression_visitor visitor_type; Chris@16: visitor_type visitor(tr, impl); Chris@16: intrusive_ptr const> adxpr = make_adaptor >( Chris@16: typename Grammar::template impl()( Chris@16: xpr Chris@16: , end_xpression() Chris@16: , visitor Chris@16: ) Chris@16: ); Chris@16: Chris@16: // Link and optimize the regex Chris@16: common_compile(adxpr, *impl, visitor.traits()); Chris@16: Chris@16: // References changed, update dependencies. Chris@16: impl->tracking_update(); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // pattern for imbued regexes. Chris@16: struct XpressiveLocaleModifier Chris@16: : proto::binary_expr< Chris@16: modifier_tag Chris@16: , proto::terminal > Chris@16: , proto::_ Chris@16: > Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // static_compile_impl1 Chris@16: template Chris@16: typename disable_if >::type Chris@16: static_compile_impl1(Xpr const &xpr, shared_ptr > const &impl) Chris@16: { Chris@16: // use default traits Chris@16: typedef typename iterator_value::type char_type; Chris@16: typedef typename default_regex_traits::type traits_type; Chris@16: traits_type tr; Chris@16: static_compile_impl2(xpr, impl, tr); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // static_compile_impl1 Chris@16: template Chris@16: typename enable_if >::type Chris@16: static_compile_impl1(Xpr const &xpr, shared_ptr > const &impl) Chris@16: { Chris@16: // use specified traits Chris@16: typedef typename proto::result_of::value::type>::type::locale_type locale_type; Chris@16: typedef typename regex_traits_type::type traits_type; Chris@16: static_compile_impl2(proto::right(xpr), impl, traits_type(proto::value(proto::left(xpr)).getloc())); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // static_compile Chris@16: template Chris@16: void static_compile(Xpr const &xpr, shared_ptr > const &impl) Chris@16: { Chris@16: static_compile_impl1(xpr, impl); Chris@16: } Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@16: #endif