range.h
Go to the documentation of this file.00001 #ifndef __UTIL_RANGE_HPP__
00002 #define __UTIL_RANGE_HPP__
00003
00009 #include <config.h>
00010 #include <utility>
00011 #include <iterator>
00012
00013 namespace util {
00014
00020 template <typename Iterator>
00021 struct range
00022 {
00023 typedef Iterator iterator;
00024 typedef Iterator const_iterator;
00025 typedef typename std::iterator_traits<iterator>::difference_type difference_type;
00026
00030 range()
00031 : first()
00032 , last()
00033 {}
00034
00038 range(const iterator& fst,
00039 const iterator& lst)
00040 : first(fst)
00041 , last(lst)
00042 {}
00043
00047 explicit range(const std::pair<iterator,iterator>& p)
00048 : first(p.first)
00049 , last(p.second)
00050 {}
00051
00055 range(const range& copy)
00056 : first(copy.first)
00057 , last(copy.last)
00058 {}
00059
00063 template <typename It>
00064 explicit range(const range<It>& copy)
00065 : first(copy.first)
00066 , last(copy.last)
00067 { }
00068
00069 #ifdef USE_CXX0X
00070
00073 range(range&& copy)
00074 : first(std::move(copy.first))
00075 , last(std::move(copy.last))
00076 { }
00077
00081 template <typename It>
00082 range(range<It>&& copy)
00083 : first(std::move(copy.first))
00084 , last(std::move(copy.last))
00085 {}
00086 #endif
00087
00091 iterator begin() const { return first; }
00095 iterator end() const { return last; }
00096
00100 const_iterator cbegin() const { return first; }
00104 const_iterator cend() const { return last; }
00105
00109 void setBegin(const iterator& it) { first = it; }
00113
00114
00115 void setEnd(const iterator& it) { last = it; }
00116
00122 difference_type size() const { return std::distance(first, last); }
00123
00127 range& operator=(const range& other)
00128 {
00129 first = other.first;
00130 last = other.last;
00131 return *this;
00132 }
00133
00137 template <typename It>
00138 range& operator=(const range<It>& other)
00139 {
00140 first = other.first;
00141 last = other.last;
00142 return *this;
00143 }
00144
00145 #ifdef USE_CXX0X
00146
00149 range& operator=(range&&) = default;
00150
00154 template <typename It>
00155 range& operator=(range<It>&& other)
00156 {
00157 first = std::move(other.first);
00158 last = std::move(other.last);
00159 return *this;
00160 }
00161 #endif
00162
00163 iterator first, last;
00164 };
00165
00169 template <typename Iterator>
00170 range<Iterator> make_range(const Iterator& first, const Iterator& last)
00171 {
00172 return range<Iterator>(first, last);
00173 }
00174
00178 template <typename Iterator>
00179 range<Iterator> make_range(const std::pair<Iterator,Iterator>& p)
00180 {
00181 return range<Iterator>(p);
00182 }
00183
00190 template <typename T> bool range_closed(const T& min, const T& max, const T& val) {
00191 return (val >= min && val <= max);
00192 }
00193
00200 template <typename T> bool range_open(const T& min, const T& max, const T& val) {
00201 return (val > min && val < max);
00202 }
00203
00211 template <typename T> bool range_c(const T& min, const T& max, const T& val) {
00212 return (val >= min && val < max);
00213 }
00214 }
00215
00216 #endif