00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_MOL_IMPL_POINTER_ITERATOR_HH
00020 #define OST_MOL_IMPL_POINTER_ITERATOR_HH
00021
00022 #include <vector>
00023
00024 namespace ost { namespace mol { namespace impl {
00025
00026 template <typename T>
00027 class pointer_it : public std::iterator<std::forward_iterator_tag, T>{
00028 public:
00029 pointer_it(T* s): s_(s) { }
00030
00031 pointer_it<T>& operator++()
00032 {
00033 ++s_;
00034 return *this;
00035 }
00036 pointer_it<T>& operator+(int rhs)
00037 {
00038 s_+=rhs;
00039 return *this;
00040 }
00041
00042 bool operator==(const pointer_it<T>& rhs) const
00043 {
00044 return rhs.s_==s_;
00045 }
00046
00047 bool operator!=(const pointer_it<T>&rhs) const
00048 {
00049 return !(*this==rhs);
00050 }
00051
00052 T& operator*()
00053 {
00054 return *s_;
00055 }
00056
00057 T* operator->()
00058 {
00059 return s_;
00060 }
00061 private:
00062 T* s_;
00063 };
00064
00065 template <typename T>
00066 inline pointer_it<T> begin(const std::vector<T>& values)
00067 {
00068 return pointer_it<T>(values.empty() ? NULL : const_cast<T*>(&values.front()));
00069 }
00070
00071 template <typename T>
00072 inline pointer_it<T> end(const std::vector<T>& values)
00073 {
00074 return pointer_it<T>(values.empty() ? NULL : const_cast<T*>(&values.back()+1));
00075 }
00076
00077 }}}
00078
00079 #endif