1 #ifndef STK_UTIL_STK_UTIL_UTIL_NESTED_RANGE_HPP 2 #define STK_UTIL_STK_UTIL_UTIL_NESTED_RANGE_HPP 4 #include <stk_util/util/nested_iterator.hpp> 6 #include <boost/range.hpp> 7 #include <boost/iterator.hpp> 8 #include <boost/optional.hpp> 10 #include <boost/mpl/assert.hpp> 11 #include <boost/type_traits.hpp> 20 typedef T result_type;
22 result_type& operator()(result_type& r)
const {
return r; }
23 const result_type& operator()(
const result_type& r)
const {
return r; }
30 template <
typename OuterRange,
31 typename InnerRange=
typename boost::range_value<OuterRange>::type,
32 typename OuterToInnerConverter=
34 typename boost::mpl::if_<
35 typename boost::is_same<InnerRange,
36 typename boost::range_value<OuterRange>::type>,
44 template <
typename OuterRange,
typename InnerRange,
typename OuterToInnerConverter >
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>));
53 typedef OuterToInnerConverter converter_type;
60 nested_range(outer_range& outer, converter_type converter=converter_type()) : m_outer(outer), m_converter(converter) {}
62 iterator begin() {
return iterator(*m_outer, *m_converter); }
63 const_iterator begin()
const {
return const_iterator(*m_outer, *m_converter); }
65 iterator end() {
return iterator(); }
66 const_iterator end()
const {
return const_iterator(); }
69 boost::optional<outer_range&> m_outer;
70 boost::optional<converter_type> m_converter;
103 #endif //STK_UTIL_STK_UTIL_UTIL_NESTED_RANGE_HPP