Skip to content

Commit 914d1ad

Browse files
committed
Implements missing *rbegin/*rend methods
1 parent de0ac1e commit 914d1ad

File tree

4 files changed

+393
-6
lines changed

4 files changed

+393
-6
lines changed

include/mf/multi_allocator_adapter.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
// MF
1414
#include <mf/support/pointer_element_type.hpp>
15+
#include <mf/support/reverse_iterator_adapter.hpp>
1516
#include <mf/support/tuple_for_each.hpp>
1617

1718
namespace mf

include/mf/multi_field_array.hpp

Lines changed: 132 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -757,32 +757,32 @@ class BasicMultiFieldArray<
757757
template <typename ValueT> inline const ValueT* data() const { return std::get<ValueT*>(data_); }
758758

759759
/**
760-
* @brief Returns first iterator which iterates over all field simulatenously
760+
* @brief Returns first iterator which iterates over all fields simulatenously
761761
*/
762762
inline auto begin() { return view().begin(); }
763763

764764
/**
765-
* @brief Returns one-past last iterator which iterates over all field simulatenously
765+
* @brief Returns one-past last iterator which iterates over all fields simulatenously
766766
*/
767767
inline auto end() { return view().end(); }
768768

769769
/**
770-
* @brief Returns first iterator which iterates over all field simulatenously
770+
* @brief Returns first iterator which iterates over all fields simulatenously
771771
*/
772772
inline auto begin() const { return view().begin(); }
773773

774774
/**
775-
* @brief Returns one-past last iterator which iterates over all field simulatenously
775+
* @brief Returns one-past last iterator which iterates over all fields simulatenously
776776
*/
777777
inline auto end() const { return view().end(); }
778778

779779
/**
780-
* @brief Returns first iterator which iterates over all field simulatenously
780+
* @brief Returns first iterator which iterates over all fields simulatenously
781781
*/
782782
inline auto cbegin() const { return view().begin(); }
783783

784784
/**
785-
* @brief Returns one-past last iterator which iterates over all field simulatenously
785+
* @brief Returns one-past last iterator which iterates over all fields simulatenously
786786
*/
787787
inline auto cend() const { return view().end(); }
788788

@@ -858,6 +858,132 @@ class BasicMultiFieldArray<
858858
return BasicMultiFieldArray::template begin<ValueT>() + size_;
859859
}
860860

