libcarla/include/system/boost/metaparse/v1/impl/string_iterator.hpp

160 lines
3.6 KiB
C++
Raw Normal View History

2024-10-18 13:19:59 +08:00
#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