diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-01-11 14:44:15 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-01-11 14:44:15 +0000 |
commit | b744bf4e18d4c1422cdffbfeed30490252b3f64e (patch) | |
tree | 48847db03ec1196eef3c45fb526c01628aba990d | |
parent | b091b8dc0b9fdfe157da5a738e8cbb360143fc9e (diff) | |
download | gcc-b744bf4e18d4c1422cdffbfeed30490252b3f64e.zip gcc-b744bf4e18d4c1422cdffbfeed30490252b3f64e.tar.gz gcc-b744bf4e18d4c1422cdffbfeed30490252b3f64e.tar.bz2 |
PR78134 fix return types of heterogeneous lookup functions
PR libstdc++/78134
* include/bits/stl_map.h (map::lower_bound, map::upper_bound)
(map::equal_range): Fix return type of heterogeneous overloads.
* include/bits/stl_multimap.h (multimap::lower_bound)
(multimap::upper_bound, multimap::equal_range): Likewise.
* include/bits/stl_multiset.h (multiset::lower_bound)
(multiset::upper_bound, multiset::equal_range): Likewise.
* include/bits/stl_set.h (set::lower_bound, set::upper_bound)
(set::equal_range): Likewise.
* testsuite/23_containers/map/operations/2.cc
* testsuite/23_containers/multimap/operations/2.cc
* testsuite/23_containers/multiset/operations/2.cc
* testsuite/23_containers/set/operations/2.cc
From-SVN: r244318
-rw-r--r-- | libstdc++-v3/ChangeLog | 14 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_map.h | 28 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multimap.h | 28 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multiset.h | 24 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_set.h | 24 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/map/operations/2.cc | 27 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/multimap/operations/2.cc | 27 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/multiset/operations/2.cc | 27 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/set/operations/2.cc | 27 |
9 files changed, 158 insertions, 68 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b52d6df..35fbb95 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,19 @@ 2017-01-11 Jonathan Wakely <jwakely@redhat.com> + PR libstdc++/78134 + * include/bits/stl_map.h (map::lower_bound, map::upper_bound) + (map::equal_range): Fix return type of heterogeneous overloads. + * include/bits/stl_multimap.h (multimap::lower_bound) + (multimap::upper_bound, multimap::equal_range): Likewise. + * include/bits/stl_multiset.h (multiset::lower_bound) + (multiset::upper_bound, multiset::equal_range): Likewise. + * include/bits/stl_set.h (set::lower_bound, set::upper_bound) + (set::equal_range): Likewise. + * testsuite/23_containers/map/operations/2.cc + * testsuite/23_containers/multimap/operations/2.cc + * testsuite/23_containers/multiset/operations/2.cc + * testsuite/23_containers/set/operations/2.cc + PR libstdc++/78273 * include/bits/stl_map.h (map::count<_Kt>(const _Kt&)): Don't assume the heterogeneous comparison can only find one match. diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index 91b80d9..194ce42 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -1218,8 +1218,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto lower_bound(const _Kt& __x) - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(iterator(_M_t._M_lower_bound_tr(__x))) + { return iterator(_M_t._M_lower_bound_tr(__x)); } #endif //@} @@ -1243,8 +1243,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto lower_bound(const _Kt& __x) const - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(const_iterator(_M_t._M_lower_bound_tr(__x))) + { return const_iterator(_M_t._M_lower_bound_tr(__x)); } #endif //@} @@ -1263,8 +1263,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto upper_bound(const _Kt& __x) - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(iterator(_M_t._M_upper_bound_tr(__x))) + { return iterator(_M_t._M_upper_bound_tr(__x)); } #endif //@} @@ -1283,8 +1283,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto upper_bound(const _Kt& __x) const - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(const_iterator(_M_t._M_upper_bound_tr(__x))) + { return const_iterator(_M_t._M_upper_bound_tr(__x)); } #endif //@} @@ -1312,8 +1312,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto equal_range(const _Kt& __x) - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x))) + { return pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)); } #endif //@} @@ -1341,8 +1341,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto equal_range(const _Kt& __x) const - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<const_iterator, const_iterator>( + _M_t._M_equal_range_tr(__x))) + { + return pair<const_iterator, const_iterator>( + _M_t._M_equal_range_tr(__x)); + } #endif //@} diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index 98af1ba..8b37de9 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -887,8 +887,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto lower_bound(const _Kt& __x) - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(iterator(_M_t._M_lower_bound_tr(__x))) + { return iterator(_M_t._M_lower_bound_tr(__x)); } #endif //@} @@ -912,8 +912,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto lower_bound(const _Kt& __x) const - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(const_iterator(_M_t._M_lower_bound_tr(__x))) + { return const_iterator(_M_t._M_lower_bound_tr(__x)); } #endif //@} @@ -932,8 +932,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto upper_bound(const _Kt& __x) - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(iterator(_M_t._M_upper_bound_tr(__x))) + { return iterator(_M_t._M_upper_bound_tr(__x)); } #endif //@} @@ -952,8 +952,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto upper_bound(const _Kt& __x) const - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(const_iterator(_M_t._M_upper_bound_tr(__x))) + { return const_iterator(_M_t._M_upper_bound_tr(__x)); } #endif //@} @@ -979,8 +979,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto equal_range(const _Kt& __x) - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x))) + { return pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)); } #endif //@} @@ -1006,8 +1006,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto equal_range(const _Kt& __x) const - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<const_iterator, const_iterator>( + _M_t._M_equal_range_tr(__x))) + { + return pair<const_iterator, const_iterator>( + _M_t._M_equal_range_tr(__x)); + } #endif //@} diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index e2bc4f2..871369c 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -785,14 +785,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto lower_bound(const _Kt& __x) - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(iterator(_M_t._M_lower_bound_tr(__x))) + { return iterator(_M_t._M_lower_bound_tr(__x)); } template<typename _Kt> auto lower_bound(const _Kt& __x) const - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(iterator(_M_t._M_lower_bound_tr(__x))) + { return iterator(_M_t._M_lower_bound_tr(__x)); } #endif //@} @@ -815,14 +815,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto upper_bound(const _Kt& __x) - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(iterator(_M_t._M_upper_bound_tr(__x))) + { return iterator(_M_t._M_upper_bound_tr(__x)); } template<typename _Kt> auto upper_bound(const _Kt& __x) const - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(iterator(_M_t._M_upper_bound_tr(__x))) + { return iterator(_M_t._M_upper_bound_tr(__x)); } #endif //@} @@ -854,14 +854,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto equal_range(const _Kt& __x) - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x))) + { return pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)); } template<typename _Kt> auto equal_range(const _Kt& __x) const - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x))) + { return pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)); } #endif //@} diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index ab960f1..3decaff 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -804,14 +804,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto lower_bound(const _Kt& __x) - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(iterator(_M_t._M_lower_bound_tr(__x))) + { return iterator(_M_t._M_lower_bound_tr(__x)); } template<typename _Kt> auto lower_bound(const _Kt& __x) const - -> decltype(_M_t._M_lower_bound_tr(__x)) - { return _M_t._M_lower_bound_tr(__x); } + -> decltype(const_iterator(_M_t._M_lower_bound_tr(__x))) + { return const_iterator(_M_t._M_lower_bound_tr(__x)); } #endif //@} @@ -834,14 +834,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto upper_bound(const _Kt& __x) - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(iterator(_M_t._M_upper_bound_tr(__x))) + { return iterator(_M_t._M_upper_bound_tr(__x)); } template<typename _Kt> auto upper_bound(const _Kt& __x) const - -> decltype(_M_t._M_upper_bound_tr(__x)) - { return _M_t._M_upper_bound_tr(__x); } + -> decltype(iterator(_M_t._M_upper_bound_tr(__x))) + { return const_iterator(_M_t._M_upper_bound_tr(__x)); } #endif //@} @@ -873,14 +873,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER template<typename _Kt> auto equal_range(const _Kt& __x) - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x))) + { return pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)); } template<typename _Kt> auto equal_range(const _Kt& __x) const - -> decltype(_M_t._M_equal_range_tr(__x)) - { return _M_t._M_equal_range_tr(__x); } + -> decltype(pair<iterator, iterator>(_M_t._M_equal_range_tr(__x))) + { return pair<iterator, iterator>(_M_t._M_equal_range_tr(__x)); } #endif //@} diff --git a/libstdc++-v3/testsuite/23_containers/map/operations/2.cc b/libstdc++-v3/testsuite/23_containers/map/operations/2.cc index ef4e76b..a301025 100644 --- a/libstdc++-v3/testsuite/23_containers/map/operations/2.cc +++ b/libstdc++-v3/testsuite/23_containers/map/operations/2.cc @@ -53,7 +53,7 @@ test01() cit = cx.find(2L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); static_assert(std::is_same<decltype(it), test_type::iterator>::value, "find returns iterator"); @@ -76,7 +76,7 @@ test02() cn = cx.count(2L); VERIFY( cn == 0 ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); } void @@ -94,7 +94,12 @@ test03() cit = cx.lower_bound(2L); VERIFY( cit != cx.end() && cit->second == '4' ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "lower_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const lower_bound returns const_iterator"); } void @@ -112,7 +117,12 @@ test04() cit = cx.upper_bound(3L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "upper_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const upper_bound returns const_iterator"); } void @@ -130,7 +140,14 @@ test05() cit = cx.equal_range(2L); VERIFY( cit.first == cit.second && cit.first != cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + using pair = std::pair<test_type::iterator, test_type::iterator>; + static_assert(std::is_same<decltype(it), pair>::value, + "equal_range returns pair<iterator, iterator>"); + using cpair = std::pair<test_type::const_iterator, test_type::const_iterator>; + static_assert(std::is_same<decltype(cit), cpair>::value, + "const equal_range returns pair<const_iterator, const_iterator>"); } void diff --git a/libstdc++-v3/testsuite/23_containers/multimap/operations/2.cc b/libstdc++-v3/testsuite/23_containers/multimap/operations/2.cc index 06e084d..01a10f6 100644 --- a/libstdc++-v3/testsuite/23_containers/multimap/operations/2.cc +++ b/libstdc++-v3/testsuite/23_containers/multimap/operations/2.cc @@ -53,7 +53,7 @@ test01() cit = cx.find(2L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); static_assert(std::is_same<decltype(it), test_type::iterator>::value, "find returns iterator"); @@ -76,7 +76,7 @@ test02() cn = cx.count(2L); VERIFY( cn == 0 ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); } void @@ -94,7 +94,12 @@ test03() cit = cx.lower_bound(2L); VERIFY( cit != cx.end() && cit->second == '4' ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "lower_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const lower_bound returns const_iterator"); } void @@ -112,7 +117,12 @@ test04() cit = cx.upper_bound(3L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "upper_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const upper_bound returns const_iterator"); } void @@ -131,7 +141,14 @@ test05() cit = cx.equal_range(2L); VERIFY( cit.first == cit.second && cit.first != cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + using pair = std::pair<test_type::iterator, test_type::iterator>; + static_assert(std::is_same<decltype(it), pair>::value, + "equal_range returns pair<iterator, iterator>"); + using cpair = std::pair<test_type::const_iterator, test_type::const_iterator>; + static_assert(std::is_same<decltype(cit), cpair>::value, + "const equal_range returns pair<const_iterator, const_iterator>"); } diff --git a/libstdc++-v3/testsuite/23_containers/multiset/operations/2.cc b/libstdc++-v3/testsuite/23_containers/multiset/operations/2.cc index 890016b..9468151 100644 --- a/libstdc++-v3/testsuite/23_containers/multiset/operations/2.cc +++ b/libstdc++-v3/testsuite/23_containers/multiset/operations/2.cc @@ -53,7 +53,7 @@ test01() cit = cx.find(2L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); static_assert(std::is_same<decltype(it), test_type::iterator>::value, "find returns iterator"); @@ -76,7 +76,7 @@ test02() cn = cx.count(2L); VERIFY( cn == 0 ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); } void @@ -94,7 +94,12 @@ test03() cit = cx.lower_bound(2L); VERIFY( cit != cx.end() && *cit == 3 ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "lower_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const lower_bound returns const_iterator"); } void @@ -112,7 +117,12 @@ test04() cit = cx.upper_bound(5L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "upper_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const upper_bound returns const_iterator"); } void @@ -131,7 +141,14 @@ test05() cit = cx.equal_range(2L); VERIFY( cit.first == cit.second && cit.first != cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + using pair = std::pair<test_type::iterator, test_type::iterator>; + static_assert(std::is_same<decltype(it), pair>::value, + "equal_range returns pair<iterator, iterator>"); + using cpair = std::pair<test_type::const_iterator, test_type::const_iterator>; + static_assert(std::is_same<decltype(cit), cpair>::value, + "const equal_range returns pair<const_iterator, const_iterator>"); } diff --git a/libstdc++-v3/testsuite/23_containers/set/operations/2.cc b/libstdc++-v3/testsuite/23_containers/set/operations/2.cc index aef808d..acddb18 100644 --- a/libstdc++-v3/testsuite/23_containers/set/operations/2.cc +++ b/libstdc++-v3/testsuite/23_containers/set/operations/2.cc @@ -53,7 +53,7 @@ test01() cit = cx.find(2L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); static_assert(std::is_same<decltype(it), test_type::iterator>::value, "find returns iterator"); @@ -76,7 +76,7 @@ test02() cn = cx.count(2L); VERIFY( cn == 0 ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); } void @@ -94,7 +94,12 @@ test03() cit = cx.lower_bound(2L); VERIFY( cit != cx.end() && *cit == 3 ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "lower_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const lower_bound returns const_iterator"); } void @@ -112,7 +117,12 @@ test04() cit = cx.upper_bound(5L); VERIFY( cit == cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + static_assert(std::is_same<decltype(it), test_type::iterator>::value, + "upper_bound returns iterator"); + static_assert(std::is_same<decltype(cit), test_type::const_iterator>::value, + "const upper_bound returns const_iterator"); } void @@ -130,7 +140,14 @@ test05() cit = cx.equal_range(2L); VERIFY( cit.first == cit.second && cit.first != cx.end() ); - VERIFY( Cmp::count == 0); + VERIFY( Cmp::count == 0 ); + + using pair = std::pair<test_type::iterator, test_type::iterator>; + static_assert(std::is_same<decltype(it), pair>::value, + "equal_range returns pair<iterator, iterator>"); + using cpair = std::pair<test_type::const_iterator, test_type::const_iterator>; + static_assert(std::is_same<decltype(cit), cpair>::value, + "const equal_range returns pair<const_iterator, const_iterator>"); } void |