diff options
| author | Marshall Clow <mclow.lists@gmail.com> | 2016-01-13 21:54:34 +0000 |
|---|---|---|
| committer | Marshall Clow <mclow.lists@gmail.com> | 2016-01-13 21:54:34 +0000 |
| commit | 76b4afc04051298081c2f46056138b4013c2f49d (patch) | |
| tree | d527130e26d84a126910890f17fb96cf750046ee /libcxx/include/iterator | |
| parent | 183ebbe0eeab823594685eb57ebbbd5ee32eb2e1 (diff) | |
| download | bcm5719-llvm-76b4afc04051298081c2f46056138b4013c2f49d.tar.gz bcm5719-llvm-76b4afc04051298081c2f46056138b4013c2f49d.zip | |
Fix PR#25973 : 'basic_string::assign(InputIt, InputIt) doesn't provide the strong exception safety guarantee'. This turned out to be a pervasive problem in <string>, which required a fair amount of rework. Add in an optimization for when iterators provide noexcept increment/comparison/assignment/dereference (which covers many of the iterators in libc++). Reviewed as http://reviews.llvm.org/D15862
llvm-svn: 257682
Diffstat (limited to 'libcxx/include/iterator')
| -rw-r--r-- | libcxx/include/iterator | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libcxx/include/iterator b/libcxx/include/iterator index 8dd6bd59c1a..8d9b31101bd 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -437,6 +437,12 @@ struct __is_bidirectional_iterator : public __has_iterator_category_convertible_ template <class _Tp> struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {}; +template <class _Tp> +struct __is_exactly_input_iterator + : public integral_constant<bool, + __has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value && + !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {}; + template<class _Category, class _Tp, class _Distance = ptrdiff_t, class _Pointer = _Tp*, class _Reference = _Tp&> struct _LIBCPP_TYPE_VIS_ONLY iterator @@ -1404,6 +1410,23 @@ operator+(typename __wrap_iter<_Iter>::difference_type __n, return __x; } +template <class _Iter> +struct __libcpp_is_trivial_iterator + : public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<move_iterator<_Iter> > + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> > + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + + template <class _Tp, size_t _Np> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Tp* |

