diff --git a/libcxx/include/iterator b/libcxx/include/iterator index 33becab9020b..f1a4f9c960a5 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -325,11 +325,11 @@ template T* end(T (&array)[N]); _LIBCPP_BEGIN_NAMESPACE_STD -struct input_iterator_tag {}; -struct output_iterator_tag {}; -struct forward_iterator_tag : public input_iterator_tag {}; -struct bidirectional_iterator_tag : public forward_iterator_tag {}; -struct random_access_iterator_tag : public bidirectional_iterator_tag {}; +struct _LIBCPP_VISIBLE input_iterator_tag {}; +struct _LIBCPP_VISIBLE output_iterator_tag {}; +struct _LIBCPP_VISIBLE forward_iterator_tag : public input_iterator_tag {}; +struct _LIBCPP_VISIBLE bidirectional_iterator_tag : public forward_iterator_tag {}; +struct _LIBCPP_VISIBLE random_access_iterator_tag : public bidirectional_iterator_tag {}; template struct __has_iterator_category @@ -372,11 +372,11 @@ struct __iterator_traits<_Iter, true> // the client expects instead of failing at compile time. template -struct iterator_traits +struct _LIBCPP_VISIBLE iterator_traits : __iterator_traits<_Iter, __has_iterator_category<_Iter>::value> {}; template -struct iterator_traits<_Tp*> +struct _LIBCPP_VISIBLE iterator_traits<_Tp*> { typedef ptrdiff_t difference_type; typedef typename remove_const<_Tp>::type value_type; @@ -407,7 +407,7 @@ struct __is_random_access_iterator : public __has_iterator_category_convertible_ template -struct iterator +struct _LIBCPP_VISIBLE iterator { typedef _Tp value_type; typedef _Distance difference_type; @@ -482,7 +482,7 @@ distance(_InputIter __first, _InputIter __last) } template -inline +inline _LIBCPP_INLINE_VISIBILITY _ForwardIter next(_ForwardIter __x, typename iterator_traits<_ForwardIter>::difference_type __n = 1, @@ -493,7 +493,7 @@ next(_ForwardIter __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY _BidiretionalIter prev(_BidiretionalIter __x, typename iterator_traits<_BidiretionalIter>::difference_type __n = 1, @@ -504,7 +504,7 @@ prev(_BidiretionalIter __x, } template -class reverse_iterator +class _LIBCPP_VISIBLE reverse_iterator : public iterator::iterator_category, typename iterator_traits<_Iter>::value_type, typename iterator_traits<_Iter>::difference_type, @@ -611,7 +611,7 @@ operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_i } template -class back_insert_iterator +class _LIBCPP_VISIBLE back_insert_iterator : public iterator -class front_insert_iterator +class _LIBCPP_VISIBLE front_insert_iterator : public iterator -class insert_iterator +class _LIBCPP_VISIBLE insert_iterator : public iterator, class _Distance = ptrdiff_t> -class istream_iterator +class _LIBCPP_VISIBLE istream_iterator : public iterator { public: @@ -752,7 +752,7 @@ public: }; template > -class ostream_iterator +class _LIBCPP_VISIBLE ostream_iterator : public iterator { public: @@ -781,7 +781,7 @@ public: }; template -class istreambuf_iterator +class _LIBCPP_VISIBLE istreambuf_iterator : public iterator @@ -806,6 +806,7 @@ private: _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;} }; + _LIBCPP_INLINE_VISIBILITY void __test_for_eof() { if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof())) @@ -820,7 +821,7 @@ public: _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) throw() : __sbuf_(__p.__sbuf_) {} - _LIBCPP_INLINE_VISIBILITY _CharT operator*() const {return __sbuf_->sgetc();} + _LIBCPP_INLINE_VISIBILITY _CharT operator*() const {return __sbuf_->sgetc();} _LIBCPP_INLINE_VISIBILITY char_type* operator->() const {return nullptr;} _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++() { @@ -852,7 +853,7 @@ bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a, {return !__a.equal(__b);} template -class ostreambuf_iterator +class _LIBCPP_VISIBLE ostreambuf_iterator : public iterator { public: @@ -880,7 +881,7 @@ public: }; template -class move_iterator +class _LIBCPP_VISIBLE move_iterator { private: _Iter __i; @@ -1618,7 +1619,7 @@ operator+(typename __debug_iter<_Container, _Iter>::difference_type __n, #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_DECLTYPE) template -inline +inline _LIBCPP_INLINE_VISIBILITY auto begin(_C& __c) -> decltype(__c.begin()) { @@ -1626,7 +1627,7 @@ begin(_C& __c) -> decltype(__c.begin()) } template -inline +inline _LIBCPP_INLINE_VISIBILITY auto begin(const _C& __c) -> decltype(__c.begin()) { @@ -1634,7 +1635,7 @@ begin(const _C& __c) -> decltype(__c.begin()) } template -inline +inline _LIBCPP_INLINE_VISIBILITY auto end(_C& __c) -> decltype(__c.end()) { @@ -1642,7 +1643,7 @@ end(_C& __c) -> decltype(__c.end()) } template -inline +inline _LIBCPP_INLINE_VISIBILITY auto end(const _C& __c) -> decltype(__c.end()) { @@ -1652,7 +1653,7 @@ end(const _C& __c) -> decltype(__c.end()) #else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_DECLTYPE) template -inline +inline _LIBCPP_INLINE_VISIBILITY typename _C::iterator begin(_C& __c) { @@ -1660,7 +1661,7 @@ begin(_C& __c) } template -inline +inline _LIBCPP_INLINE_VISIBILITY typename _C::const_iterator begin(const _C& __c) { @@ -1668,7 +1669,7 @@ begin(const _C& __c) } template -inline +inline _LIBCPP_INLINE_VISIBILITY typename _C::iterator end(_C& __c) { @@ -1676,7 +1677,7 @@ end(_C& __c) } template -inline +inline _LIBCPP_INLINE_VISIBILITY typename _C::const_iterator end(const _C& __c) { @@ -1686,7 +1687,7 @@ end(const _C& __c) #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_DECLTYPE) template -inline +inline _LIBCPP_INLINE_VISIBILITY _T* begin(_T (&__array)[_N]) { @@ -1694,7 +1695,7 @@ begin(_T (&__array)[_N]) } template -inline +inline _LIBCPP_INLINE_VISIBILITY _T* end(_T (&__array)[_N]) { diff --git a/libcxx/include/limits b/libcxx/include/limits index 34d73a0e8926..ae8694ccecc4 100644 --- a/libcxx/include/limits +++ b/libcxx/include/limits @@ -425,7 +425,7 @@ protected: }; template -class numeric_limits +class _LIBCPP_VISIBLE numeric_limits : private __libcpp_numeric_limits::type> { typedef __libcpp_numeric_limits::type> __base; @@ -471,7 +471,7 @@ public: }; template -class numeric_limits +class _LIBCPP_VISIBLE numeric_limits : private numeric_limits<_Tp> { typedef numeric_limits<_Tp> __base; @@ -517,7 +517,7 @@ public: }; template -class numeric_limits +class _LIBCPP_VISIBLE numeric_limits : private numeric_limits<_Tp> { typedef numeric_limits<_Tp> __base; @@ -563,7 +563,7 @@ public: }; template -class numeric_limits +class _LIBCPP_VISIBLE numeric_limits : private numeric_limits<_Tp> { typedef numeric_limits<_Tp> __base; diff --git a/libcxx/include/list b/libcxx/include/list index 0336c9fa38d7..e6e8d512189a 100644 --- a/libcxx/include/list +++ b/libcxx/include/list @@ -187,6 +187,7 @@ struct __list_node_base pointer __prev_; pointer __next_; + _LIBCPP_INLINE_VISIBILITY __list_node_base() : __prev_(static_cast(this)), __next_(static_cast(this)) @@ -205,7 +206,7 @@ template class __list_imp; template class __list_const_iterator; template -class __list_iterator +class _LIBCPP_VISIBLE __list_iterator { typedef typename pointer_traits<_VoidPtr>::template #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES @@ -216,6 +217,7 @@ class __list_iterator __node_pointer __ptr_; + _LIBCPP_INLINE_VISIBILITY explicit __list_iterator(__node_pointer __p) : __ptr_(__p) {} template friend class list; @@ -234,23 +236,31 @@ public: pointer; typedef typename pointer_traits::difference_type difference_type; + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &(operator*());} + _LIBCPP_INLINE_VISIBILITY __list_iterator& operator++() {__ptr_ = __ptr_->__next_; return *this;} + _LIBCPP_INLINE_VISIBILITY __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;} + _LIBCPP_INLINE_VISIBILITY __list_iterator& operator--() {__ptr_ = __ptr_->__prev_; return *this;} + _LIBCPP_INLINE_VISIBILITY __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;} - friend bool operator==(const __list_iterator& __x, const __list_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __list_iterator& __x, const __list_iterator& __y) {return __x.__ptr_ == __y.__ptr_;} - friend bool operator!=(const __list_iterator& __x, const __list_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __list_iterator& __x, const __list_iterator& __y) {return !(__x == __y);} }; template -class __list_const_iterator +class _LIBCPP_VISIBLE __list_const_iterator { typedef typename pointer_traits<_VoidPtr>::template #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES @@ -261,6 +271,7 @@ class __list_const_iterator __node_pointer __ptr_; + _LIBCPP_INLINE_VISIBILITY explicit __list_const_iterator(__node_pointer __p) : __ptr_(__p) {} template friend class list; @@ -278,20 +289,29 @@ public: pointer; typedef typename pointer_traits::difference_type difference_type; + _LIBCPP_INLINE_VISIBILITY __list_const_iterator(__list_iterator<_Tp, _VoidPtr> __p) : __ptr_(__p.__ptr_) {} + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &(operator*());} + _LIBCPP_INLINE_VISIBILITY __list_const_iterator& operator++() {__ptr_ = __ptr_->__next_; return *this;} + _LIBCPP_INLINE_VISIBILITY __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;} + _LIBCPP_INLINE_VISIBILITY __list_const_iterator& operator--() {__ptr_ = __ptr_->__prev_; return *this;} + _LIBCPP_INLINE_VISIBILITY __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;} - friend bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y) {return __x.__ptr_ == __y.__ptr_;} - friend bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y) {return !(__x == __y);} }; @@ -327,9 +347,13 @@ protected: __node_base __end_; __compressed_pair __size_alloc_; + _LIBCPP_INLINE_VISIBILITY size_type& __sz() {return __size_alloc_.first();} + _LIBCPP_INLINE_VISIBILITY const size_type& __sz() const {return __size_alloc_.first();} + _LIBCPP_INLINE_VISIBILITY __node_allocator& __node_alloc() {return __size_alloc_.second();} + _LIBCPP_INLINE_VISIBILITY const __node_allocator& __node_alloc() const {return __size_alloc_.second();} static void __unlink_nodes(__node_base& __f, __node_base& __l); @@ -338,35 +362,46 @@ protected: __list_imp(const allocator_type& __a); ~__list_imp(); void clear(); + _LIBCPP_INLINE_VISIBILITY bool empty() const {return __sz() == 0;} + _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__end_.__next_);} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(__end_.__next_);} + _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(static_cast<__node_pointer> (&__end_));} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return const_iterator(static_cast<__node_const_pointer>(&__end_));} void swap(__list_imp& __c); + _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __list_imp& __c) {__copy_assign_alloc(__c, integral_constant());} + _LIBCPP_INLINE_VISIBILITY void __move_assign_alloc(__list_imp& __c) {__move_assign_alloc(__c, integral_constant());} private: + _LIBCPP_INLINE_VISIBILITY static void __swap_alloc(__node_allocator& __x, __node_allocator& __y) {__swap_alloc(__x, __y, integral_constant());} + _LIBCPP_INLINE_VISIBILITY static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, true_type) { using _STD::swap; swap(__x, __y); } + _LIBCPP_INLINE_VISIBILITY static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, false_type) {} + _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __list_imp& __c, true_type) { if (__node_alloc() != __c.__node_alloc()) @@ -374,21 +409,24 @@ private: __node_alloc() = __c.__node_alloc(); } + _LIBCPP_INLINE_VISIBILITY void __copy_assign_alloc(const __list_imp& __c, false_type) {} + _LIBCPP_INLINE_VISIBILITY void __move_assign_alloc(const __list_imp& __c, true_type) { __node_alloc() = _STD::move(__c.__node_alloc()); } + _LIBCPP_INLINE_VISIBILITY void __move_assign_alloc(const __list_imp& __c, false_type) {} }; // Unlink nodes [__f, __l] template -inline +inline _LIBCPP_INLINE_VISIBILITY void __list_imp<_Tp, _Alloc>::__unlink_nodes(__node_base& __f, __node_base& __l) { @@ -397,14 +435,14 @@ __list_imp<_Tp, _Alloc>::__unlink_nodes(__node_base& __f, __node_base& __l) } template -inline +inline _LIBCPP_INLINE_VISIBILITY __list_imp<_Tp, _Alloc>::__list_imp() : __size_alloc_(0) { } template -inline +inline _LIBCPP_INLINE_VISIBILITY __list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a) : __size_alloc_(0, __node_allocator(__a)) { @@ -459,7 +497,7 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c) } template > -class list +class _LIBCPP_VISIBLE list : private __list_imp<_Tp, _Alloc> { typedef __list_imp<_Tp, _Alloc> base; @@ -484,7 +522,9 @@ public: typedef _STD::reverse_iterator reverse_iterator; typedef _STD::reverse_iterator const_reverse_iterator; + _LIBCPP_INLINE_VISIBILITY list() {} + _LIBCPP_INLINE_VISIBILITY list(const allocator_type& __a) : base(__a) {} list(size_type __n); list(size_type __n, const value_type& __x); @@ -506,6 +546,7 @@ public: list(list&& __c, const allocator_type& __a); list& operator=(list&& __c); #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY list& operator=(initializer_list __il) {assign(__il.begin(), __il.end()); return *this;} @@ -513,32 +554,52 @@ public: void assign(_InpIter __f, _InpIter __l, typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0); void assign(size_type __n, const value_type& __x); + _LIBCPP_INLINE_VISIBILITY void assign(initializer_list __il) {assign(__il.begin(), __il.end());} allocator_type get_allocator() const; + _LIBCPP_INLINE_VISIBILITY size_type size() const {return base::__sz();} + _LIBCPP_INLINE_VISIBILITY bool empty() const {return base::empty();} + _LIBCPP_INLINE_VISIBILITY size_type max_size() const {return numeric_limits::max();} + _LIBCPP_INLINE_VISIBILITY iterator begin() {return base::begin();} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return base::begin();} + _LIBCPP_INLINE_VISIBILITY iterator end() {return base::end();} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return base::end();} + _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const {return base::begin();} + _LIBCPP_INLINE_VISIBILITY const_iterator cend() const {return base::end();} + _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const {return const_reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const {return const_reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY reference front() {return base::__end_.__next_->__value_;} + _LIBCPP_INLINE_VISIBILITY const_reference front() const {return base::__end_.__next_->__value_;} + _LIBCPP_INLINE_VISIBILITY reference back() {return base::__end_.__prev_->__value_;} + _LIBCPP_INLINE_VISIBILITY const_reference back() const {return base::__end_.__prev_->__value_;} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -563,10 +624,13 @@ public: template iterator insert(const_iterator __p, _InpIter __f, _InpIter __l, typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0); + _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __p, initializer_list __il) {return insert(__p, __il.begin(), __il.end());} + _LIBCPP_INLINE_VISIBILITY void swap(list& __c) {base::swap(__c);} + _LIBCPP_INLINE_VISIBILITY void clear() {base::clear();} void pop_front(); @@ -580,15 +644,18 @@ public: void splice(const_iterator __p, list& __c); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY void splice(const_iterator __p, list&& __c) {splice(__p, __c);} #endif void splice(const_iterator __p, list& __c, const_iterator __i); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY void splice(const_iterator __p, list&& __c, const_iterator __i) {splice(__p, __c, __i);} #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l) {splice(__p, __c, __f, __l);} #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -600,12 +667,14 @@ public: void unique(_BinaryPred __binary_pred); void merge(list& __c); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY void merge(list&& __c) {merge(__c);} #endif template void merge(list& __c, _Comp __comp); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template + _LIBCPP_INLINE_VISIBILITY void merge(list&& __c, _Comp __comp) {merge(__c, __comp);} #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES void sort(); @@ -626,7 +695,7 @@ private: // Link in nodes [__f, __l] just prior to __p template -inline +inline _LIBCPP_INLINE_VISIBILITY void list<_Tp, _Alloc>::__link_nodes(__node& __p, __node& __f, __node& __l) { @@ -637,7 +706,7 @@ list<_Tp, _Alloc>::__link_nodes(__node& __p, __node& __f, __node& __l) } template -inline +inline _LIBCPP_INLINE_VISIBILITY typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::__iterator(size_type __n) { @@ -726,7 +795,7 @@ list<_Tp, _Alloc>::list(initializer_list __il) } template -inline +inline _LIBCPP_INLINE_VISIBILITY list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list& __c) { @@ -741,7 +810,7 @@ list<_Tp, _Alloc>::operator=(const list& __c) #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template -inline +inline _LIBCPP_INLINE_VISIBILITY list<_Tp, _Alloc>::list(list&& __c) : base(allocator_type(_STD::move(__c.__node_alloc()))) { @@ -749,7 +818,7 @@ list<_Tp, _Alloc>::list(list&& __c) } template -inline +inline _LIBCPP_INLINE_VISIBILITY list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a) : base(__a) { @@ -763,7 +832,7 @@ list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a) } template -inline +inline _LIBCPP_INLINE_VISIBILITY list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(list&& __c) { @@ -827,7 +896,7 @@ list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x) } template -inline +inline _LIBCPP_INLINE_VISIBILITY _Alloc list<_Tp, _Alloc>::get_allocator() const { @@ -1316,7 +1385,7 @@ list<_Tp, _Alloc>::remove_if(_Pred __pred) } template -inline +inline _LIBCPP_INLINE_VISIBILITY void list<_Tp, _Alloc>::unique() { @@ -1339,7 +1408,7 @@ list<_Tp, _Alloc>::unique(_BinaryPred __binary_pred) } template -inline +inline _LIBCPP_INLINE_VISIBILITY void list<_Tp, _Alloc>::merge(list& __c) { @@ -1383,7 +1452,7 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp) } template -inline +inline _LIBCPP_INLINE_VISIBILITY void list<_Tp, _Alloc>::sort() { @@ -1392,7 +1461,7 @@ list<_Tp, _Alloc>::sort() template template -inline +inline _LIBCPP_INLINE_VISIBILITY void list<_Tp, _Alloc>::sort(_Comp __comp) { @@ -1401,7 +1470,6 @@ list<_Tp, _Alloc>::sort(_Comp __comp) template template -inline typename list<_Tp, _Alloc>::iterator list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp) { @@ -1477,7 +1545,7 @@ list<_Tp, _Alloc>::reverse() } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) { @@ -1485,7 +1553,7 @@ operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) { @@ -1493,7 +1561,7 @@ operator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) { @@ -1501,7 +1569,7 @@ operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) { @@ -1509,7 +1577,7 @@ operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) { @@ -1517,7 +1585,7 @@ operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) { @@ -1525,7 +1593,7 @@ operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) } template -inline +inline _LIBCPP_INLINE_VISIBILITY void swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y) { diff --git a/libcxx/include/locale b/libcxx/include/locale index e99049177b69..a04c15e6194d 100644 --- a/libcxx/include/locale +++ b/libcxx/include/locale @@ -198,7 +198,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if __APPLE__ template -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_sprintf(char* __restrict __str, const char* __restrict __format, _Tp __v) @@ -207,7 +207,7 @@ __nolocale_sprintf(char* __restrict __str, } template -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_snprintf(char* __restrict __str, size_t __size, const char* __restrict __format, _Tp __v) @@ -216,7 +216,7 @@ __nolocale_snprintf(char* __restrict __str, size_t __size, } template -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_snprintf(char* __restrict __str, size_t __size, const char* __restrict __format, int __prec, _Tp __v) @@ -225,7 +225,7 @@ __nolocale_snprintf(char* __restrict __str, size_t __size, } template -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_asprintf(char** __ret, const char* __restrict __format, _Tp __v) { @@ -233,7 +233,7 @@ __nolocale_asprintf(char** __ret, const char* __restrict __format, _Tp __v) } template -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_asprintf(char** __ret, const char* __restrict __format, int __prec, _Tp __v) @@ -242,7 +242,7 @@ __nolocale_asprintf(char** __ret, const char* __restrict __format, int __prec, } template -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_sscanf(const char* __restrict __str, const char* __restrict __format, _Tp* __v) @@ -250,14 +250,14 @@ __nolocale_sscanf(const char* __restrict __str, return sscanf_l(__str, 0, __format, __v); } -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_isxdigit(int __c) { return isxdigit_l(__c, 0); } -inline +inline _LIBCPP_INLINE_VISIBILITY int __nolocale_isdigit(int __c) { @@ -265,7 +265,8 @@ __nolocale_isdigit(int __c) } #else // __APPLE__ -inline int +inline _LIBCPP_INLINE_VISIBILITY +int __nolocale_sprintf(char* __restrict __str, const char* __restrict __format, ...) { @@ -275,7 +276,8 @@ __nolocale_sprintf(char* __restrict __str, va_end(__ap); return __result; } -inline int +inline _LIBCPP_INLINE_VISIBILITY +int __nolocale_snprintf(char* __restrict __str, size_t __size, const char* __restrict __format, ...) { @@ -285,7 +287,8 @@ __nolocale_snprintf(char* __restrict __str, size_t __size, va_end(__ap); return __result; } -inline int +inline _LIBCPP_INLINE_VISIBILITY +int __nolocale_asprintf(char** __ret, const char* __restrict __format, ...) { @@ -295,7 +298,8 @@ __nolocale_asprintf(char** __ret, va_end(__ap); return __result; } -inline int +inline _LIBCPP_INLINE_VISIBILITY +int __nolocale_sscanf(const char* __restrict __str, const char* __restrict __format, ...) { @@ -305,12 +309,15 @@ __nolocale_sscanf(const char* __restrict __str, va_end(__ap); return __result; } -inline int +inline _LIBCPP_INLINE_VISIBILITY +int __nolocale_isxdigit(int __c) { return isxdigit(__c); } -inline int + +inline _LIBCPP_INLINE_VISIBILITY +int __nolocale_isdigit(int __c) { return isdigit(__c); @@ -584,7 +591,7 @@ extern template class __num_get; extern template class __num_get; template > -class num_get +class _LIBCPP_VISIBLE num_get : public locale::facet, private __num_get<_CharT> { @@ -676,6 +683,7 @@ public: static locale::id id; protected: + _LIBCPP_ALWAYS_INLINE ~num_get() {} virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, @@ -1335,7 +1343,7 @@ extern template class __num_put; extern template class __num_put; template > -class num_put +class _LIBCPP_VISIBLE num_put : public locale::facet, private __num_put<_CharT> { @@ -1406,6 +1414,7 @@ public: static locale::id id; protected: + _LIBCPP_ALWAYS_INLINE ~num_put() {} virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, @@ -1740,7 +1749,7 @@ __get_up_to_n_digits(_InputIterator& __b, _InputIterator __e, return __r; } -class time_base +class _LIBCPP_VISIBLE time_base { public: enum dateorder {no_order, dmy, mdy, ymd, ydm}; @@ -1762,7 +1771,7 @@ protected: }; template > -class time_get +class _LIBCPP_VISIBLE time_get : public locale::facet, public time_base, private __time_get_c_storage<_CharT> @@ -1833,6 +1842,7 @@ public: static locale::id id; protected: + _LIBCPP_ALWAYS_INLINE ~time_get() {} virtual dateorder do_date_order() const; @@ -2406,7 +2416,7 @@ private: }; template > -class time_get_byname +class _LIBCPP_VISIBLE time_get_byname : public time_get<_CharT, _InputIterator>, private __time_get_storage<_CharT> { @@ -2416,24 +2426,35 @@ public: typedef _CharT char_type; typedef basic_string string_type; + _LIBCPP_INLINE_VISIBILITY explicit time_get_byname(const char* __nm, size_t __refs = 0) : time_get<_CharT, _InputIterator>(__refs), __time_get_storage<_CharT>(__nm) {} + _LIBCPP_INLINE_VISIBILITY explicit time_get_byname(const string& __nm, size_t __refs = 0) : time_get<_CharT, _InputIterator>(__refs), __time_get_storage<_CharT>(__nm) {} protected: + _LIBCPP_INLINE_VISIBILITY ~time_get_byname() {} + _LIBCPP_INLINE_VISIBILITY virtual dateorder do_date_order() const {return this->__do_date_order();} private: + _LIBCPP_INLINE_VISIBILITY virtual const string_type* __weeks() const {return this->__weeks_;} + _LIBCPP_INLINE_VISIBILITY virtual const string_type* __months() const {return this->__months_;} + _LIBCPP_INLINE_VISIBILITY virtual const string_type* __am_pm() const {return this->__am_pm_;} + _LIBCPP_INLINE_VISIBILITY virtual const string_type& __c() const {return this->__c_;} + _LIBCPP_INLINE_VISIBILITY virtual const string_type& __r() const {return this->__r_;} + _LIBCPP_INLINE_VISIBILITY virtual const string_type& __x() const {return this->__x_;} + _LIBCPP_INLINE_VISIBILITY virtual const string_type& __X() const {return this->__X_;} }; @@ -2455,7 +2476,7 @@ protected: }; template > -class time_put +class _LIBCPP_VISIBLE time_put : public locale::facet, private __time_put { @@ -2480,13 +2501,16 @@ public: static locale::id id; protected: + _LIBCPP_ALWAYS_INLINE ~time_put() {} virtual iter_type do_put(iter_type __s, ios_base&, char_type, const tm* __tm, char __fmt, char __mod) const; + _LIBCPP_ALWAYS_INLINE explicit time_put(const char* __nm, size_t __refs) : locale::facet(__refs), __time_put(__nm) {} + _LIBCPP_ALWAYS_INLINE explicit time_put(const string& __nm, size_t __refs) : locale::facet(__refs), __time_put(__nm) {} @@ -2551,7 +2575,7 @@ extern template class time_put; extern template class time_put; template > -class time_put_byname +class _LIBCPP_VISIBLE time_put_byname : public time_put<_CharT, _OutputIterator> { public: @@ -2564,6 +2588,7 @@ public: : time_put<_CharT, _OutputIterator>(__nm, __refs) {} protected: + _LIBCPP_ALWAYS_INLINE ~time_put_byname() {} }; @@ -2572,7 +2597,7 @@ extern template class time_put_byname; // money_base -class money_base +class _LIBCPP_VISIBLE money_base { public: enum part {none, space, symbol, sign, value}; @@ -2584,7 +2609,7 @@ public: // moneypunct template -class moneypunct +class _LIBCPP_VISIBLE moneypunct : public locale::facet, public money_base { @@ -2592,6 +2617,7 @@ public: typedef _CharT char_type; typedef basic_string string_type; + _LIBCPP_ALWAYS_INLINE explicit moneypunct(size_t __refs = 0) : locale::facet(__refs) {} @@ -2609,17 +2635,27 @@ public: static const bool intl = _International; protected: + _LIBCPP_ALWAYS_INLINE ~moneypunct() {} + _LIBCPP_ALWAYS_INLINE virtual char_type do_decimal_point() const {return numeric_limits::max();} + _LIBCPP_ALWAYS_INLINE virtual char_type do_thousands_sep() const {return numeric_limits::max();} + _LIBCPP_ALWAYS_INLINE virtual string do_grouping() const {return string();} + _LIBCPP_ALWAYS_INLINE virtual string_type do_curr_symbol() const {return string_type();} + _LIBCPP_ALWAYS_INLINE virtual string_type do_positive_sign() const {return string_type();} + _LIBCPP_ALWAYS_INLINE virtual string_type do_negative_sign() const {return string_type(1, '-');} + _LIBCPP_ALWAYS_INLINE virtual int do_frac_digits() const {return 0;} + _LIBCPP_ALWAYS_INLINE virtual pattern do_pos_format() const {pattern __p = {symbol, sign, none, value}; return __p;} + _LIBCPP_ALWAYS_INLINE virtual pattern do_neg_format() const {pattern __p = {symbol, sign, none, value}; return __p;} }; @@ -2636,7 +2672,8 @@ extern template class moneypunct; // moneypunct_byname template -class moneypunct_byname : public moneypunct<_CharT, _International> +class _LIBCPP_VISIBLE moneypunct_byname + : public moneypunct<_CharT, _International> { public: typedef money_base::pattern pattern; @@ -2652,16 +2689,26 @@ public: : moneypunct<_CharT, _International>(__refs) {init(__nm.c_str());} protected: + _LIBCPP_ALWAYS_INLINE ~moneypunct_byname() {} + _LIBCPP_ALWAYS_INLINE virtual char_type do_decimal_point() const {return __decimal_point_;} + _LIBCPP_ALWAYS_INLINE virtual char_type do_thousands_sep() const {return __thousands_sep_;} + _LIBCPP_ALWAYS_INLINE virtual string do_grouping() const {return __grouping_;} + _LIBCPP_ALWAYS_INLINE virtual string_type do_curr_symbol() const {return __curr_symbol_;} + _LIBCPP_ALWAYS_INLINE virtual string_type do_positive_sign() const {return __positive_sign_;} + _LIBCPP_ALWAYS_INLINE virtual string_type do_negative_sign() const {return __negative_sign_;} + _LIBCPP_ALWAYS_INLINE virtual int do_frac_digits() const {return __frac_digits_;} + _LIBCPP_ALWAYS_INLINE virtual pattern do_pos_format() const {return __pos_format_;} + _LIBCPP_ALWAYS_INLINE virtual pattern do_neg_format() const {return __neg_format_;} private: @@ -2746,7 +2793,7 @@ extern template class __money_get; extern template class __money_get; template > -class money_get +class _LIBCPP_VISIBLE money_get : public locale::facet, private __money_get<_CharT> { @@ -2777,6 +2824,7 @@ public: protected: + _LIBCPP_ALWAYS_INLINE ~money_get() {} virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl, @@ -3277,7 +3325,7 @@ extern template class __money_put; extern template class __money_put; template > -class money_put +class _LIBCPP_VISIBLE money_put : public locale::facet, private __money_put<_CharT> { @@ -3307,6 +3355,7 @@ public: static locale::id id; protected: + _LIBCPP_ALWAYS_INLINE ~money_put() {} virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob, @@ -3428,7 +3477,7 @@ extern template class money_put; // messages -class messages_base +class _LIBCPP_VISIBLE messages_base { public: typedef nl_catd catalog; @@ -3437,7 +3486,7 @@ public: }; template -class messages +class _LIBCPP_VISIBLE messages : public locale::facet, public messages_base { @@ -3471,6 +3520,7 @@ public: static locale::id id; protected: + _LIBCPP_ALWAYS_INLINE ~messages() {} virtual catalog do_open(const basic_string&, const locale&) const; @@ -3517,7 +3567,7 @@ extern template class messages; extern template class messages; template -class messages_byname +class _LIBCPP_VISIBLE messages_byname : public messages<_CharT> { public: @@ -3533,6 +3583,7 @@ public: : messages<_CharT>(__refs) {} protected: + _LIBCPP_ALWAYS_INLINE ~messages_byname() {} }; @@ -3542,7 +3593,7 @@ extern template class messages_byname; template, class _Byte_alloc = allocator > -class wstring_convert +class _LIBCPP_VISIBLE wstring_convert { public: typedef basic_string, _Byte_alloc> byte_string; @@ -3569,28 +3620,36 @@ public: #endif ~wstring_convert(); + _LIBCPP_ALWAYS_INLINE wide_string from_bytes(char __byte) {return from_bytes(&__byte, &__byte+1);} + _LIBCPP_ALWAYS_INLINE wide_string from_bytes(const char* __ptr) {return from_bytes(__ptr, __ptr + char_traits::length(__ptr));} + _LIBCPP_ALWAYS_INLINE wide_string from_bytes(const byte_string& __str) {return from_bytes(__str.data(), __str.data() + __str.size());} wide_string from_bytes(const char* __first, const char* __last); + _LIBCPP_ALWAYS_INLINE byte_string to_bytes(_Elem __wchar) {return to_bytes(&__wchar, &__wchar+1);} + _LIBCPP_ALWAYS_INLINE byte_string to_bytes(const _Elem* __wptr) {return to_bytes(__wptr, __wptr + char_traits<_Elem>::length(__wptr));} + _LIBCPP_ALWAYS_INLINE byte_string to_bytes(const wide_string& __wstr) {return to_bytes(__wstr.data(), __wstr.data() + __wstr.size());} byte_string to_bytes(const _Elem* __first, const _Elem* __last); + _LIBCPP_ALWAYS_INLINE size_t converted() const {return __cvtcount_;} + _LIBCPP_ALWAYS_INLINE state_type state() const {return __cvtstate_;} }; template -inline +inline _LIBCPP_ALWAYS_INLINE wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: wstring_convert(_Codecvt* __pcvt) : __cvtptr_(__pcvt), __cvtstate_(), __cvtcount_(0) @@ -3598,7 +3657,7 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: } template -inline +inline _LIBCPP_ALWAYS_INLINE wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: wstring_convert(_Codecvt* __pcvt, state_type __state) : __cvtptr_(__pcvt), __cvtstate_(__state), __cvtcount_(0) @@ -3617,7 +3676,7 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES template -inline +inline _LIBCPP_ALWAYS_INLINE wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: wstring_convert(wstring_convert&& __wc) : __byte_err_string_(_STD::move(__wc.__byte_err_string_)), @@ -3785,7 +3844,7 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: } template > -class wbuffer_convert +class _LIBCPP_VISIBLE wbuffer_convert : public basic_streambuf<_Elem, _Tr> { public: @@ -3820,7 +3879,9 @@ public: state_type __state = state_type()); ~wbuffer_convert(); + _LIBCPP_INLINE_VISIBILITY streambuf* rdbuf() const {return __bufptr_;} + _LIBCPP_INLINE_VISIBILITY streambuf* rdbuf(streambuf* __bytebuf) { streambuf* __r = __bufptr_; @@ -3828,6 +3889,7 @@ public: return __r; } + _LIBCPP_INLINE_VISIBILITY state_type state() const {return __st_;} protected: diff --git a/libcxx/include/map b/libcxx/include/map index 5baefd721e54..d1bfa18cd9c6 100644 --- a/libcxx/include/map +++ b/libcxx/include/map @@ -353,37 +353,39 @@ class __map_value_compare typedef pair<_Key, _Tp> _P; typedef pair _CP; public: + _LIBCPP_INLINE_VISIBILITY __map_value_compare() : _Compare() {} + _LIBCPP_INLINE_VISIBILITY __map_value_compare(_Compare c) : _Compare(c) {} + _LIBCPP_INLINE_VISIBILITY const _Compare& key_comp() const {return *this;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _CP& __y) const {return static_cast(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _P& __y) const {return static_cast(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _Key& __y) const {return static_cast(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _P& __x, const _CP& __y) const {return static_cast(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _P& __x, const _P& __y) const {return static_cast(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _P& __x, const _Key& __y) const {return static_cast(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _CP& __y) const {return static_cast(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _P& __y) const {return static_cast(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _Key& __y) const {return static_cast(*this)(__x, __y);} - -// bool operator()(const _Tp& __x, const _Tp& __y) const -// {return static_cast(*this)(__x.first, __y.first);} -// bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const -// {return static_cast(*this)(__x, __y.first);} -// bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const -// {return static_cast(*this)(__x.first, __y);} -// bool operator()(const typename _Tp::first_type& __x, -// const typename _Tp::first_type& __y) const -// {return static_cast(*this)(__x, __y);} }; template @@ -395,38 +397,40 @@ class __map_value_compare<_Key, _Tp, _Compare, false> typedef pair _CP; public: + _LIBCPP_INLINE_VISIBILITY __map_value_compare() : comp() {} + _LIBCPP_INLINE_VISIBILITY __map_value_compare(_Compare c) : comp(c) {} + _LIBCPP_INLINE_VISIBILITY const _Compare& key_comp() const {return comp;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _CP& __y) const {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _P& __y) const {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _Key& __y) const {return comp(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _P& __x, const _CP& __y) const {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _P& __x, const _P& __y) const {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _P& __x, const _Key& __y) const {return comp(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _CP& __y) const {return comp(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _P& __y) const {return comp(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _Key& __y) const {return comp(__x, __y);} - -// bool operator()(const _Tp& __x, const _Tp& __y) const -// {return comp(__x.first, __y.first);} -// bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const -// {return comp(__x, __y.first);} -// bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const -// {return comp(__x.first, __y);} -// bool operator()(const typename _Tp::first_type& __x, -// const typename _Tp::first_type& __y) const -// {return comp(__x, __y);} }; template @@ -449,6 +453,7 @@ public: bool __first_constructed; bool __second_constructed; + _LIBCPP_INLINE_VISIBILITY explicit __map_node_destructor(allocator_type& __na) : __na_(__na), __first_constructed(false), @@ -456,6 +461,7 @@ public: {} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY __map_node_destructor(__tree_node_destructor&& __x) : __na_(__x.__na_), __first_constructed(__x.__value_constructed), @@ -465,6 +471,7 @@ public: } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY void operator()(pointer __p) { if (__second_constructed) @@ -481,7 +488,7 @@ template class multimap; template class __map_const_iterator; template -class __map_iterator +class _LIBCPP_VISIBLE __map_iterator { _TreeIterator __i_; @@ -501,14 +508,20 @@ public: #endif pointer; + _LIBCPP_INLINE_VISIBILITY __map_iterator() {} + _LIBCPP_INLINE_VISIBILITY __map_iterator(_TreeIterator __i) : __i_(__i) {} + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return (pointer)__i_.operator->();} + _LIBCPP_INLINE_VISIBILITY __map_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY __map_iterator operator++(int) { __map_iterator __t(*this); @@ -516,7 +529,9 @@ public: return __t; } + _LIBCPP_INLINE_VISIBILITY __map_iterator& operator--() {--__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY __map_iterator operator--(int) { __map_iterator __t(*this); @@ -524,18 +539,21 @@ public: return __t; } - friend bool operator==(const __map_iterator& __x, const __map_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __map_iterator& __x, const __map_iterator& __y) {return __x.__i_ == __y.__i_;} - friend bool operator!=(const __map_iterator& __x, const __map_iterator& __y) + friend + _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __map_iterator& __x, const __map_iterator& __y) {return __x.__i_ != __y.__i_;} - template friend class map; - template friend class multimap; - template friend class __map_const_iterator; + template friend class _LIBCPP_VISIBLE map; + template friend class _LIBCPP_VISIBLE multimap; + template friend class _LIBCPP_VISIBLE __map_const_iterator; }; template -class __map_const_iterator +class _LIBCPP_VISIBLE __map_const_iterator { _TreeIterator __i_; @@ -555,17 +573,24 @@ public: #endif pointer; + _LIBCPP_INLINE_VISIBILITY __map_const_iterator() {} + _LIBCPP_INLINE_VISIBILITY __map_const_iterator(_TreeIterator __i) : __i_(__i) {} + _LIBCPP_INLINE_VISIBILITY __map_const_iterator( __map_iterator __i) : __i_(__i.__i_) {} + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return (pointer)__i_.operator->();} + _LIBCPP_INLINE_VISIBILITY __map_const_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY __map_const_iterator operator++(int) { __map_const_iterator __t(*this); @@ -573,7 +598,9 @@ public: return __t; } + _LIBCPP_INLINE_VISIBILITY __map_const_iterator& operator--() {--__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY __map_const_iterator operator--(int) { __map_const_iterator __t(*this); @@ -581,19 +608,21 @@ public: return __t; } - friend bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) {return __x.__i_ == __y.__i_;} - friend bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) {return __x.__i_ != __y.__i_;} - template friend class map; - template friend class multimap; - template friend class __tree_const_iterator; + template friend class _LIBCPP_VISIBLE map; + template friend class _LIBCPP_VISIBLE multimap; + template friend class _LIBCPP_VISIBLE __tree_const_iterator; }; template , class _Allocator = allocator > > -class map +class _LIBCPP_VISIBLE map { public: // types: @@ -605,15 +634,16 @@ public: typedef value_type& reference; typedef const value_type& const_reference; - class value_compare + class _LIBCPP_VISIBLE value_compare : public binary_function { friend class map; protected: key_compare comp; - value_compare(key_compare c) : comp(c) {} + _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} public: + _LIBCPP_INLINE_VISIBILITY bool operator()(const value_type& __x, const value_type& __y) const {return comp(__x.first, __y.first);} }; @@ -644,13 +674,16 @@ public: typedef _STD::reverse_iterator reverse_iterator; typedef _STD::reverse_iterator const_reverse_iterator; + _LIBCPP_INLINE_VISIBILITY explicit map(const key_compare& __comp = key_compare()) : __tree_(__vc(__comp)) {} + _LIBCPP_INLINE_VISIBILITY explicit map(const key_compare& __comp, const allocator_type& __a) : __tree_(__vc(__comp), __a) {} template + _LIBCPP_INLINE_VISIBILITY map(_InputIterator __f, _InputIterator __l, const key_compare& __comp = key_compare()) : __tree_(__vc(__comp)) @@ -659,6 +692,7 @@ public: } template + _LIBCPP_INLINE_VISIBILITY map(_InputIterator __f, _InputIterator __l, const key_compare& __comp, const allocator_type& __a) : __tree_(__vc(__comp), __a) @@ -666,6 +700,7 @@ public: insert(__f, __l); } + _LIBCPP_INLINE_VISIBILITY map(const map& __m) : __tree_(__m.__tree_) { @@ -674,6 +709,7 @@ public: #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY map(map&& __m) : __tree_(_STD::move(__m.__tree_)) { @@ -681,24 +717,28 @@ public: map(map&& __m, const allocator_type& __a); + _LIBCPP_INLINE_VISIBILITY map(initializer_list __il, const key_compare& __comp = key_compare()) : __tree_(__vc(__comp)) { insert(__il.begin(), __il.end()); } + _LIBCPP_INLINE_VISIBILITY map(initializer_list __il, const key_compare& __comp, const allocator_type& __a) : __tree_(__vc(__comp), __a) { insert(__il.begin(), __il.end()); } + _LIBCPP_INLINE_VISIBILITY map& operator=(map&& __m) { __tree_ = _STD::move(__m.__tree_); return *this; } + _LIBCPP_INLINE_VISIBILITY map& operator=(initializer_list __il) { __tree_.__assign_unique(__il.begin(), __il.end()); @@ -707,34 +747,51 @@ public: #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY explicit map(const allocator_type& __a) : __tree_(__a) { } + _LIBCPP_INLINE_VISIBILITY map(const map& __m, const allocator_type& __a) : __tree_(__m.__tree_.value_comp(), __a) { insert(__m.begin(), __m.end()); } + _LIBCPP_INLINE_VISIBILITY iterator begin() {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY iterator end() {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const {return const_reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const {return begin();} + _LIBCPP_INLINE_VISIBILITY const_iterator cend() const {return end();} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const {return rbegin();} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const {return rend();} + _LIBCPP_INLINE_VISIBILITY bool empty() const {return __tree_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY size_type size() const {return __tree_.size();} + _LIBCPP_INLINE_VISIBILITY size_type max_size() const {return __tree_.max_size();} mapped_type& operator[](const key_type& __k); @@ -745,17 +802,22 @@ public: mapped_type& at(const key_type& __k); const mapped_type& at(const key_type& __k) const; + _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const {return __tree_.__alloc();} + _LIBCPP_INLINE_VISIBILITY key_compare key_comp() const {return __tree_.value_comp().key_comp();} + _LIBCPP_INLINE_VISIBILITY value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY pair emplace() {return __tree_.__emplace_unique();} template ::value>::type> + _LIBCPP_INLINE_VISIBILITY pair emplace(_A0&& __a0) {return __tree_.__emplace_unique(_STD::forward<_A0>(__a0));} @@ -769,12 +831,14 @@ public: #endif // _LIBCPP_HAS_NO_VARIADICS + _LIBCPP_INLINE_VISIBILITY iterator emplace_hint(const_iterator __p) {return __tree_.__emplace_hint_unique(__p.__i_);} template ::value>::type> + _LIBCPP_INLINE_VISIBILITY iterator emplace_hint(const_iterator __p, _A0&& __a0) {return __tree_.__emplace_hint_unique(__p.__i_, _STD::forward<_A0>(__a0));} @@ -790,56 +854,76 @@ public: template ::value>::type> + _LIBCPP_INLINE_VISIBILITY pair insert(_P&& __p) {return __tree_.__insert_unique(_STD::forward<_P>(__p));} template ::value>::type> + _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __pos, _P&& __p) {return __tree_.__insert_unique(__pos.__i_, _STD::forward<_P>(__p));} #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY pair insert(const value_type& __v) {return __tree_.__insert_unique(__v);} + _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __p, const value_type& __v) {return __tree_.__insert_unique(__p.__i_, __v);} template + _LIBCPP_INLINE_VISIBILITY void insert(_InputIterator __f, _InputIterator __l) { for (const_iterator __e = cend(); __f != __l; ++__f) insert(__e.__i_, *__f); } + _LIBCPP_INLINE_VISIBILITY void insert(initializer_list __il) {insert(__il.begin(), __il.end());} + _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY size_type erase(const key_type& __k) {return __tree_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __f, const_iterator __l) {return __tree_.erase(__f.__i_, __l.__i_);} + _LIBCPP_INLINE_VISIBILITY void clear() {__tree_.clear();} + _LIBCPP_INLINE_VISIBILITY void swap(map& __m) {__tree_.swap(__m.__tree_);} + _LIBCPP_INLINE_VISIBILITY iterator find(const key_type& __k) {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY const_iterator find(const key_type& __k) const {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY size_type count(const key_type& __k) const {return __tree_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY iterator lower_bound(const key_type& __k) {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY const_iterator lower_bound(const key_type& __k) const {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY iterator upper_bound(const key_type& __k) {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY const_iterator upper_bound(const key_type& __k) const {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY pair equal_range(const key_type& __k) {return __tree_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY pair equal_range(const key_type& __k) const {return __tree_.__equal_range_unique(__k);} @@ -1202,7 +1286,7 @@ map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, const map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1211,7 +1295,7 @@ operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, const map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1220,7 +1304,7 @@ operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, const map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1229,7 +1313,7 @@ operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, const map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1238,7 +1322,7 @@ operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, const map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1247,7 +1331,7 @@ operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, const map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1256,7 +1340,7 @@ operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY void swap(map<_Key, _Tp, _Compare, _Allocator>& __x, map<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1266,7 +1350,7 @@ swap(map<_Key, _Tp, _Compare, _Allocator>& __x, template , class _Allocator = allocator > > -class multimap +class _LIBCPP_VISIBLE multimap { public: // types: @@ -1278,15 +1362,17 @@ public: typedef value_type& reference; typedef const value_type& const_reference; - class value_compare + class _LIBCPP_VISIBLE value_compare : public binary_function { friend class multimap; protected: key_compare comp; + _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} public: + _LIBCPP_INLINE_VISIBILITY bool operator()(const value_type& __x, const value_type& __y) const {return comp(__x.first, __y.first);} }; @@ -1317,13 +1403,16 @@ public: typedef _STD::reverse_iterator reverse_iterator; typedef _STD::reverse_iterator const_reverse_iterator; + _LIBCPP_INLINE_VISIBILITY explicit multimap(const key_compare& __comp = key_compare()) : __tree_(__vc(__comp)) {} + _LIBCPP_INLINE_VISIBILITY explicit multimap(const key_compare& __comp, const allocator_type& __a) : __tree_(__vc(__comp), __a) {} template + _LIBCPP_INLINE_VISIBILITY multimap(_InputIterator __f, _InputIterator __l, const key_compare& __comp = key_compare()) : __tree_(__vc(__comp)) @@ -1332,6 +1421,7 @@ public: } template + _LIBCPP_INLINE_VISIBILITY multimap(_InputIterator __f, _InputIterator __l, const key_compare& __comp, const allocator_type& __a) : __tree_(__vc(__comp), __a) @@ -1339,6 +1429,7 @@ public: insert(__f, __l); } + _LIBCPP_INLINE_VISIBILITY multimap(const multimap& __m) : __tree_(__m.__tree_.value_comp(), __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) @@ -1348,6 +1439,7 @@ public: #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY multimap(multimap&& __m) : __tree_(_STD::move(__m.__tree_)) { @@ -1355,24 +1447,28 @@ public: multimap(multimap&& __m, const allocator_type& __a); + _LIBCPP_INLINE_VISIBILITY multimap(initializer_list __il, const key_compare& __comp = key_compare()) : __tree_(__vc(__comp)) { insert(__il.begin(), __il.end()); } + _LIBCPP_INLINE_VISIBILITY multimap(initializer_list __il, const key_compare& __comp, const allocator_type& __a) : __tree_(__vc(__comp), __a) { insert(__il.begin(), __il.end()); } + _LIBCPP_INLINE_VISIBILITY multimap& operator=(multimap&& __m) { __tree_ = _STD::move(__m.__tree_); return *this; } + _LIBCPP_INLINE_VISIBILITY multimap& operator=(initializer_list __il) { __tree_.__assign_multi(__il.begin(), __il.end()); @@ -1380,46 +1476,68 @@ public: } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY explicit multimap(const allocator_type& __a) : __tree_(__a) { } + _LIBCPP_INLINE_VISIBILITY multimap(const multimap& __m, const allocator_type& __a) : __tree_(__m.__tree_.value_comp(), __a) { insert(__m.begin(), __m.end()); } + _LIBCPP_INLINE_VISIBILITY iterator begin() {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY iterator end() {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const {return const_reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const {return begin();} + _LIBCPP_INLINE_VISIBILITY const_iterator cend() const {return end();} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const {return rbegin();} + _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const {return rend();} + _LIBCPP_INLINE_VISIBILITY bool empty() const {return __tree_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY size_type size() const {return __tree_.size();} + _LIBCPP_INLINE_VISIBILITY size_type max_size() const {return __tree_.max_size();} + _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const {return __tree_.__alloc();} + _LIBCPP_INLINE_VISIBILITY key_compare key_comp() const {return __tree_.value_comp().key_comp();} + _LIBCPP_INLINE_VISIBILITY value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY iterator emplace() {return __tree_.__emplace_multi();} template ::value>::type> + _LIBCPP_INLINE_VISIBILITY iterator emplace(_A0&& __a0) {return __tree_.__emplace_multi(_STD::forward<_A0>(__a0));} @@ -1433,11 +1551,13 @@ public: #endif // _LIBCPP_HAS_NO_VARIADICS + _LIBCPP_INLINE_VISIBILITY iterator emplace_hint(const_iterator __p) {return __tree_.__emplace_hint_multi(__p.__i_);} template ::value>::type> + _LIBCPP_INLINE_VISIBILITY iterator emplace_hint(const_iterator __p, _A0&& __a0) {return __tree_.__emplace_hint_multi(__p.__i_, _STD::forward<_A0>(__a0));} @@ -1453,53 +1573,73 @@ public: template ::value>::type> + _LIBCPP_INLINE_VISIBILITY iterator insert(_P&& __p) {return __tree_.__insert_multi(_STD::forward<_P>(__p));} template ::value>::type> + _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __pos, _P&& __p) {return __tree_.__insert_multi(__pos.__i_, _STD::forward<_P>(__p));} #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} + _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __p, const value_type& __v) {return __tree_.__insert_multi(__p.__i_, __v);} template + _LIBCPP_INLINE_VISIBILITY void insert(_InputIterator __f, _InputIterator __l) { for (const_iterator __e = cend(); __f != __l; ++__f) __tree_.__insert_multi(__e.__i_, *__f); } + _LIBCPP_INLINE_VISIBILITY void insert(initializer_list __il) {insert(__il.begin(), __il.end());} + _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __f, const_iterator __l) {return __tree_.erase(__f.__i_, __l.__i_);} + _LIBCPP_INLINE_VISIBILITY void clear() {__tree_.clear();} + _LIBCPP_INLINE_VISIBILITY void swap(multimap& __m) {__tree_.swap(__m.__tree_);} + _LIBCPP_INLINE_VISIBILITY iterator find(const key_type& __k) {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY const_iterator find(const key_type& __k) const {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY size_type count(const key_type& __k) const {return __tree_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY iterator lower_bound(const key_type& __k) {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY const_iterator lower_bound(const key_type& __k) const {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY iterator upper_bound(const key_type& __k) {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY const_iterator upper_bound(const key_type& __k) const {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY pair equal_range(const key_type& __k) {return __tree_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY pair equal_range(const key_type& __k) const {return __tree_.__equal_range_multi(__k);} @@ -1623,7 +1763,7 @@ multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, const multimap<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1632,7 +1772,7 @@ operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, const multimap<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1641,7 +1781,7 @@ operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, const multimap<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1650,7 +1790,7 @@ operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, const multimap<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1659,7 +1799,7 @@ operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, const multimap<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1668,7 +1808,7 @@ operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY bool operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, const multimap<_Key, _Tp, _Compare, _Allocator>& __y) @@ -1677,7 +1817,7 @@ operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, } template -inline +inline _LIBCPP_INLINE_VISIBILITY void swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, multimap<_Key, _Tp, _Compare, _Allocator>& __y) diff --git a/libcxx/include/memory b/libcxx/include/memory index b4875ce7827f..86da72159a13 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -531,7 +531,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD // allocator_arg_t -struct allocator_arg_t { }; +struct _LIBCPP_VISIBLE allocator_arg_t { }; extern const allocator_arg_t allocator_arg; @@ -548,7 +548,7 @@ addressof(_Tp& __x) template class allocator; template <> -class allocator +class _LIBCPP_VISIBLE allocator { public: typedef void* pointer; @@ -783,7 +783,7 @@ struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> #endif // _LIBCPP_HAS_NO_VARIADICS template -struct pointer_traits +struct _LIBCPP_VISIBLE pointer_traits { typedef _Ptr pointer; typedef typename __pointer_traits_element_type::type element_type; @@ -799,13 +799,14 @@ struct pointer_traits private: struct __nat {}; public: + _LIBCPP_INLINE_VISIBILITY static pointer pointer_to(typename conditional::value, __nat, element_type>::type& __r) {return pointer::pointer_to(__r);} }; template -struct pointer_traits<_Tp*> +struct _LIBCPP_VISIBLE pointer_traits<_Tp*> { typedef _Tp* pointer; typedef _Tp element_type; @@ -820,6 +821,7 @@ struct pointer_traits<_Tp*> private: struct __nat {}; public: + _LIBCPP_INLINE_VISIBILITY static pointer pointer_to(typename conditional::value, __nat, element_type>::type& __r) {return _STD::addressof(__r);} @@ -1291,7 +1293,7 @@ struct __has_select_on_container_copy_construction #endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE template -struct allocator_traits +struct _LIBCPP_VISIBLE allocator_traits { typedef _Alloc allocator_type; typedef typename allocator_type::value_type value_type; @@ -1322,38 +1324,46 @@ struct allocator_traits {typedef allocator_traits::other> other;}; #endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + _LIBCPP_INLINE_VISIBILITY static pointer allocate(allocator_type& __a, size_type __n) {return __a.allocate(__n);} + _LIBCPP_INLINE_VISIBILITY static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) {return allocate(__a, __n, __hint, __has_allocate_hint());} + _LIBCPP_INLINE_VISIBILITY static void deallocate(allocator_type& __a, pointer __p, size_type __n) {__a.deallocate(__p, __n);} #ifndef _LIBCPP_HAS_NO_VARIADICS template + _LIBCPP_INLINE_VISIBILITY static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) {__construct(__has_construct(), __a, __p, _STD::forward<_Args>(__args)...);} #else // _LIBCPP_HAS_NO_VARIADICS template + _LIBCPP_INLINE_VISIBILITY static void construct(allocator_type& __a, _Tp* __p) { ::new ((void*)__p) _Tp(); } template + _LIBCPP_INLINE_VISIBILITY static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) { ::new ((void*)__p) _Tp(__a0); } template + _LIBCPP_INLINE_VISIBILITY static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, const _A1& __a1) { ::new ((void*)__p) _Tp(__a0, __a1); } template + _LIBCPP_INLINE_VISIBILITY static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, const _A1& __a1, const _A2& __a2) { @@ -1362,12 +1372,15 @@ struct allocator_traits #endif // _LIBCPP_HAS_NO_VARIADICS template + _LIBCPP_INLINE_VISIBILITY static void destroy(allocator_type& __a, _Tp* __p) {__destroy(__has_destroy(), __a, __p);} + _LIBCPP_INLINE_VISIBILITY static size_type max_size(const allocator_type& __a) {return __max_size(__has_max_size(), __a);} + _LIBCPP_INLINE_VISIBILITY static allocator_type select_on_container_copy_construction(const allocator_type& __a) {return select_on_container_copy_construction( @@ -1376,18 +1389,22 @@ struct allocator_traits private: + _LIBCPP_INLINE_VISIBILITY static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint, true_type) {return __a.allocate(__n, __hint);} + _LIBCPP_INLINE_VISIBILITY static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint, false_type) {return __a.allocate(__n);} #ifndef _LIBCPP_HAS_NO_VARIADICS template + _LIBCPP_INLINE_VISIBILITY static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) {__a.construct(__p, _STD::forward<_Args>(__args)...);} template + _LIBCPP_INLINE_VISIBILITY static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) { ::new ((void*)__p) _Tp(_STD::forward<_Args>(__args)...); @@ -1395,22 +1412,28 @@ private: #endif // _LIBCPP_HAS_NO_VARIADICS template + _LIBCPP_INLINE_VISIBILITY static void __destroy(true_type, allocator_type& __a, _Tp* __p) {__a.destroy(__p);} template + _LIBCPP_INLINE_VISIBILITY static void __destroy(false_type, allocator_type&, _Tp* __p) { __p->~_Tp(); } + _LIBCPP_INLINE_VISIBILITY static size_type __max_size(true_type, const allocator_type& __a) {return __a.max_size();} + _LIBCPP_INLINE_VISIBILITY static size_type __max_size(false_type, const allocator_type&) {return numeric_limits::max();} + _LIBCPP_INLINE_VISIBILITY static allocator_type select_on_container_copy_construction(true_type, const allocator_type& __a) {return __a.select_on_container_copy_construction();} + _LIBCPP_INLINE_VISIBILITY static allocator_type select_on_container_copy_construction(false_type, const allocator_type& __a) {return __a;} @@ -1443,7 +1466,7 @@ struct __uses_allocator<_Tp, _Alloc, false> }; template -struct uses_allocator +struct _LIBCPP_VISIBLE uses_allocator : public __uses_allocator<_Tp, _Alloc> { }; @@ -1581,7 +1604,7 @@ inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) throw() {return false;} template -class raw_storage_iterator +class _LIBCPP_VISIBLE raw_storage_iterator : public iterator -class auto_ptr +class _LIBCPP_VISIBLE auto_ptr { private: _Tp* __ptr_; @@ -1678,7 +1701,7 @@ public: }; template <> -class auto_ptr +class _LIBCPP_VISIBLE auto_ptr { public: typedef void element_type; @@ -1918,7 +1941,7 @@ swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) {__x.swap(__y);} template -struct default_delete +struct _LIBCPP_VISIBLE default_delete { _LIBCPP_INLINE_VISIBILITY default_delete() {} template @@ -1932,7 +1955,7 @@ struct default_delete }; template -struct default_delete<_Tp[]> +struct _LIBCPP_VISIBLE default_delete<_Tp[]> { _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const { @@ -1944,7 +1967,7 @@ private: }; template > -class unique_ptr +class _LIBCPP_VISIBLE unique_ptr { public: typedef _Tp element_type; @@ -2121,7 +2144,7 @@ public: }; template -class unique_ptr<_Tp[], _Dp> +class _LIBCPP_VISIBLE unique_ptr<_Tp[], _Dp> { public: typedef _Tp element_type; @@ -2356,9 +2379,10 @@ operator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {re template struct hash; template -struct hash<_Tp*> +struct _LIBCPP_VISIBLE hash<_Tp*> : public unary_function<_Tp*, size_t> { + _LIBCPP_INLINE_VISIBILITY size_t operator()(_Tp* __v) const { const size_t* const __p = reinterpret_cast(&__v); @@ -2367,10 +2391,11 @@ struct hash<_Tp*> }; template -struct hash > +struct _LIBCPP_VISIBLE hash > { typedef unique_ptr<_Tp, _Dp> argument_type; typedef size_t result_type; + _LIBCPP_INLINE_VISIBILITY result_type operator()(const argument_type& __ptr) const { typedef typename argument_type::pointer pointer; @@ -2429,6 +2454,7 @@ private: public: _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) : __alloc_(__a), __s_(__s) {} + _LIBCPP_INLINE_VISIBILITY void operator()(pointer __p) {__alloc_traits::deallocate(__alloc_, __p, __s_);} }; @@ -2482,7 +2508,7 @@ uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) __h.release(); } -class bad_weak_ptr +class _LIBCPP_EXCEPTION_ABI bad_weak_ptr : public std::exception { public: @@ -2504,11 +2530,13 @@ private: virtual void __on_zero_shared() = 0; public: + _LIBCPP_INLINE_VISIBILITY explicit __shared_count(long __refs = 0) : __shared_owners_(__refs) {} void __add_shared(); void __release_shared(); + _LIBCPP_INLINE_VISIBILITY long use_count() const {return __shared_owners_ + 1;} }; @@ -2518,6 +2546,7 @@ class __shared_weak_count long __shared_weak_owners_; public: + _LIBCPP_INLINE_VISIBILITY explicit __shared_weak_count(long __refs = 0) : __shared_count(__refs), __shared_weak_owners_(__refs) {} @@ -2529,6 +2558,7 @@ public: void __add_weak(); void __release_shared(); void __release_weak(); + _LIBCPP_INLINE_VISIBILITY long use_count() const {return __shared_count::use_count();} __shared_weak_count* lock(); @@ -2545,6 +2575,7 @@ class __shared_ptr_pointer { __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; public: + _LIBCPP_INLINE_VISIBILITY __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) : __data_(__compressed_pair<_Tp, _Dp>(__p, _STD::move(__d)), _STD::move(__a)) {} @@ -2593,27 +2624,33 @@ class __shared_ptr_emplace public: #ifndef _LIBCPP_HAS_NO_VARIADICS + _LIBCPP_INLINE_VISIBILITY __shared_ptr_emplace(_Alloc __a) : __data_(_STD::move(__a)) {} template + _LIBCPP_INLINE_VISIBILITY __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) : __data_(_STD::move(__a), _Tp(_STD::forward<_Args>(__args)...)) {} #else // _LIBCPP_HAS_NO_VARIADICS + _LIBCPP_INLINE_VISIBILITY __shared_ptr_emplace(_Alloc __a) : __data_(__a) {} template + _LIBCPP_INLINE_VISIBILITY __shared_ptr_emplace(_Alloc __a, _A0& __a0) : __data_(__a, _Tp(__a0)) {} template + _LIBCPP_INLINE_VISIBILITY __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) : __data_(__a, _Tp(__a0, __a1)) {} template + _LIBCPP_INLINE_VISIBILITY __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) : __data_(__a, _Tp(__a0, __a1, __a2)) {} @@ -2623,6 +2660,7 @@ private: virtual void __on_zero_shared(); virtual void __on_zero_shared_weak(); public: + _LIBCPP_INLINE_VISIBILITY _Tp* get() {return &__data_.second();} }; @@ -2645,7 +2683,7 @@ __shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() template class enable_shared_from_this; template -class shared_ptr +class _LIBCPP_VISIBLE shared_ptr { public: typedef _Tp element_type; @@ -2720,20 +2758,32 @@ public: template void reset(_Yp* __p, _Dp __d); template void reset(_Yp* __p, _Dp __d, _Alloc __a); + _LIBCPP_INLINE_VISIBILITY element_type* get() const {return __ptr_;} + _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference::type operator*() const {return *__ptr_;} + _LIBCPP_INLINE_VISIBILITY element_type* operator->() const {return __ptr_;} + _LIBCPP_INLINE_VISIBILITY long use_count() const {return __cntrl_ ? __cntrl_->use_count() : 0;} + _LIBCPP_INLINE_VISIBILITY bool unique() const {return use_count() == 1;} + _LIBCPP_INLINE_VISIBILITY bool empty() const {return __cntrl_ == 0;} + _LIBCPP_INLINE_VISIBILITY /*explicit*/ operator bool() const {return get() != 0;} - template bool owner_before(shared_ptr<_U> const& __p) const + template + _LIBCPP_INLINE_VISIBILITY + bool owner_before(shared_ptr<_U> const& __p) const {return __cntrl_ < __p.__cntrl_;} - template bool owner_before(weak_ptr<_U> const& __p) const + template + _LIBCPP_INLINE_VISIBILITY + bool owner_before(weak_ptr<_U> const& __p) const {return __cntrl_ < __p.__cntrl_;} #ifndef _LIBCPP_NO_RTTI template + _LIBCPP_INLINE_VISIBILITY _Dp* __get_deleter() const {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} #endif // _LIBCPP_NO_RTTI @@ -2784,6 +2834,7 @@ public: private: template + _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(const enable_shared_from_this<_Yp>* __e) { @@ -2791,10 +2842,11 @@ private: __e->__weak_this_ = *this; } + _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(const void*) {} - template friend class shared_ptr; - template friend class weak_ptr; + template friend class _LIBCPP_VISIBLE shared_ptr; + template friend class _LIBCPP_VISIBLE weak_ptr; }; template @@ -3504,7 +3556,7 @@ get_deleter(const shared_ptr<_Tp>& __p) #endif // _LIBCPP_NO_RTTI template -class weak_ptr +class _LIBCPP_VISIBLE weak_ptr { public: typedef _Tp element_type; @@ -3529,16 +3581,22 @@ public: void swap(weak_ptr& __r); void reset(); + _LIBCPP_INLINE_VISIBILITY long use_count() const {return __cntrl_ ? __cntrl_->use_count() : 0;} + _LIBCPP_INLINE_VISIBILITY bool expired() const {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} shared_ptr<_Tp> lock() const; - template bool owner_before(const shared_ptr<_Up>& __r) const + template + _LIBCPP_INLINE_VISIBILITY + bool owner_before(const shared_ptr<_Up>& __r) const {return __cntrl_ < __r.__cntrl_;} - template bool owner_before(const weak_ptr<_Up>& __r) const + template + _LIBCPP_INLINE_VISIBILITY + bool owner_before(const weak_ptr<_Up>& __r) const {return __cntrl_ < __r.__cntrl_;} - template friend class weak_ptr; - template friend class shared_ptr; + template friend class _LIBCPP_VISIBLE weak_ptr; + template friend class _LIBCPP_VISIBLE shared_ptr; }; template @@ -3673,52 +3731,65 @@ weak_ptr<_Tp>::lock() const template struct owner_less; template -struct owner_less > +struct _LIBCPP_VISIBLE owner_less > : binary_function, shared_ptr<_Tp>, bool> { typedef bool result_type; + _LIBCPP_INLINE_VISIBILITY bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const {return __x.owner_before(__y);} }; template -struct owner_less > +struct _LIBCPP_VISIBLE owner_less > : binary_function, weak_ptr<_Tp>, bool> { typedef bool result_type; + _LIBCPP_INLINE_VISIBILITY bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const {return __x.owner_before(__y);} }; template -class enable_shared_from_this +class _LIBCPP_VISIBLE enable_shared_from_this { mutable weak_ptr<_Tp> __weak_this_; protected: + _LIBCPP_INLINE_VISIBILITY enable_shared_from_this() {} + _LIBCPP_INLINE_VISIBILITY enable_shared_from_this(enable_shared_from_this const&) {} + _LIBCPP_INLINE_VISIBILITY enable_shared_from_this& operator=(enable_shared_from_this const&) {return *this;} + _LIBCPP_INLINE_VISIBILITY ~enable_shared_from_this() {} public: + _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp> shared_from_this() {return shared_ptr<_Tp>(__weak_this_);} + _LIBCPP_INLINE_VISIBILITY shared_ptr<_Tp const> shared_from_this() const {return shared_ptr(__weak_this_);} template friend class shared_ptr; }; template -struct hash > +struct _LIBCPP_VISIBLE hash > { typedef shared_ptr<_Tp> argument_type; typedef size_t result_type; + _LIBCPP_INLINE_VISIBILITY result_type operator()(const argument_type& __ptr) const { return hash<_Tp*>()(__ptr.get()); @@ -3726,7 +3797,7 @@ struct hash > }; //enum class -struct pointer_safety +struct _LIBCPP_VISIBLE pointer_safety { enum _ { @@ -3737,7 +3808,9 @@ struct pointer_safety _ __v_; + _LIBCPP_INLINE_VISIBILITY pointer_safety(_ __v) : __v_(__v) {} + _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} };