summaryrefslogtreecommitdiff
path: root/boost/metaparse/v1/impl/string_iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/metaparse/v1/impl/string_iterator.hpp')
-rw-r--r--boost/metaparse/v1/impl/string_iterator.hpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/boost/metaparse/v1/impl/string_iterator.hpp b/boost/metaparse/v1/impl/string_iterator.hpp
new file mode 100644
index 0000000000..3e37ff3b0d
--- /dev/null
+++ b/boost/metaparse/v1/impl/string_iterator.hpp
@@ -0,0 +1,159 @@
+#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
+