diff options
| author | Howard Hinnant <hhinnant@apple.com> | 2010-09-13 01:43:27 +0000 |
|---|---|---|
| committer | Howard Hinnant <hhinnant@apple.com> | 2010-09-13 01:43:27 +0000 |
| commit | 8fb62e398a9dff0d4f61b22928acf65d8a8e59eb (patch) | |
| tree | 42f4e80c1628c021b972a1aa4a74462c72b9162d /libcxx/include | |
| parent | ac32b4ddc0ee0b5bf621209c1d8d341edff3e978 (diff) | |
| download | bcm5719-llvm-8fb62e398a9dff0d4f61b22928acf65d8a8e59eb.tar.gz bcm5719-llvm-8fb62e398a9dff0d4f61b22928acf65d8a8e59eb.zip | |
Experimenting with a new forward fomulation (kudos Daniel Kruegler), updated insert iterators to work better with pproxies, and doubled the speed of __next_prime.
llvm-svn: 113731
Diffstat (limited to 'libcxx/include')
| -rw-r--r-- | libcxx/include/iterator | 12 | ||||
| -rw-r--r-- | libcxx/include/type_traits | 24 |
2 files changed, 30 insertions, 6 deletions
diff --git a/libcxx/include/iterator b/libcxx/include/iterator index b8360909151..cda778f73d7 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -151,7 +151,7 @@ public: typedef void pointer; explicit back_insert_iterator(Container& x); - back_insert_iterator& operator=(typename Container::const_reference value); + back_insert_iterator& operator=(const typename _Container::value_type& value); back_insert_iterator& operator*(); back_insert_iterator& operator++(); back_insert_iterator operator++(int); @@ -172,7 +172,7 @@ public: typedef void pointer; explicit front_insert_iterator(Container& x); - front_insert_iterator& operator=(typename Container::const_reference value); + front_insert_iterator& operator=(const typename _Container::value_type& value); front_insert_iterator& operator*(); front_insert_iterator& operator++(); front_insert_iterator operator++(int); @@ -194,7 +194,7 @@ public: typedef void pointer; insert_iterator(Container& x, typename Container::iterator i); - insert_iterator& operator=(typename Container::const_reference value); + insert_iterator& operator=(const typename _Container::value_type& value); insert_iterator& operator*(); insert_iterator& operator++(); insert_iterator& operator++(int); @@ -624,7 +624,7 @@ public: typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(&__x) {} - _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::const_reference __value) + _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value) {container->push_back(__value); return *this;} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value) @@ -657,7 +657,7 @@ public: typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(&__x) {} - _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::const_reference __value) + _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value) {container->push_front(__value); return *this;} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value) @@ -692,7 +692,7 @@ public: _LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i) : container(&__x), iter(__i) {} - _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::const_reference __value) + _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value) {iter = container->insert(iter, __value); ++iter; return *this;} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value) diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 1d1bdc29225..e754a00d790 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -1302,6 +1302,28 @@ move(_Tp&& __t) return static_cast<typename remove_reference<_Tp>::type&&>(__t); } +#if 1 + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp&& +forward(typename std::remove_reference<_Tp>::type& __t) +{ + return static_cast<_Tp&&>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp&& +forward(typename std::remove_reference<_Tp>::type&& __t) +{ + static_assert(!std::is_lvalue_reference<_Tp>::value, + "Can not forward an rvalue as an lvalue."); + return static_cast<_Tp&&>(__t); +} + +#else + template <class _Tp, class = typename enable_if< !is_lvalue_reference<_Tp>::value @@ -1346,6 +1368,8 @@ template <class _Tp, _Tp forward(typename remove_reference<_Tp>::type&& __t) = delete; +#endif + #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES template <class _Tp> |

