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     //void setEnd(const iterator& it) { end = it; }
00114     // Pascal's hack to make it compile
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Generated on Fri May 31 15:37:53 2013 for VVE by  doxygen 1.6.3