Sorry if I missed it, but what about std::set? On Tue, Mar 3, 2015 at 12:10 PM, Eric Fiselier <[email protected]> wrote:
> Author: ericwf > Date: Tue Mar 3 14:10:01 2015 > New Revision: 231119 > > URL: http://llvm.org/viewvc/llvm-project?rev=231119&view=rev > Log: > Allow declaration of map and multimap iterator with incomplete mapped > type. Patch from eugenis > > Added: > > libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default_recursive.pass.cpp > Modified: > libcxx/trunk/include/__tree > libcxx/trunk/include/map > > libcxx/trunk/test/std/containers/associative/map/map.cons/default_recursive.pass.cpp > > Modified: libcxx/trunk/include/__tree > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__tree?rev=231119&r1=231118&r2=231119&view=diff > > ============================================================================== > --- libcxx/trunk/include/__tree (original) > +++ libcxx/trunk/include/__tree Tue Mar 3 14:10:01 2015 > @@ -614,8 +614,6 @@ class _LIBCPP_TYPE_VIS_ONLY __tree_itera > { > typedef _NodePtr > __node_pointer; > typedef typename pointer_traits<__node_pointer>::element_type __node; > - typedef typename __node::base > __node_base; > - typedef typename __node_base::pointer > __node_base_pointer; > > __node_pointer __ptr_; > > @@ -644,17 +642,21 @@ public: > {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} > > _LIBCPP_INLINE_VISIBILITY > - __tree_iterator& operator++() > - {__ptr_ = > static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_))); > - return *this;} > + __tree_iterator& operator++() { > + __ptr_ = static_cast<__node_pointer>( > + __tree_next(static_cast<typename > __node::base::pointer>(__ptr_))); > + return *this; > + } > _LIBCPP_INLINE_VISIBILITY > __tree_iterator operator++(int) > {__tree_iterator __t(*this); ++(*this); return __t;} > > _LIBCPP_INLINE_VISIBILITY > - __tree_iterator& operator--() > - {__ptr_ = > static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_))); > - return *this;} > + __tree_iterator& operator--() { > + __ptr_ = static_cast<__node_pointer>( > + __tree_prev(static_cast<typename > __node::base::pointer>(__ptr_))); > + return *this; > + } > _LIBCPP_INLINE_VISIBILITY > __tree_iterator operator--(int) > {__tree_iterator __t(*this); --(*this); return __t;} > @@ -683,14 +685,6 @@ class _LIBCPP_TYPE_VIS_ONLY __tree_const > { > typedef _ConstNodePtr > __node_pointer; > typedef typename pointer_traits<__node_pointer>::element_type __node; > - typedef typename __node::base > __node_base; > - typedef typename pointer_traits<__node_pointer>::template > -#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES > - rebind<__node_base> > -#else > - rebind<__node_base>::other > -#endif > - > __node_base_pointer; > > __node_pointer __ptr_; > > @@ -735,17 +729,39 @@ public: > {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);} > > _LIBCPP_INLINE_VISIBILITY > - __tree_const_iterator& operator++() > - {__ptr_ = > static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_))); > - return *this;} > + __tree_const_iterator& operator++() { > + typedef typename pointer_traits<__node_pointer>::template > +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES > + rebind<typename __node::base> > +#else > + rebind<typename __node::base>::other > +#endif > + __node_base_pointer; > + > + __ptr_ = static_cast<__node_pointer>( > + __tree_next(static_cast<__node_base_pointer>(__ptr_))); > + return *this; > + } > + > _LIBCPP_INLINE_VISIBILITY > __tree_const_iterator operator++(int) > {__tree_const_iterator __t(*this); ++(*this); return __t;} > > _LIBCPP_INLINE_VISIBILITY > - __tree_const_iterator& operator--() > - {__ptr_ = > static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_))); > - return *this;} > + __tree_const_iterator& operator--() { > + typedef typename pointer_traits<__node_pointer>::template > +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES > + rebind<typename __node::base> > +#else > + rebind<typename __node::base>::other > +#endif > + __node_base_pointer; > + > + __ptr_ = static_cast<__node_pointer>( > + __tree_prev(static_cast<__node_base_pointer>(__ptr_))); > + return *this; > + } > + > _LIBCPP_INLINE_VISIBILITY > __tree_const_iterator operator--(int) > {__tree_const_iterator __t(*this); --(*this); return __t;} > > Modified: libcxx/trunk/include/map > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/map?rev=231119&r1=231118&r2=231119&view=diff > > ============================================================================== > --- libcxx/trunk/include/map (original) > +++ libcxx/trunk/include/map Tue Mar 3 14:10:01 2015 > @@ -644,14 +644,25 @@ struct __value_type > > #endif > > +template <class _Tp> > +struct __extract_key_value_types; > + > +template <class _Key, class _Tp> > +struct __extract_key_value_types<__value_type<_Key, _Tp> > > +{ > + typedef _Key const __key_type; > + typedef _Tp __mapped_type; > +}; > + > template <class _TreeIterator> > class _LIBCPP_TYPE_VIS_ONLY __map_iterator > { > _TreeIterator __i_; > > typedef typename _TreeIterator::__pointer_traits > __pointer_traits; > - typedef const typename > _TreeIterator::value_type::value_type::first_type __key_type; > - typedef typename _TreeIterator::value_type::value_type::second_type > __mapped_type; > + typedef typename _TreeIterator::value_type __value_type; > + typedef typename __extract_key_value_types<__value_type>::__key_type > __key_type; > + typedef typename > __extract_key_value_types<__value_type>::__mapped_type __mapped_type; > public: > typedef bidirectional_iterator_tag > iterator_category; > typedef pair<__key_type, __mapped_type> > value_type; > @@ -715,8 +726,9 @@ class _LIBCPP_TYPE_VIS_ONLY __map_const_ > _TreeIterator __i_; > > typedef typename _TreeIterator::__pointer_traits > __pointer_traits; > - typedef const typename > _TreeIterator::value_type::value_type::first_type __key_type; > - typedef typename _TreeIterator::value_type::value_type::second_type > __mapped_type; > + typedef typename _TreeIterator::value_type __value_type; > + typedef typename __extract_key_value_types<__value_type>::__key_type > __key_type; > + typedef typename > __extract_key_value_types<__value_type>::__mapped_type __mapped_type; > public: > typedef bidirectional_iterator_tag > iterator_category; > typedef pair<__key_type, __mapped_type> > value_type; > @@ -736,10 +748,9 @@ public: > _LIBCPP_INLINE_VISIBILITY > __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} > _LIBCPP_INLINE_VISIBILITY > - __map_const_iterator( > - __map_iterator<typename _TreeIterator::__non_const_iterator> > __i) > - _NOEXCEPT > - : __i_(__i.__i_) {} > + __map_const_iterator(__map_iterator< > + typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT > + : __i_(__i.__i_) {} > > _LIBCPP_INLINE_VISIBILITY > reference operator*() const {return __i_->__cc;} > @@ -829,7 +840,7 @@ public: > typedef typename __alloc_traits::const_pointer const_pointer; > typedef typename __alloc_traits::size_type size_type; > typedef typename __alloc_traits::difference_type > difference_type; > - typedef __map_iterator<typename __base::iterator> iterator; > + typedef __map_iterator<typename __base::iterator> > iterator; > typedef __map_const_iterator<typename __base::const_iterator> > const_iterator; > typedef _VSTD::reverse_iterator<iterator> > reverse_iterator; > typedef _VSTD::reverse_iterator<const_iterator> > const_reverse_iterator; > > Modified: > libcxx/trunk/test/std/containers/associative/map/map.cons/default_recursive.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/map/map.cons/default_recursive.pass.cpp?rev=231119&r1=231118&r2=231119&view=diff > > ============================================================================== > --- > libcxx/trunk/test/std/containers/associative/map/map.cons/default_recursive.pass.cpp > (original) > +++ > libcxx/trunk/test/std/containers/associative/map/map.cons/default_recursive.pass.cpp > Tue Mar 3 14:10:01 2015 > @@ -15,15 +15,15 @@ > > #include <map> > > -#if !__has_feature(cxx_noexcept) > - > struct X > { > std::map<int, X> m; > + std::map<int, X>::iterator i; > + std::map<int, X>::const_iterator ci; > + std::map<int, X>::reverse_iterator ri; > + std::map<int, X>::const_reverse_iterator cri; > }; > > -#endif > - > int main() > { > } > > Added: > libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default_recursive.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default_recursive.pass.cpp?rev=231119&view=auto > > ============================================================================== > --- > libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default_recursive.pass.cpp > (added) > +++ > libcxx/trunk/test/std/containers/associative/multimap/multimap.cons/default_recursive.pass.cpp > Tue Mar 3 14:10:01 2015 > @@ -0,0 +1,29 @@ > > +//===----------------------------------------------------------------------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is dual licensed under the MIT and the University of > Illinois Open > +// Source Licenses. See LICENSE.TXT for details. > +// > > +//===----------------------------------------------------------------------===// > + > +// <map> > + > +// class multimap > + > +// multimap(); > + > +#include <map> > + > +struct X > +{ > + std::multimap<int, X> m; > + std::multimap<int, X>::iterator i; > + std::multimap<int, X>::const_iterator ci; > + std::multimap<int, X>::reverse_iterator ri; > + std::multimap<int, X>::const_reverse_iterator cri; > +}; > + > +int main() > +{ > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
