C++ Template Metaprogramming
Solutions to the exercises throughout the book
Loading...
Searching...
No Matches
exercise-7-7.hpp
Go to the documentation of this file.
1// ===-- chapter-7/exercise-7-7.hpp ----------------------- -*- C++ -*- --=== //
9#ifndef EXERCISE_7_7
10#define EXERCISE_7_7
11
12#include <boost/static_assert.hpp>
13
14#include <boost/mpl/begin_end.hpp>
15#include <boost/mpl/deref.hpp>
16#include <boost/mpl/iterator_category.hpp>
17#include <boost/mpl/iterator_tags.hpp>
18#include <boost/mpl/next_prior.hpp>
19#include <boost/mpl/or.hpp>
20
21#include <boost/type_traits/is_same.hpp>
22
23
39namespace exercise_7_7 {
40
45template <typename ForwardIt>
47{
48 typedef ForwardIt base;
49 typedef typename boost::mpl::iterator_category<ForwardIt>::type category;
50
52};
53
60template <typename Iterator>
62 : boost::mpl::or_<
63 boost::is_same<
64 typename boost::mpl::iterator_category<Iterator>::type,
65 boost::mpl::bidirectional_iterator_tag>,
66 boost::is_same<
67 typename boost::mpl::iterator_category<Iterator>::type,
68 boost::mpl::random_access_iterator_tag>
69 >
70{ };
71
72} // namespace exercise_7_7
73
74
75namespace boost {
76namespace mpl {
77
80
82template <typename Sequence>
83struct rend
84{
85 typedef typename prior<typename begin<Sequence>::type>::type end_iterator;
88
90};
91
93template <typename Sequence>
94struct rbegin
95{
96 typedef typename prior<typename end<Sequence>::type>::type first_iterator;
99
101};
102
104template <typename ForwardIt>
105struct deref< exercise_7_7::reverse_iterator<ForwardIt> >
106 : deref<ForwardIt> { };
107
109template <typename ForwardIt>
110struct next< exercise_7_7::reverse_iterator<ForwardIt> >
111 : exercise_7_7::reverse_iterator<typename prior<ForwardIt>::type> { };
112
114template <typename ForwardIt>
115struct prior< exercise_7_7::reverse_iterator<ForwardIt> >
116 : exercise_7_7::reverse_iterator<typename next<ForwardIt>::type> { };
117
119
120} // namespace mpl
121} // namespace boost
122
123#endif // EXERCISE_7_7
Exists to inject functionality into the Boost MPL namespace.
Exists to inject functionality into the Boost namespace.
Encapsulate solution for Exercise 7-7.
Grab a reverse_iterator from the a sequence directly.
prior< typenameend< Sequence >::type >::type first_iterator
BOOST_STATIC_ASSERT((exercise_7_7::is_valid_reverse_category< first_iterator >::value))
exercise_7_7::reverse_iterator< first_iterator > type
Acquire a reverse_iterator at the end of a sequence.
BOOST_STATIC_ASSERT((exercise_7_7::is_valid_reverse_category< end_iterator >::value))
prior< typenamebegin< Sequence >::type >::type end_iterator
exercise_7_7::reverse_iterator< end_iterator > type
Determines if the source iterator is suitable for reversal.
Wraps any iterator with the intent of reversing the direction of next and prior.
reverse_iterator< ForwardIt > type
boost::mpl::iterator_category< ForwardIt >::type category