Sierra Toolkit  Version of the Day
nested_range.hpp
1 #ifndef STK_UTIL_STK_UTIL_UTIL_NESTED_RANGE_HPP
2 #define STK_UTIL_STK_UTIL_UTIL_NESTED_RANGE_HPP
3 
4 #include <stk_util/util/nested_iterator.hpp>
5 
6 #include <boost/range.hpp>
7 #include <boost/iterator.hpp>
8 #include <boost/optional.hpp>
9 
10 #include <boost/mpl/assert.hpp>
11 #include <boost/type_traits.hpp>
12 
13 namespace stk_classic {
14 namespace util {
15 
16 namespace details {
17 
18 template<typename T>
19 struct identity {
20  typedef T result_type;
21 
22  result_type& operator()(result_type& r) const { return r; }
23  const result_type& operator()(const result_type& r) const { return r; }
24 };
25 
26 }
27 
30 template < typename OuterRange,
31  typename InnerRange=typename boost::range_value<OuterRange>::type,
32  typename OuterToInnerConverter=
33  details::identity<
34  typename boost::mpl::if_<
35  typename boost::is_same<InnerRange,
36  typename boost::range_value<OuterRange>::type>,
37  InnerRange,
38  void
39  >::type
40  >
41  >
43 
44 template < typename OuterRange, typename InnerRange, typename OuterToInnerConverter >
45 class nested_range
46 {
47  public:
48  typedef OuterRange outer_range;
49  typedef InnerRange inner_range;
50  BOOST_MPL_ASSERT((boost::has_range_iterator<outer_range>));
51  BOOST_MPL_ASSERT((boost::has_range_iterator<inner_range>));
52 
53  typedef OuterToInnerConverter converter_type;
54 
57 
58  nested_range() : m_outer(), m_converter() {}
59 
60  nested_range(outer_range& outer, converter_type converter=converter_type()) : m_outer(outer), m_converter(converter) {}
61 
62  iterator begin() { return iterator(*m_outer, *m_converter); }
63  const_iterator begin() const { return const_iterator(*m_outer, *m_converter); }
64 
65  iterator end() { return iterator(); }
66  const_iterator end() const { return const_iterator(); }
67 
68  private:
69  boost::optional<outer_range&> m_outer;
70  boost::optional<converter_type> m_converter;
71 };
72 
73 //template < typename OuterRange>
74 //class nested_range<OuterRange,typename boost::range_value<OuterRange>::type, void>
75 //{
76 // public:
77 // typedef OuterRange outer_range;
78 // typedef InnerRange inner_range;
79 // BOOST_MPL_ASSERT((boost::has_range_iterator<inner_range>));
80 //
81 // typedef nested_iterator<outer_range,inner_range> iterator;
82 // typedef nested_iterator<typename boost::add_const<outer_range>::type,inner_range> const_iterator;
83 //
84 // nested_range() : m_outer() {}
85 //
86 // nested_range(outer_range& outer) : m_outer(outer) {}
87 //
88 // iterator begin() { return iterator(*m_outer); }
89 // const_iterator begin() const { return const_iterator(*m_outer); }
90 //
91 // iterator end() { return iterator(); }
92 // const_iterator end() const { return const_iterator(); }
93 //
94 // private:
95 // boost::optional<outer_range&> m_outer;
96 //};
97 
98 
99 } // util
100 } // stk
101 
102 
103 #endif //STK_UTIL_STK_UTIL_UTIL_NESTED_RANGE_HPP
Sierra Toolkit.