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:
Eric Fiselier 2015-03-03 20:10:01 +00:00
parent 174b2b8acf
commit 9c8e663ced
4 changed files with 91 additions and 35 deletions

View File

@ -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;}

View File

@ -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

View File

@ -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()
{ {
} }

View File

@ -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()
{
}