[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