mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-15 07:27:42 -04:00
Support for reverse iterators
This commit is contained in:
parent
7e62659471
commit
bc460e91c5
@ -21,6 +21,44 @@ size_t distance(Iterator it, Iterator end){
|
|||||||
return end - it;
|
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 >
|
template< typename Container >
|
||||||
struct back_insert_iterator {
|
struct back_insert_iterator {
|
||||||
using container_type = Container;
|
using container_type = Container;
|
||||||
|
@ -15,12 +15,18 @@ namespace std {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct iterator_traits {
|
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>
|
template <typename T>
|
||||||
struct iterator_traits <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>
|
template<class T>
|
||||||
|
@ -21,11 +21,14 @@ namespace std {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
class vector {
|
class vector {
|
||||||
public:
|
public:
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
typedef value_type* pointer_type;
|
typedef value_type* pointer_type;
|
||||||
typedef size_t size_type;
|
typedef size_t size_type;
|
||||||
typedef value_type* iterator;
|
typedef value_type* iterator;
|
||||||
typedef const value_type* const_iterator;
|
typedef const value_type* const_iterator;
|
||||||
|
|
||||||
|
using reverse_iterator = std::reverse_iterator<iterator>;
|
||||||
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T* data;
|
T* data;
|
||||||
@ -258,6 +261,24 @@ public:
|
|||||||
return const_iterator(&data[_size]);
|
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
|
// Relational operators
|
||||||
|
|
||||||
bool operator==(const vector& rhs) const {
|
bool operator==(const vector& rhs) const {
|
||||||
|
@ -108,6 +108,39 @@ void test_push_front(){
|
|||||||
check(*a.begin() == 99);
|
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
|
} //end of anonymous namespace
|
||||||
|
|
||||||
void vector_tests(){
|
void vector_tests(){
|
||||||
@ -117,4 +150,5 @@ void vector_tests(){
|
|||||||
test_erase_remove();
|
test_erase_remove();
|
||||||
test_erase_remove_if();
|
test_erase_remove_if();
|
||||||
test_push_front();
|
test_push_front();
|
||||||
|
test_reverse_iterator();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user