[libcxx] r231119 - Allow declaration of map and multimap iterator with incomplete mapped type. Patch from eugenis
Kostya Serebryany
kcc at google.com
Fri Mar 6 18:36:48 PST 2015
Sorry if I missed it, but what about std::set?
On Tue, Mar 3, 2015 at 12:10 PM, Eric Fiselier <eric at efcs.ca> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150306/fedd13bc/attachment.html>
More information about the cfe-commits
mailing list