Allow declaration of map and multimap iterator with incomplete mapped type. Patch from eugenis
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@231119 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
174b2b8acf
commit
9c8e663ced
@ -614,8 +614,6 @@ class _LIBCPP_TYPE_VIS_ONLY __tree_iterator
|
|||||||
{
|
{
|
||||||
typedef _NodePtr __node_pointer;
|
typedef _NodePtr __node_pointer;
|
||||||
typedef typename pointer_traits<__node_pointer>::element_type __node;
|
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_;
|
__node_pointer __ptr_;
|
||||||
|
|
||||||
@ -644,17 +642,21 @@ public:
|
|||||||
{return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
{return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_iterator& operator++()
|
__tree_iterator& operator++() {
|
||||||
{__ptr_ = static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_)));
|
__ptr_ = static_cast<__node_pointer>(
|
||||||
return *this;}
|
__tree_next(static_cast<typename __node::base::pointer>(__ptr_)));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_iterator operator++(int)
|
__tree_iterator operator++(int)
|
||||||
{__tree_iterator __t(*this); ++(*this); return __t;}
|
{__tree_iterator __t(*this); ++(*this); return __t;}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_iterator& operator--()
|
__tree_iterator& operator--() {
|
||||||
{__ptr_ = static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_)));
|
__ptr_ = static_cast<__node_pointer>(
|
||||||
return *this;}
|
__tree_prev(static_cast<typename __node::base::pointer>(__ptr_)));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_iterator operator--(int)
|
__tree_iterator operator--(int)
|
||||||
{__tree_iterator __t(*this); --(*this); return __t;}
|
{__tree_iterator __t(*this); --(*this); return __t;}
|
||||||
@ -683,14 +685,6 @@ class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator
|
|||||||
{
|
{
|
||||||
typedef _ConstNodePtr __node_pointer;
|
typedef _ConstNodePtr __node_pointer;
|
||||||
typedef typename pointer_traits<__node_pointer>::element_type __node;
|
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_;
|
__node_pointer __ptr_;
|
||||||
|
|
||||||
@ -735,17 +729,39 @@ public:
|
|||||||
{return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
{return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_const_iterator& operator++()
|
__tree_const_iterator& operator++() {
|
||||||
{__ptr_ = static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_)));
|
typedef typename pointer_traits<__node_pointer>::template
|
||||||
return *this;}
|
#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
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_const_iterator operator++(int)
|
__tree_const_iterator operator++(int)
|
||||||
{__tree_const_iterator __t(*this); ++(*this); return __t;}
|
{__tree_const_iterator __t(*this); ++(*this); return __t;}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_const_iterator& operator--()
|
__tree_const_iterator& operator--() {
|
||||||
{__ptr_ = static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_)));
|
typedef typename pointer_traits<__node_pointer>::template
|
||||||
return *this;}
|
#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
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__tree_const_iterator operator--(int)
|
__tree_const_iterator operator--(int)
|
||||||
{__tree_const_iterator __t(*this); --(*this); return __t;}
|
{__tree_const_iterator __t(*this); --(*this); return __t;}
|
||||||
|
25
include/map
25
include/map
@ -644,14 +644,25 @@ struct __value_type
|
|||||||
|
|
||||||
#endif
|
#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>
|
template <class _TreeIterator>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __map_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __map_iterator
|
||||||
{
|
{
|
||||||
_TreeIterator __i_;
|
_TreeIterator __i_;
|
||||||
|
|
||||||
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
|
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;
|
||||||
typedef typename _TreeIterator::value_type::value_type::second_type __mapped_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:
|
public:
|
||||||
typedef bidirectional_iterator_tag iterator_category;
|
typedef bidirectional_iterator_tag iterator_category;
|
||||||
typedef pair<__key_type, __mapped_type> value_type;
|
typedef pair<__key_type, __mapped_type> value_type;
|
||||||
@ -715,8 +726,9 @@ class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator
|
|||||||
_TreeIterator __i_;
|
_TreeIterator __i_;
|
||||||
|
|
||||||
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
|
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;
|
||||||
typedef typename _TreeIterator::value_type::value_type::second_type __mapped_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:
|
public:
|
||||||
typedef bidirectional_iterator_tag iterator_category;
|
typedef bidirectional_iterator_tag iterator_category;
|
||||||
typedef pair<__key_type, __mapped_type> value_type;
|
typedef pair<__key_type, __mapped_type> value_type;
|
||||||
@ -736,9 +748,8 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
|
__map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__map_const_iterator(
|
__map_const_iterator(__map_iterator<
|
||||||
__map_iterator<typename _TreeIterator::__non_const_iterator> __i)
|
typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
|
||||||
_NOEXCEPT
|
|
||||||
: __i_(__i.__i_) {}
|
: __i_(__i.__i_) {}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
@ -15,15 +15,15 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#if !__has_feature(cxx_noexcept)
|
|
||||||
|
|
||||||
struct X
|
struct X
|
||||||
{
|
{
|
||||||
std::map<int, X> m;
|
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()
|
int main()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
{
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user