123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #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
|