Needs to be done in a separate patch.
On Sat, Mar 7, 2015 at 5:36 AM, Kostya Serebryany <[email protected]> wrote: > 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 > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
