source: NonGTP/Boost/boost/regex/v4/iterator_category.hpp @ 857

Revision 857, 1.9 KB checked in by igarcia, 18 years ago (diff)
Line 
1/*
2 *
3 * Copyright (c) 2002
4 * John Maddock
5 *
6 * Use, modification and distribution are subject to the
7 * Boost Software License, Version 1.0. (See accompanying file
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 *
10 */
11
12 /*
13  *   LOCATION:    see http://www.boost.org for most recent version.
14  *   FILE         regex_match.hpp
15  *   VERSION      see <boost/version.hpp>
16  *   DESCRIPTION: Iterator traits for selecting an iterator type as
17  *                an integral constant expression.
18  */
19
20
21#ifndef BOOST_REGEX_ITERATOR_CATEGORY_HPP
22#define BOOST_REGEX_ITERATOR_CATEGORY_HPP
23
24#include <iterator>
25#include <boost/type_traits/is_convertible.hpp>
26#include <boost/type_traits/is_pointer.hpp>
27
28namespace boost{
29namespace detail{
30
31template <class I>
32struct is_random_imp
33{
34private:
35   typedef typename std::iterator_traits<I>::iterator_category cat;
36public:
37   BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<cat*, std::random_access_iterator_tag*>::value));
38};
39
40template <class I>
41struct is_random_pointer_imp
42{
43   BOOST_STATIC_CONSTANT(bool, value = true);
44};
45
46template <bool is_pointer_type>
47struct is_random_imp_selector
48{
49   template <class I>
50   struct rebind
51   {
52      typedef is_random_imp<I> type;
53   };
54};
55
56template <>
57struct is_random_imp_selector<true>
58{
59   template <class I>
60   struct rebind
61   {
62      typedef is_random_pointer_imp<I> type;
63   };
64};
65
66}
67
68template <class I>
69struct is_random_access_iterator
70{
71private:
72   typedef detail::is_random_imp_selector< ::boost::is_pointer<I>::value> selector;
73   typedef typename selector::template rebind<I> bound_type;
74   typedef typename bound_type::type answer;
75public:
76   BOOST_STATIC_CONSTANT(bool, value = answer::value);
77};
78
79#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
80template <class I>
81const bool is_random_access_iterator<I>::value;
82#endif
83
84}
85
86#endif
87
Note: See TracBrowser for help on using the repository browser.