Crazy Eddie's GUI System  ${CEGUI_VERSION}
iterator_range.hpp
1 // This file has been generated by Py++.
2 
3 // Copyright (c) 2003 Raoul M. Gough
4 //
5 // Use, modification and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy
7 // at http://www.boost.org/LICENSE_1_0.txt)
8 //
9 // Header file iterator_range.hpp
10 //
11 // Emulate an STL container using a pair of iterators. Doesn't support
12 // insertion or deletion, for the obvious reasons.
13 //
14 // History
15 // =======
16 // 2003/ 9/ 9 rmg File creation as iterator_pair.hpp
17 // 2003/10/27 rmg Renamed iterator_range.hpp
18 // 2008/12/08 Roman Change indexing suite layout
19 //
20 // $Id: iterator_range.hpp,v 1.1.2.7 2004/02/08 18:57:42 raoulgough Exp $
21 //
22 
23 #ifndef BOOST_PYTHON_INDEXING_ITERATOR_RANGE_HPP
24 #define BOOST_PYTHON_INDEXING_ITERATOR_RANGE_HPP
25 
26 #include <stdexcept>
27 #include <algorithm>
28 #include <utility>
29 #include <boost/type_traits.hpp>
30 #include <boost/type_traits/ice.hpp>
31 #include <boost/detail/workaround.hpp>
32 #include <boost/iterator/iterator_traits.hpp>
33 #include <indexing_suite/container_traits.hpp>
34 #include <indexing_suite/container_suite.hpp>
35 #include <indexing_suite/algorithms.hpp>
36 #include <indexing_suite/iterator_traits.hpp>
37 
38 namespace boost { namespace python { namespace indexing {
39  template<typename Iterator>
41  {
42  private:
43  typedef typename BOOST_PYTHON_INDEXING_CALL_TRAITS <Iterator>::param_type
44  iterator_param;
45 
46  typedef ::boost::detail::iterator_traits<Iterator> std_traits;
47 
48  public:
49  typedef typename std_traits::reference reference;
50  typedef Iterator iterator;
51  typedef typename std_traits::difference_type size_type;
52  typedef typename std_traits::difference_type difference_type;
53  typedef typename std_traits::value_type value_type;
54  typedef typename std_traits::pointer pointer;
55 
56  typedef iterator const_iterator;
57  // Can't tell what the const version of our iterator should
58  // be. The client code will have to instantiate iterator_range
59  // directly with a const_iterator if that's what it wants.
60 
61  // Also can't provide: allocator_type, reverse_iterator or
62  // const_reverse_iterator. Could probably provide (but don't)
63  // const_reference and const_pointer. These would be the same as
64  // reference and pointer if Iterator is itself a const_iterator.
65 
66  public:
67  iterator_range (iterator_param, iterator_param);
68  iterator_range (std::pair<iterator, iterator> const &);
69 
70  iterator begin() const;
71  iterator end() const;
72 
73  public:
74  // Only sensible for random_access iterators
75  size_type size () const;
76  reference operator[] (size_type) const;
77  reference at (size_type) const;
78 
79  private:
80  iterator m_begin;
81  iterator m_end;
82  };
83 
84  // Array support function(s).
85  template<typename T> iterator_range<T *> make_iterator_range (T *, T*);
86 
87 #if !BOOST_WORKAROUND (BOOST_MSVC, <= 1200)
88  template<typename T, std::size_t N> iterator_range<T *> make_iterator_range(
89  T (&array)[N]);
90 
91  template<typename T, std::size_t N> T *begin (T (&array)[N]);
92  template<typename T, std::size_t N> T *end (T (&array)[N]);
93 
94 # define BOOST_MAKE_ITERATOR_RANGE ::boost::python::indexing::make_iterator_range
95 
96 #else
97  // For compilers that can't deduce template argument array bounds
98 # define BOOST_MAKE_ITERATOR_RANGE(array) ::boost::python::indexing::make_iterator_range ( (array), ((array) + sizeof(array) / sizeof((array)[0])))
99 #endif
100 
101  template<typename Iterator>
103  iterator_param begin, iterator_param end)
104  : m_begin (begin),
105  m_end (end)
106  {
107  }
108 
109  template<typename Iterator>
111  ::iterator_range (std::pair<iterator, iterator> const &pair)
112  : m_begin (pair.first),
113  m_end (pair.second)
114  {
115  }
116 
117  template<typename Iterator>
118  typename iterator_range<Iterator>::iterator
120  {
121  return m_begin;
122  }
123 
124  template<typename Iterator>
125  typename iterator_range<Iterator>::iterator
127  {
128  return m_end;
129  }
130 
131  template<typename Iterator>
132  typename iterator_range<Iterator>::size_type
134  {
135  return std::distance (begin(), end());
136  }
137 
138  template<typename Iterator>
139  typename iterator_range<Iterator>::reference
140  iterator_range<Iterator>::operator[](size_type index) const
141  {
142  iterator temp (begin());
143  std::advance (temp, index);
144  return *temp;
145  }
146 
147  template<typename Iterator>
148  typename iterator_range<Iterator>::reference
149  iterator_range<Iterator>::at (size_type index) const
150  {
151  if (index >= size())
152  {
153  throw std::out_of_range
154  (std::string ("iterator_range: index out of range"));
155  }
156 
157  else
158  {
159  return (*this)[index];
160  }
161  }
162 
163  template<typename T> iterator_range<T *> make_iterator_range (T *p1, T* p2)
164  {
165  return iterator_range<T *> (p1, p2);
166  }
167 
168 #if !BOOST_WORKAROUND (BOOST_MSVC, <= 1200)
169  template<typename T, std::size_t N>
170  T *begin (T (&array)[N]) {
171  return array;
172  }
173 
174  template<typename T, std::size_t N>
175  T *end (T (&array)[N]) {
176  return array + N;
177  }
178 
179  template<typename T, std::size_t N>
180  iterator_range<T *> make_iterator_range (T (&array)[N]) {
181  return iterator_range<T *>(begin (array), end (array));
182  }
183 #endif
184 
185  template<typename Container, typename ValueTraits = detail::no_override>
187  : public base_container_traits<Container, ValueTraits>
188  {
190 
191  typedef ::boost::python::indexing::iterator_traits<
192  typename Container::iterator
194 
195  public:
196  typedef typename base_class::value_traits_type value_traits_type;
197 
198  private:
199  // Methods that we *can't* support because of our value type
200  BOOST_STATIC_CONSTANT(
201  method_set_type,
202  disabled_methods = (
204  type_traits::ice_not<
205  value_traits_type::equality_comparable
206  >::value,
207  method_index // Impossible if !equality_comparable
208  | method_contains // Impossible if !equality_comparable
209  | method_count // Impossible if !equality_comparable
210  >::value
211 
213  type_traits::ice_not<
214  value_traits_type::less_than_comparable
215  >::value,
216  method_sort // Impossible if !less_than_comparable
217  >::value
218  ));
219 
220  public:
221  BOOST_STATIC_CONSTANT(
222  method_set_type,
223  supported_methods =
224  iterator_traits_type::supported_methods & ~disabled_methods);
225  };
226 
227 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
228  namespace detail {
230  // algorithms support for iterator_range instances
232 
233  template <typename Iterator>
235  {
237 
240 
241  public:
244  };
245  }
246 #endif
247 
248  template<
249  class Container,
250  method_set_type MethodMask = all_methods,
251  class Traits = iterator_range_traits<Container>
252  >
254  : container_suite<Container, MethodMask, default_algorithms<Traits> >
255  {
256  };
257 
258 } } }
259 
260 #endif // BOOST_PYTHON_INDEXING_ITERATOR_RANGE_HPP
261 
262 
263 
Definition: algorithms.hpp:42
Definition: python_CEGUI.h:9
Definition: container_traits.hpp:59
Definition: iterator_range.hpp:40
Definition: container_suite.hpp:42
Definition: iterator_range.hpp:253
Definition: iterator_range.hpp:186
Definition: iterator_traits.hpp:208