[libcxx] r231119 - Allow declaration of map and multimap iterator with incomplete mapped type. Patch from eugenis

Evgeniy Stepanov eugeni.stepanov at gmail.com
Mon Apr 6 03:56:32 PDT 2015


Needs to be done in a separate patch.

On Sat, Mar 7, 2015 at 5:36 AM, Kostya Serebryany <kcc at google.com> wrote:
> 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
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list