#ifndef BOOST_METAPARSE_V1_CPP11_STRING_HPP #define BOOST_METAPARSE_V1_CPP11_STRING_HPP // Copyright Abel Sinkovics (abel@sinkovics.hu) 2012. // 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) #include #include #include #include #include #include #include #include #include #include #include /* * The string type */ namespace boost { namespace metaparse { namespace v1 { template struct string { typedef string type; typedef string_tag tag; }; } } } /* * Boost.MPL overloads */ namespace boost { namespace mpl { // push_back template struct push_back_impl; template <> struct push_back_impl { typedef push_back_impl type; template struct apply : boost::metaparse::v1::impl::push_back_c< typename S::type, C::type::value > {}; }; // pop_back template struct pop_back_impl; template <> struct pop_back_impl { typedef pop_back_impl type; template struct apply : boost::metaparse::v1::impl::pop_back {}; }; // push_front template struct push_front_impl; template <> struct push_front_impl { typedef push_front_impl type; template struct apply : boost::metaparse::v1::impl::push_front_c< typename S::type, C::type::value > {}; }; // pop_front template struct pop_front_impl; template <> struct pop_front_impl { typedef pop_front_impl type; template struct apply : boost::metaparse::v1::impl::pop_front {}; }; // clear template struct clear_impl; template <> struct clear_impl { typedef clear_impl type; template struct apply : boost::metaparse::v1::string<> {}; }; // begin template struct begin_impl; template <> struct begin_impl { typedef begin_impl type; template struct apply : boost::metaparse::v1::impl::string_iterator {}; }; // end template struct end_impl; template <> struct end_impl { typedef end_impl type; template struct apply : boost::metaparse::v1::impl::string_iterator< typename S::type, boost::metaparse::v1::impl::size::type::value > {}; }; // equal_to template struct equal_to_impl; template <> struct equal_to_impl< boost::metaparse::v1::string_tag, boost::metaparse::v1::string_tag > { typedef equal_to_impl type; template struct apply : std::is_same {}; }; template struct equal_to_impl { typedef equal_to_impl type; template struct apply : false_ {}; }; template struct equal_to_impl : equal_to_impl {}; // c_str template struct c_str; template struct c_str> { typedef c_str type; static constexpr char value[sizeof...(Cs) + 1] = {Cs..., 0}; }; template <> struct c_str> : boost::metaparse::v1::impl::empty_string<> {}; template constexpr char c_str>::value[]; } } #if __clang__ # if __has_extension(cxx_string_literal_templates) # define BOOST_METAPARSE_V1_STRING(...) ::boost::metaparse::string<__VA_ARGS__> # else # include # endif #else # include #endif #endif