#ifndef BOOST_METAPARSE_V1_IMPL_STRING_ITERATOR_HPP #define BOOST_METAPARSE_V1_IMPL_STRING_ITERATOR_HPP // Copyright Abel Sinkovics (abel@sinkovics.hu) 2013. // 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 <boost/metaparse/v1/impl/string_iterator_tag.hpp> #include <boost/metaparse/v1/impl/at_c.hpp> #include <boost/mpl/iterator_tags.hpp> #include <boost/mpl/int.hpp> #include <boost/mpl/bool.hpp> #include <boost/type_traits/is_same.hpp> namespace boost { namespace metaparse { namespace v1 { namespace impl { // string_iterator template <class S, int N> struct string_iterator { typedef string_iterator type; typedef string_iterator_tag tag; typedef boost::mpl::random_access_iterator_tag category; }; // advance_c template <class S, int N> struct advance_c; template <class S, int N, int P> struct advance_c<string_iterator<S, N>, P> : string_iterator<S, N + P> {}; // distance template <class A, class B> struct distance; template <class S, int A, int B> struct distance<string_iterator<S, A>, string_iterator<S, B> > : boost::mpl::int_<B - A> {}; } } } } namespace boost { namespace mpl { // advance template <class S> struct advance_impl; template <> struct advance_impl<boost::metaparse::v1::impl::string_iterator_tag> { typedef advance_impl type; template <class S, class N> struct apply : boost::metaparse::v1::impl::advance_c< typename S::type, N::type::value > {}; }; // distance template <class S> struct distance_impl; template <> struct distance_impl<boost::metaparse::v1::impl::string_iterator_tag> { typedef distance_impl type; template <class A, class B> struct apply : boost::metaparse::v1::impl::distance< typename A::type, typename B::type > {}; }; // next template <class S> struct next; template <class S, int N> struct next<boost::metaparse::v1::impl::string_iterator<S, N> > : boost::metaparse::v1::impl::string_iterator<S, N + 1> {}; // prior template <class S> struct prior; template <class S, int N> struct prior<boost::metaparse::v1::impl::string_iterator<S, N> > : boost::metaparse::v1::impl::string_iterator<S, N - 1> {}; // deref template <class S> struct deref; template <class S, int N> struct deref<boost::metaparse::v1::impl::string_iterator<S, N> > : boost::metaparse::v1::impl::at_c<S, N> {}; // equal_to template <class A, class B> struct equal_to_impl; template <> struct equal_to_impl< boost::metaparse::v1::impl::string_iterator_tag, boost::metaparse::v1::impl::string_iterator_tag > { typedef equal_to_impl type; template <class A, class B> struct apply : is_same<typename A::type, typename B::type> {}; }; template <class T> struct equal_to_impl<boost::metaparse::v1::impl::string_iterator_tag, T> { typedef equal_to_impl type; template <class, class> struct apply : false_ {}; }; template <class T> struct equal_to_impl<T, boost::metaparse::v1::impl::string_iterator_tag> : equal_to_impl<boost::metaparse::v1::impl::string_iterator_tag, T> {}; } } #endif