annotate DEPENDENCIES/generic/include/boost/xpressive/detail/static/compile.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 ///////////////////////////////////////////////////////////////////////////////
Chris@16 2 // compile.hpp
Chris@16 3 //
Chris@16 4 // Copyright 2008 Eric Niebler. Distributed under the Boost
Chris@16 5 // Software License, Version 1.0. (See accompanying file
Chris@16 6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7
Chris@16 8 #ifndef BOOST_XPRESSIVE_DETAIL_STATIC_COMPILE_HPP_EAN_10_04_2005
Chris@16 9 #define BOOST_XPRESSIVE_DETAIL_STATIC_COMPILE_HPP_EAN_10_04_2005
Chris@16 10
Chris@16 11 // MS compatible compilers support #pragma once
Chris@101 12 #if defined(_MSC_VER)
Chris@16 13 # pragma once
Chris@16 14 #endif
Chris@16 15
Chris@16 16 #include <boost/mpl/bool.hpp>
Chris@16 17 #include <boost/iterator/iterator_traits.hpp>
Chris@16 18 #include <boost/proto/core.hpp>
Chris@16 19 #include <boost/xpressive/regex_traits.hpp>
Chris@16 20 #include <boost/xpressive/detail/core/regex_impl.hpp>
Chris@16 21 #include <boost/xpressive/detail/core/linker.hpp>
Chris@16 22 #include <boost/xpressive/detail/core/optimize.hpp>
Chris@16 23 #include <boost/xpressive/detail/core/adaptor.hpp>
Chris@16 24 #include <boost/xpressive/detail/core/matcher/end_matcher.hpp>
Chris@16 25 #include <boost/xpressive/detail/static/static.hpp>
Chris@16 26 #include <boost/xpressive/detail/static/visitor.hpp>
Chris@16 27 #include <boost/xpressive/detail/static/grammar.hpp>
Chris@16 28
Chris@16 29 namespace boost { namespace xpressive { namespace detail
Chris@16 30 {
Chris@16 31
Chris@16 32 ///////////////////////////////////////////////////////////////////////////////
Chris@16 33 // static_compile_impl2
Chris@16 34 template<typename Xpr, typename BidiIter, typename Traits>
Chris@16 35 void static_compile_impl2(Xpr const &xpr, shared_ptr<regex_impl<BidiIter> > const &impl, Traits const &tr)
Chris@16 36 {
Chris@16 37 typedef typename iterator_value<BidiIter>::type char_type;
Chris@16 38 impl->tracking_clear();
Chris@16 39 impl->traits_ = new traits_holder<Traits>(tr);
Chris@16 40
Chris@16 41 // "compile" the regex and wrap it in an xpression_adaptor.
Chris@16 42 typedef xpression_visitor<BidiIter, mpl::false_, Traits> visitor_type;
Chris@16 43 visitor_type visitor(tr, impl);
Chris@16 44 intrusive_ptr<matchable_ex<BidiIter> const> adxpr = make_adaptor<matchable_ex<BidiIter> >(
Chris@16 45 typename Grammar<char_type>::template impl<Xpr const &, end_xpression, visitor_type &>()(
Chris@16 46 xpr
Chris@16 47 , end_xpression()
Chris@16 48 , visitor
Chris@16 49 )
Chris@16 50 );
Chris@16 51
Chris@16 52 // Link and optimize the regex
Chris@16 53 common_compile(adxpr, *impl, visitor.traits());
Chris@16 54
Chris@16 55 // References changed, update dependencies.
Chris@16 56 impl->tracking_update();
Chris@16 57 }
Chris@16 58
Chris@16 59 ///////////////////////////////////////////////////////////////////////////////
Chris@16 60 // pattern for imbued regexes.
Chris@16 61 struct XpressiveLocaleModifier
Chris@16 62 : proto::binary_expr<
Chris@16 63 modifier_tag
Chris@16 64 , proto::terminal<locale_modifier<proto::_> >
Chris@16 65 , proto::_
Chris@16 66 >
Chris@16 67 {};
Chris@16 68
Chris@16 69 ///////////////////////////////////////////////////////////////////////////////
Chris@16 70 // static_compile_impl1
Chris@16 71 template<typename Xpr, typename BidiIter>
Chris@16 72 typename disable_if<proto::matches<Xpr, XpressiveLocaleModifier> >::type
Chris@16 73 static_compile_impl1(Xpr const &xpr, shared_ptr<regex_impl<BidiIter> > const &impl)
Chris@16 74 {
Chris@16 75 // use default traits
Chris@16 76 typedef typename iterator_value<BidiIter>::type char_type;
Chris@16 77 typedef typename default_regex_traits<char_type>::type traits_type;
Chris@16 78 traits_type tr;
Chris@16 79 static_compile_impl2(xpr, impl, tr);
Chris@16 80 }
Chris@16 81
Chris@16 82 ///////////////////////////////////////////////////////////////////////////////
Chris@16 83 // static_compile_impl1
Chris@16 84 template<typename Xpr, typename BidiIter>
Chris@16 85 typename enable_if<proto::matches<Xpr, XpressiveLocaleModifier> >::type
Chris@16 86 static_compile_impl1(Xpr const &xpr, shared_ptr<regex_impl<BidiIter> > const &impl)
Chris@16 87 {
Chris@16 88 // use specified traits
Chris@16 89 typedef typename proto::result_of::value<typename proto::result_of::left<Xpr>::type>::type::locale_type locale_type;
Chris@16 90 typedef typename regex_traits_type<locale_type, BidiIter>::type traits_type;
Chris@16 91 static_compile_impl2(proto::right(xpr), impl, traits_type(proto::value(proto::left(xpr)).getloc()));
Chris@16 92 }
Chris@16 93
Chris@16 94 ///////////////////////////////////////////////////////////////////////////////
Chris@16 95 // static_compile
Chris@16 96 template<typename Xpr, typename BidiIter>
Chris@16 97 void static_compile(Xpr const &xpr, shared_ptr<regex_impl<BidiIter> > const &impl)
Chris@16 98 {
Chris@16 99 static_compile_impl1(xpr, impl);
Chris@16 100 }
Chris@16 101
Chris@16 102 }}} // namespace boost::xpressive::detail
Chris@16 103
Chris@16 104 #endif