861+
/**
862+
* @brief Returns first reverse iterator which iterates over all fields simulatenously
863+
*/
864+
inline decltype(auto) rbegin() { return reverse_iterator_adapter{std::prev(end())}; }
865+
866+
/**
867+
* @brief Returns one-past last reverse iterator which iterates over all fields simulatenously
868+
*/
869+
inline decltype(auto) rend() { return reverse_iterator_adapter{std::prev(begin())}; }
870+
871+
/**
872+
* @brief Returns first reverse iterator which iterates over all fields simulatenously
873+
*/
874+
inline decltype(auto) rbegin() const { return reverse_iterator_adapter{std::prev(end())}; }
875+
876+
/**
877+
* @brief Returns one-past last reverse iterator which iterates over all fields simulatenously
878+
*/
879+
inline decltype(auto) rend() const { return reverse_iterator_adapter{std::prev(begin())}; }
880+
881+
/**
882+
* @brief Returns first reverse iterator which iterates over all fields simulatenously
883+
*/
884+
inline decltype(auto) crbegin() const { return reverse_iterator_adapter{std::prev(end())}; }
885+
886+
/**
887+
* @brief Returns one-past last reverse iterator which iterates over all fields simulatenously
888+
*/
889+
inline decltype(auto) crend() const { return reverse_iterator_adapter{std::prev(begin())}; }
890+
891+
/**
892+
* @brief Returns reverse iterator to first element in a particular field sub-array
893+
*/
894+
template <std::size_t Index> inline decltype(auto) rbegin()
895+
{
896+
return reverse_iterator_adapter{std::prev(end<Index>())};
897+
}
898+
899+
/**
900+
* @brief Returns reverse iterator to first element in a particular field sub-array
901+
*/
902+
template <typename ValueT> inline decltype(auto) rbegin()
903+
{
904+
return reverse_iterator_adapter{std::prev(end<ValueT>())};
905+
}
906+
907+
/**
908+
* @brief Returns reverse iterator to first element in a particular field sub-array
909+
*/
910+
template <std::size_t Index> inline decltype(auto) rbegin() const
911+
{
912+
return reverse_iterator_adapter{std::prev(end<Index>())};
913+
}
914+
915+
/**
916+
* @brief Returns reverse iterator to first element in a particular field sub-array
917+
*/
918+
template <typename ValueT> inline decltype(auto) rbegin() const
919+
{
920+
return reverse_iterator_adapter{std::prev(end<ValueT>())};
921+
}
922+
923+
/**
924+
* @brief Returns reverse iterator to first element in a particular field sub-array
925+
*/
926+
template <std::size_t Index> inline decltype(auto) crbegin() const
927+
{
928+
return reverse_iterator_adapter{std::prev(end<Index>())};
929+
}
930+
931+
/**
932+
* @brief Returns reverse iterator to first element in a particular field sub-array
933+
*/
934+
template <typename ValueT> inline decltype(auto) crbegin() const
935+
{
936+
return reverse_iterator_adapter{std::prev(end<ValueT>())};
937+
}
938+
939+
/**
940+
* @brief Returns reverse iterator to one past last element in a particular field sub-array
941+
*/
942+
template <std::size_t Index> inline decltype(auto) rend()
943+
{
944+
return reverse_iterator_adapter{std::prev(begin<Index>())};
945+
}
946+
947+
/**
948+
* @brief Returns reverse iterator to one past last element in a particular field sub-array
949+
*/
950+
template <typename ValueT> inline decltype(auto) rend()
951+
{
952+
return reverse_iterator_adapter{std::prev(begin<ValueT>())};
953+
}
954+
955+
/**
956+
* @brief Returns reverse iterator to one past last element in a particular field sub-array
957+
*/
958+
template <std::size_t Index> inline decltype(auto) rend() const
959+
{
960+
return reverse_iterator_adapter{std::prev(begin<Index>())};
961+
}
962+
963+
/**
964+
* @brief Returns reverse iterator to one past last element in a particular field sub-array
965+
*/
966+
template <typename ValueT> inline decltype(auto) rend() const
967+
{
968+
return reverse_iterator_adapter{std::prev(begin<ValueT>())};
969+
}
970+
971+
/**
972+
* @brief Returns reverse iterator to one past last element in a particular field sub-array
973+
*/
974+
template <std::size_t Index> inline decltype(auto) crend() const
975+
{
976+
return reverse_iterator_adapter{std::prev(begin<Index>())};
977+
}
978+
979+
/**
980+
* @brief Returns reverse iterator to one past last element in a particular field sub-array
981+
*/
982+
template <typename ValueT> inline decltype(auto) crend() const
983+
{
984+
return reverse_iterator_adapter{std::prev(begin<ValueT>())};
985+
}
986+
861987
/**
862988
* @brief Returns allocator adapter
863989
*/
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/**
2+
* @copyright 2021 MF
3+
* @author Brian Cairl
4+
*/
5+
#pragma once
6+
7+
// C++ Standard Library
8+
#include <iterator>
9+
10+
namespace mf
11+
{
12+
13+
/**
14+
* @brief Adaptor for reversing iterator direction
15+
*/
16+
template <typename UnderlyingIteratorT> class reverse_iterator_adapter
17+
{
18+
public:
19+
constexpr bool operator==(const reverse_iterator_adapter& other) const { return u_ == other.u_; }
20+
constexpr bool operator!=(const reverse_iterator_adapter& other) const { return u_ == other.u_; }
21+
constexpr bool operator<(const reverse_iterator_adapter& other) const { return u_ > other.u_; }
22+
constexpr bool operator>(const reverse_iterator_adapter& other) const { return u_ < other.u_; }
23+
constexpr bool operator<=(const reverse_iterator_adapter& other) const
24+
{
25+
return this->operator==(other) or this->operator<(other);
26+
}
27+
constexpr bool operator>=(const reverse_iterator_adapter& other) const
28+
{
29+
return this->operator==(other) or this->operator>(other);
30+
}
31+
32+
constexpr reverse_iterator_adapter& operator=(const reverse_iterator_adapter& other)
33+
{
34+
this->u_ = other.u_;
35+
return *this;
36+
}
37+
38+
constexpr std::ptrdiff_t operator-(const reverse_iterator_adapter& other) const { return other.u_ - this->u_; }
39+
40+
constexpr reverse_iterator_adapter operator-(const std::ptrdiff_t offset) const
41+
{
42+
reverse_iterator_adapter result{*this};
43+
result.u_ += offset;
44+
return result;
45+
}
46+
47+
constexpr reverse_iterator_adapter operator+(const std::ptrdiff_t offset) const
48+
{
49+
reverse_iterator_adapter result{*this};
50+
result.u_ -= offset;
51+
return result;
52+
}
53+
54+
constexpr reverse_iterator_adapter& operator-=(const std::ptrdiff_t offset)
55+
{
56+
this->u_ += offset;
57+
return *this;
58+
}
59+
60+
constexpr reverse_iterator_adapter& operator+=(const std::ptrdiff_t offset)
61+
{
62+
this->u_ -= offset;
63+
return *this;
64+
}
65+
66+
constexpr reverse_iterator_adapter& operator--()
67+
{
68+
++this->u_;
69+
return *this;
70+
}
71+
72+
constexpr reverse_iterator_adapter operator--(int)
73+
{
74+
reverse_iterator_adapter prev{*this};
75+
++prev.u_;
76+
return prev;
77+
}
78+
79+
constexpr reverse_iterator_adapter& operator++()
80+
{
81+
--this->u_;
82+
return *this;
83+
}
84+
85+
constexpr reverse_iterator_adapter operator++(int)
86+
{
87+
reverse_iterator_adapter prev{*this};
88+
--prev.u_;
89+
return prev;
90+
}
91+
92+
constexpr decltype(auto) operator*() { return *(this->u_); }
93+
94+
constexpr decltype(auto) operator*() const { return *(this->u_); }
95+
96+
explicit reverse_iterator_adapter(const UnderlyingIteratorT& underlying) : u_{underlying} {}
97+
98+
reverse_iterator_adapter(const reverse_iterator_adapter& underlying) = default;
99+
100+
reverse_iterator_adapter(reverse_iterator_adapter&& underlying) = default;
101+
102+
private:
103+
UnderlyingIteratorT u_;
104+
};
105+
106+
} // namespace mf
107+
108+
namespace std
109+
{
110+
111+
/**
112+
* @brief Specialization of \c std::iterator_traits for a valid \c reverse_iterator_adapter template instance
113+
*/
114+
template <typename UnderlyingIteratorT>
115+
struct iterator_traits<::mf::reverse_iterator_adapter<UnderlyingIteratorT>> : std::iterator_traits<UnderlyingIteratorT>
116+
{};
117+
118+
} // namespace std

0 commit comments

Comments
 (0)