@@ -1680,6 +1680,23 @@ struct iterator_state {
1680
1680
bool first_or_done;
1681
1681
};
1682
1682
1683
+ template <typename Iterator, typename Sentinel, return_value_policy Policy>
1684
+ struct type_caster <iterator_state<Iterator, Sentinel, false , Policy>> :
1685
+ type_caster_base<iterator_state<Iterator, Sentinel, false , Policy>> {
1686
+ using ValueType = decltype(*std::declval<Iterator>());
1687
+ public:
1688
+ static constexpr auto name = _(" Iterator[" ) + make_caster<ValueType>::name + _(" ]" );
1689
+ };
1690
+
1691
+ template <typename Iterator, typename Sentinel, return_value_policy Policy>
1692
+ struct type_caster <iterator_state<Iterator, Sentinel, true , Policy>> :
1693
+ type_caster_base<iterator_state<Iterator, Sentinel, true , Policy>> {
1694
+ using ValueType = decltype((*std::declval<Iterator>()).first);
1695
+ public:
1696
+ static constexpr auto name = _(" Iterator[" ) + make_caster<ValueType>::name + _(" ]" );
1697
+ };
1698
+
1699
+
1683
1700
NAMESPACE_END (detail)
1684
1701
1685
1702
// / Makes a python iterator from a first and past-the-end C++ InputIterator.
@@ -1688,7 +1705,8 @@ template <return_value_policy Policy = return_value_policy::reference_internal,
1688
1705
typename Sentinel,
1689
1706
typename ValueType = decltype (*std::declval<Iterator>()),
1690
1707
typename ... Extra>
1691
- iterator make_iterator (Iterator first, Sentinel last, Extra &&... extra) {
1708
+ detail::iterator_state<Iterator, Sentinel, false , Policy>
1709
+ make_iterator (Iterator first, Sentinel last, Extra &&... extra) {
1692
1710
typedef detail::iterator_state<Iterator, Sentinel, false , Policy> state;
1693
1711
1694
1712
if (!detail::get_type_info (typeid (state), false )) {
@@ -1706,8 +1724,7 @@ iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
1706
1724
return *s.it ;
1707
1725
}, std::forward<Extra>(extra)..., Policy);
1708
1726
}
1709
-
1710
- return cast (state{first, last, true });
1727
+ return state{first, last, true };
1711
1728
}
1712
1729
1713
1730
// / Makes an python iterator over the keys (`.first`) of a iterator over pairs from a
@@ -1717,7 +1734,8 @@ template <return_value_policy Policy = return_value_policy::reference_internal,
1717
1734
typename Sentinel,
1718
1735
typename KeyType = decltype ((*std::declval<Iterator>()).first ),
1719
1736
typename ... Extra>
1720
- iterator make_key_iterator (Iterator first, Sentinel last, Extra &&... extra) {
1737
+ detail::iterator_state<Iterator, Sentinel, true , Policy>
1738
+ make_key_iterator (Iterator first, Sentinel last, Extra &&... extra) {
1721
1739
typedef detail::iterator_state<Iterator, Sentinel, true , Policy> state;
1722
1740
1723
1741
if (!detail::get_type_info (typeid (state), false )) {
@@ -1736,20 +1754,24 @@ iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
1736
1754
}, std::forward<Extra>(extra)..., Policy);
1737
1755
}
1738
1756
1739
- return cast ( state{first, last, true }) ;
1757
+ return state{first, last, true };
1740
1758
}
1741
1759
1742
1760
// / Makes an iterator over values of an stl container or other container supporting
1743
1761
// / `std::begin()`/`std::end()`
1744
1762
template <return_value_policy Policy = return_value_policy::reference_internal,
1745
- typename Type, typename ... Extra> iterator make_iterator (Type &value, Extra&&... extra) {
1763
+ typename Type, typename ... Extra>
1764
+ detail::iterator_state<decltype (std::begin (std::declval<Type&>())), decltype (std::end (std::declval<Type&>())), false , Policy>
1765
+ make_iterator (Type &value, Extra&&... extra) {
1746
1766
return make_iterator<Policy>(std::begin (value), std::end (value), extra...);
1747
1767
}
1748
1768
1749
1769
// / Makes an iterator over the keys (`.first`) of a stl map-like container supporting
1750
1770
// / `std::begin()`/`std::end()`
1751
1771
template <return_value_policy Policy = return_value_policy::reference_internal,
1752
- typename Type, typename ... Extra> iterator make_key_iterator (Type &value, Extra&&... extra) {
1772
+ typename Type, typename ... Extra>
1773
+ detail::iterator_state<decltype (std::begin (std::declval<Type&>())), decltype (std::end (std::declval<Type&>())), true , Policy>
1774
+ make_key_iterator (Type &value, Extra&&... extra) {
1753
1775
return make_key_iterator<Policy>(std::begin (value), std::end (value), extra...);
1754
1776
}
1755
1777
0 commit comments