Support for reverse iterators

This commit is contained in:
Baptiste Wicht 2016-09-10 20:09:18 +02:00
parent 7e62659471
commit bc460e91c5
4 changed files with 106 additions and 7 deletions

View File

@ -21,6 +21,44 @@ size_t distance(Iterator it, Iterator end){
return end - it;
}
template< typename Iterator>
struct reverse_iterator {
using iterator_type = Iterator;
using value_type = typename std::iterator_traits<Iterator>::value_type;
using difference_type = typename std::iterator_traits<Iterator>::difference_type;
using pointer = typename std::iterator_traits<Iterator>::pointer;
using reference = typename std::iterator_traits<Iterator>::reference;
reverse_iterator(Iterator it) : it(it) {
//Nothing else
}
reference operator*(){
return *it;
}
reverse_iterator& operator++(){
--it;
return *this;
}
reverse_iterator& operator--(){
++it;
return *this;
}
bool operator==(const reverse_iterator& rhs){
return it == rhs.it;
}
bool operator!=(const reverse_iterator& rhs){
return it != rhs.it;
}
private:
iterator_type it;
};
template< typename Container >
struct back_insert_iterator {
using container_type = Container;

View File

@ -15,12 +15,18 @@ namespace std {
template <typename T>
struct iterator_traits {
using value_type = typename T::value_type;
using value_type = typename T::value_type;
using reference = typename T::reference;
using pointer = typename T::pointer;
using difference_type = typename T::difference_type;
};
template <typename T>
struct iterator_traits <T*> {
using value_type = T;
using value_type = T;
using reference = T&;
using pointer = T*;
using difference_type = size_t;
};
template<class T>

View File

@ -21,11 +21,14 @@ namespace std {
template<typename T>
class vector {
public:
typedef T value_type;
typedef value_type* pointer_type;
typedef size_t size_type;
typedef value_type* iterator;
typedef const value_type* const_iterator;
typedef T value_type;
typedef value_type* pointer_type;
typedef size_t size_type;
typedef value_type* iterator;
typedef const value_type* const_iterator;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
private:
T* data;
@ -258,6 +261,24 @@ public:
return const_iterator(&data[_size]);
}
//Iterators
reverse_iterator rbegin(){
return iterator(&data[_size] - 1);
}
constexpr const_reverse_iterator rbegin() const {
return const_iterator(&data[_size - 1]);
}
reverse_iterator rend(){
return reverse_iterator(&data[-1]);
}
constexpr const_reverse_iterator rend() const {
return const_reverse_iterator(&data[-1]);
}
// Relational operators
bool operator==(const vector& rhs) const {

View File

@ -108,6 +108,39 @@ void test_push_front(){
check(*a.begin() == 99);
}
void test_reverse_iterator(){
std::vector<int> a{1, 0, 0, 2, 3, 4};
auto it = a.rbegin();
auto end = a.rend();
check(it != end, "Invalid reverse iterator");
check(*it == 4, "Invalid reverse iterator");
++it;
check(it != end, "Invalid reverse iterator");
check(*it == 3, "Invalid reverse iterator");
++it;
check(it != end, "Invalid reverse iterator");
check(*it == 2, "Invalid reverse iterator");
++it;
check(it != end, "Invalid reverse iterator");
check(*it == 0, "Invalid reverse iterator");
++it;
check(it != end, "Invalid reverse iterator");
check(*it == 0, "Invalid reverse iterator");
++it;
check(it != end, "Invalid reverse iterator");
check(*it == 1, "Invalid reverse iterator");
++it;
check(it == end, "Invalid reverse iterator");
}
} //end of anonymous namespace
void vector_tests(){
@ -117,4 +150,5 @@ void vector_tests(){
test_erase_remove();
test_erase_remove_if();
test_push_front();
test_reverse_iterator();
}