Skip to content

Commit 0d55e4c

Browse files
committed
Add rvalue ref overloads
1 parent f985c98 commit 0d55e4c

3 files changed

Lines changed: 61 additions & 11 deletions

File tree

‎rules/iterator_category/src.cpp‎

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,18 @@ decltype(*std::declval<const T1 &>()) f5(const T1 &a0) {
132132
}
133133

134134
template <
135-
typename T1, typename T2 = typename std::iterator_traits<T1>::value_type,
135+
typename T3, typename T1 = typename std::remove_reference<T3>::type,
136+
typename T2 = typename std::iterator_traits<T1>::value_type,
136137
typename = typename std::enable_if<
137138
(std::is_base_of<
138139
std::input_iterator_tag,
139140
typename std::iterator_traits<T1>::iterator_category>::value ||
140141
std::is_base_of<
141142
std::output_iterator_tag,
142143
typename std::iterator_traits<T1>::iterator_category>::value) &&
143-
!std::is_pointer<T1>::value>::type>
144-
T1 &f6(T1 &a0) {
144+
!std::is_pointer<T1>::value &&
145+
std::is_lvalue_reference<T3>::value>::type>
146+
T1 &f6(T3 &&a0) {
145147
return ++a0;
146148
}
147149

@@ -192,14 +194,15 @@ bool f10(const T1 &a0, const T1 &a1) {
192194
return a0 != a1;
193195
}
194196

195-
template <
196-
typename T1, typename T2 = typename std::iterator_traits<T1>::value_type,
197-
typename = typename std::enable_if<
198-
std::is_base_of<
199-
std::bidirectional_iterator_tag,
200-
typename std::iterator_traits<T1>::iterator_category>::value &&
201-
!std::is_pointer<T1>::value>::type>
202-
T1 &f11(T1 &a0) {
197+
template <typename T3, typename T1 = typename std::remove_reference<T3>::type,
198+
typename T2 = typename std::iterator_traits<T1>::value_type,
199+
typename = typename std::enable_if<
200+
std::is_base_of<std::bidirectional_iterator_tag,
201+
typename std::iterator_traits<
202+
T1>::iterator_category>::value &&
203+
!std::is_pointer<T1>::value &&
204+
std::is_lvalue_reference<T3>::value>::type>
205+
T1 &f11(T3 &&a0) {
203206
return --a0;
204207
}
205208

@@ -357,3 +360,30 @@ template <
357360
T1 f24(const T2 &a0) {
358361
return T1(a0);
359362
}
363+
364+
template <
365+
typename T3, typename T1 = typename std::remove_reference<T3>::type,
366+
typename T2 = typename std::iterator_traits<T1>::value_type,
367+
typename = typename std::enable_if<
368+
(std::is_base_of<
369+
std::input_iterator_tag,
370+
typename std::iterator_traits<T1>::iterator_category>::value ||
371+
std::is_base_of<
372+
std::output_iterator_tag,
373+
typename std::iterator_traits<T1>::iterator_category>::value) &&
374+
!std::is_pointer<T1>::value && !std::is_reference<T3>::value>::type>
375+
T1 &f25(T3 &&a0) {
376+
return ++a0;
377+
}
378+
379+
template <
380+
typename T3, typename T1 = typename std::remove_reference<T3>::type,
381+
typename T2 = typename std::iterator_traits<T1>::value_type,
382+
typename = typename std::enable_if<
383+
std::is_base_of<
384+
std::bidirectional_iterator_tag,
385+
typename std::iterator_traits<T1>::iterator_category>::value &&
386+
!std::is_pointer<T1>::value && !std::is_reference<T3>::value>::type>
387+
T1 &f26(T3 &&a0) {
388+
return --a0;
389+
}

‎rules/iterator_category/tgt_refcount.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,13 @@ fn f23<T1: CppRandomAccessIterator<T2>, T2>(a0: T1, a1: T1) -> bool {
118118
fn f24<T1: From<T2>, T2>(a0: T2) -> T1 {
119119
<T1>::from(a0)
120120
}
121+
122+
fn f25<T1: CppIterator<T2>, T2>(a0: T1) -> T1 {
123+
let mut __it = a0;
124+
__it.iter_inc()
125+
}
126+
127+
fn f26<T1: CppBidirectionalIterator<T2>, T2>(a0: T1) -> T1 {
128+
let mut __it = a0;
129+
__it.iter_dec()
130+
}

‎rules/iterator_category/tgt_unsafe.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,13 @@ unsafe fn f23<T1: UnsafeCppRandomAccessIterator<T2>, T2>(a0: T1, a1: T1) -> bool
118118
unsafe fn f24<T1: From<T2>, T2>(a0: T2) -> T1 {
119119
<T1>::from(a0)
120120
}
121+
122+
unsafe fn f25<T1: UnsafeCppIterator<T2>, T2>(a0: T1) -> T1 {
123+
let mut __it = a0;
124+
__it.iter_inc()
125+
}
126+
127+
unsafe fn f26<T1: UnsafeCppBidirectionalIterator<T2>, T2>(a0: T1) -> T1 {
128+
let mut __it = a0;
129+
__it.iter_dec()
130+
}

0 commit comments

Comments
 (0)