integral_range.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #ifndef LASS_GUARDIAN_OF_INCLUSION_STDE_INTEGRAL_RANGE_H
00049 #define LASS_GUARDIAN_OF_INCLUSION_STDE_INTEGRAL_RANGE_H
00050
00051 #include "stde_common.h"
00052 #include "../num/safe_bool.h"
00053
00054 namespace lass
00055 {
00056 namespace stde
00057 {
00058
00059 template <typename integral_type> class const_integral_iterator;
00060
00061 template <typename I> bool operator==(const const_integral_iterator<I>& a, const const_integral_iterator<I>& b);
00062 template <typename I> bool operator!=(const const_integral_iterator<I>& a, const const_integral_iterator<I>& b);
00063 template <typename I> bool operator< (const const_integral_iterator<I>& a, const const_integral_iterator<I>& b);
00064 template <typename I> bool operator> (const const_integral_iterator<I>& a, const const_integral_iterator<I>& b);
00065 template <typename I> bool operator<=(const const_integral_iterator<I>& a, const const_integral_iterator<I>& b);
00066 template <typename I> bool operator>=(const const_integral_iterator<I>& a, const const_integral_iterator<I>& b);
00067
00068 template <typename integral_type>
00069 class const_integral_iterator:
00070 public std::iterator<std::random_access_iterator_tag, const integral_type>
00071 {
00072 public:
00073 typedef const_integral_iterator<integral_type> self_type;
00074 typedef std::iterator<std::random_access_iterator_tag, const integral_type> iterator_type;
00075 typedef typename iterator_type::value_type value_type;
00076 typedef typename iterator_type::pointer pointer;
00077 typedef typename iterator_type::reference reference;
00078 typedef typename iterator_type::difference_type difference_type;
00079
00080 const_integral_iterator(value_type value, value_type step);
00081
00082 pointer operator->() const;
00083 reference operator*() const;
00084 value_type operator[](difference_type n) const;
00085
00086 self_type& operator++();
00087 self_type operator++(int);
00088 self_type& operator--();
00089 self_type operator--(int);
00090
00091 self_type& operator+=(difference_type n);
00092 self_type& operator-=(difference_type n);
00093 self_type operator+(difference_type n) const;
00094 self_type operator-(difference_type n) const;
00095
00096 difference_type operator-(const self_type& other) const;
00097
00098 private:
00099
00100 friend bool operator== <integral_type>(const const_integral_iterator<integral_type>&, const const_integral_iterator<integral_type>& );
00101 friend bool operator< <integral_type>(const const_integral_iterator<integral_type>&, const const_integral_iterator<integral_type>& );
00102
00103 integral_type value_;
00104 integral_type step_;
00105 };
00106
00107
00108
00109 template <typename integral_type> class integral_range_t;
00110
00111 template <typename I> bool operator==(const integral_range_t<I>& a, const integral_range_t<I>& b);
00112 template <typename I> bool operator!=(const integral_range_t<I>& a, const integral_range_t<I>& b);
00113 template <typename I> bool operator< (const integral_range_t<I>& a, const integral_range_t<I>& b);
00114 template <typename I> bool operator> (const integral_range_t<I>& a, const integral_range_t<I>& b);
00115 template <typename I> bool operator<=(const integral_range_t<I>& a, const integral_range_t<I>& b);
00116 template <typename I> bool operator>=(const integral_range_t<I>& a, const integral_range_t<I>& b);
00117
00118 template <typename integral_type>
00119 class integral_range_t
00120 {
00121 public:
00122
00123 typedef integral_range_t<integral_type> self_type;
00124
00125 typedef const_integral_iterator<integral_type> const_iterator;
00126 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00127
00128 typedef typename const_iterator::value_type value_type;
00129 typedef typename const_iterator::pointer const_pointer;
00130 typedef typename const_iterator::reference const_reference;
00131 typedef typename const_iterator::difference_type difference_type;
00132 typedef std::size_t size_type;
00133
00134 integral_range_t();
00135 integral_range_t(value_type last);
00136 integral_range_t(value_type first, value_type last);
00137 integral_range_t(value_type first, value_type last, value_type step);
00138
00139 const_iterator begin() const;
00140 const_iterator end() const;
00141 const_reverse_iterator rbegin() const;
00142 const_reverse_iterator rend() const;
00143
00144 const_pointer operator->() const;
00145 const_reference operator*() const;
00146 value_type operator[](difference_type index) const;
00147
00148 self_type& operator++();
00149 self_type operator++(int);
00150 self_type& operator--();
00151 self_type operator--(int);
00152
00153 self_type& operator+=(difference_type n);
00154 self_type& operator-=(difference_type n);
00155 self_type operator+(difference_type n) const;
00156 self_type operator-(difference_type n) const;
00157
00158 const size_type size() const;
00159 const bool empty() const;
00160 const bool operator!() const;
00161 operator const num::SafeBool() const;
00162
00163 void swap(self_type& other);
00164
00165 private:
00166
00167 friend bool operator== <integral_type>(const integral_range_t<integral_type>& a, const integral_range_t<integral_type>& b);
00168 friend bool operator< <integral_type>(const integral_range_t<integral_type>& a, const integral_range_t<integral_type>& b);
00169
00170 integral_type first_;
00171 integral_type last_;
00172 integral_type step_;
00173 };
00174
00175 template <typename I> integral_range_t<I> integral_range(const I& last);
00176 template <typename I> integral_range_t<I> integral_range(const I& first, const I& last);
00177 template <typename I> integral_range_t<I> integral_range(const I& first, const I& last, const I& step);
00178
00179 }
00180
00181 }
00182
00183 #include "integral_range.inl"
00184
00185 #endif
00186
00187