Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file regex_traits.hpp Chris@16: /// Includes the C regex traits or the CPP regex traits header file depending on the Chris@16: /// BOOST_XPRESSIVE_USE_C_TRAITS macro. 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_REGEX_TRAITS_HPP_EAN_10_04_2005 Chris@16: #define BOOST_XPRESSIVE_REGEX_TRAITS_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: Chris@16: #ifdef BOOST_XPRESSIVE_USE_C_TRAITS Chris@16: # include Chris@16: #else Chris@16: # include Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace xpressive Chris@16: { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // regex_traits_version_1_tag Chris@16: /// Tag used to denote that a traits class conforms to the version 1 traits Chris@16: /// interface. Chris@16: struct regex_traits_version_1_tag Chris@16: { Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // regex_traits_version_2_tag Chris@16: /// Tag used to denote that a traits class conforms to the version 2 traits Chris@16: /// interface. Chris@16: struct regex_traits_version_2_tag Chris@16: : regex_traits_version_1_tag Chris@16: { Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // regex_traits_version_1_case_fold_tag DEPRECATED use has_fold_case trait Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: struct regex_traits_version_1_case_fold_tag Chris@16: : regex_traits_version_1_tag Chris@16: { Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // has_fold_case Chris@16: /// Trait used to denote that a traits class has the fold_case member function. Chris@16: template Chris@16: struct has_fold_case Chris@16: : is_convertible< Chris@16: typename Traits::version_tag * Chris@16: , regex_traits_version_1_case_fold_tag * Chris@16: > Chris@16: { Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // regex_traits Chris@16: /// Thin wrapper around the default regex_traits implementation, either Chris@16: /// cpp_regex_traits or c_regex_traits Chris@16: /// Chris@16: template Chris@16: struct regex_traits Chris@16: : Impl Chris@16: { Chris@16: typedef typename Impl::locale_type locale_type; Chris@16: Chris@16: regex_traits() Chris@16: : Impl() Chris@16: { Chris@16: } Chris@16: Chris@16: explicit regex_traits(locale_type const &loc) Chris@16: : Impl(loc) Chris@16: { Chris@16: } Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // lookup_classname Chris@16: /// INTERNAL ONLY Chris@16: template Chris@16: inline typename Traits::char_class_type Chris@16: lookup_classname(Traits const &traits, char const (&cname)[N], bool icase) Chris@16: { Chris@16: typename Traits::char_type name[N] = {0}; Chris@16: for(std::size_t j = 0; j < N-1; ++j) Chris@16: { Chris@16: name[j] = traits.widen(cname[j]); Chris@16: } Chris@16: return traits.lookup_classname(name, name + N - 1, icase); Chris@16: } Chris@16: Chris@16: }} Chris@16: Chris@16: #endif