Browse Source

visibility-decoration.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@114658 91177308-0d34-0410-b5e6-96231b3b80d8
Howard Hinnant 15 years ago
parent
commit
28c97e6ee1
2 changed files with 168 additions and 24 deletions
  1. 48 8
      include/scoped_allocator
  2. 120 16
      include/set

+ 48 - 8
include/scoped_allocator

@@ -181,12 +181,14 @@ private:
 
 
 protected:
 protected:
 
 
+    _LIBCPP_INLINE_VISIBILITY
     __scoped_allocator_storage() {}
     __scoped_allocator_storage() {}
 
 
     template <class _OuterA2,
     template <class _OuterA2,
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         __scoped_allocator_storage(_OuterA2&& __outerAlloc,
         __scoped_allocator_storage(_OuterA2&& __outerAlloc,
                                    const _InnerAllocs& ...__innerAllocs)
                                    const _InnerAllocs& ...__innerAllocs)
             : outer_allocator_type(_STD::forward<_OuterA2>(__outerAlloc)),
             : outer_allocator_type(_STD::forward<_OuterA2>(__outerAlloc)),
@@ -196,6 +198,7 @@ protected:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, const _OuterA2&>::value
                         is_constructible<outer_allocator_type, const _OuterA2&>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         __scoped_allocator_storage(
         __scoped_allocator_storage(
             const __scoped_allocator_storage<_OuterA2, _InnerAllocs...>& __other)
             const __scoped_allocator_storage<_OuterA2, _InnerAllocs...>& __other)
             : outer_allocator_type(__other.outer_allocator()),
             : outer_allocator_type(__other.outer_allocator()),
@@ -205,6 +208,7 @@ protected:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         __scoped_allocator_storage(
         __scoped_allocator_storage(
             __scoped_allocator_storage<_OuterA2, _InnerAllocs...>&& __other)
             __scoped_allocator_storage<_OuterA2, _InnerAllocs...>&& __other)
             : outer_allocator_type(_STD::move(__other.outer_allocator())),
             : outer_allocator_type(_STD::move(__other.outer_allocator())),
@@ -214,22 +218,28 @@ protected:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
-    __scoped_allocator_storage(_OuterA2&& __o,
-                               const inner_allocator_type& __i)
-        : outer_allocator_type(_STD::forward<_OuterA2>(__o)),
-          __inner_(__i)
-    {
-    }
+        _LIBCPP_INLINE_VISIBILITY
+        __scoped_allocator_storage(_OuterA2&& __o,
+                                   const inner_allocator_type& __i)
+            : outer_allocator_type(_STD::forward<_OuterA2>(__o)),
+              __inner_(__i)
+        {
+        }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     inner_allocator_type& inner_allocator()             {return __inner_;}
     inner_allocator_type& inner_allocator()             {return __inner_;}
+    _LIBCPP_INLINE_VISIBILITY
     const inner_allocator_type& inner_allocator() const {return __inner_;}
     const inner_allocator_type& inner_allocator() const {return __inner_;}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     outer_allocator_type& outer_allocator()
     outer_allocator_type& outer_allocator()
         {return static_cast<outer_allocator_type&>(*this);}
         {return static_cast<outer_allocator_type&>(*this);}
+    _LIBCPP_INLINE_VISIBILITY
     const outer_allocator_type& outer_allocator() const
     const outer_allocator_type& outer_allocator() const
         {return static_cast<const outer_allocator_type&>(*this);}
         {return static_cast<const outer_allocator_type&>(*this);}
 
 
     scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...>
     scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...>
+    _LIBCPP_INLINE_VISIBILITY
     select_on_container_copy_construction() const
     select_on_container_copy_construction() const
         {
         {
             return scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...>
             return scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...>
@@ -252,12 +262,14 @@ class __scoped_allocator_storage<_OuterAlloc>
 protected:
 protected:
     typedef scoped_allocator_adaptor<_OuterAlloc> inner_allocator_type;
     typedef scoped_allocator_adaptor<_OuterAlloc> inner_allocator_type;
 
 
+    _LIBCPP_INLINE_VISIBILITY
     __scoped_allocator_storage() {}
     __scoped_allocator_storage() {}
 
 
     template <class _OuterA2,
     template <class _OuterA2,
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         __scoped_allocator_storage(_OuterA2&& __outerAlloc)
         __scoped_allocator_storage(_OuterA2&& __outerAlloc)
             : outer_allocator_type(_STD::forward<_OuterA2>(__outerAlloc)) {}
             : outer_allocator_type(_STD::forward<_OuterA2>(__outerAlloc)) {}
 
 
@@ -265,6 +277,7 @@ protected:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, const _OuterA2&>::value
                         is_constructible<outer_allocator_type, const _OuterA2&>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         __scoped_allocator_storage(
         __scoped_allocator_storage(
             const __scoped_allocator_storage<_OuterA2>& __other)
             const __scoped_allocator_storage<_OuterA2>& __other)
             : outer_allocator_type(__other.outer_allocator()) {}
             : outer_allocator_type(__other.outer_allocator()) {}
@@ -273,20 +286,26 @@ protected:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         __scoped_allocator_storage(
         __scoped_allocator_storage(
             __scoped_allocator_storage<_OuterA2>&& __other)
             __scoped_allocator_storage<_OuterA2>&& __other)
             : outer_allocator_type(_STD::move(__other.outer_allocator())) {}
             : outer_allocator_type(_STD::move(__other.outer_allocator())) {}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     inner_allocator_type& inner_allocator()
     inner_allocator_type& inner_allocator()
         {return static_cast<inner_allocator_type&>(*this);}
         {return static_cast<inner_allocator_type&>(*this);}
+    _LIBCPP_INLINE_VISIBILITY
     const inner_allocator_type& inner_allocator() const
     const inner_allocator_type& inner_allocator() const
         {return static_cast<const inner_allocator_type&>(*this);}
         {return static_cast<const inner_allocator_type&>(*this);}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     outer_allocator_type& outer_allocator()
     outer_allocator_type& outer_allocator()
         {return static_cast<outer_allocator_type&>(*this);}
         {return static_cast<outer_allocator_type&>(*this);}
+    _LIBCPP_INLINE_VISIBILITY
     const outer_allocator_type& outer_allocator() const
     const outer_allocator_type& outer_allocator() const
         {return static_cast<const outer_allocator_type&>(*this);}
         {return static_cast<const outer_allocator_type&>(*this);}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     scoped_allocator_adaptor<outer_allocator_type>
     scoped_allocator_adaptor<outer_allocator_type>
     select_on_container_copy_construction() const
     select_on_container_copy_construction() const
         {return scoped_allocator_adaptor<outer_allocator_type>(
         {return scoped_allocator_adaptor<outer_allocator_type>(
@@ -323,6 +342,7 @@ template <class _Alloc, bool = __has_outer_allocator<_Alloc>::value>
 struct __outermost
 struct __outermost
 {
 {
     typedef _Alloc type;
     typedef _Alloc type;
+    _LIBCPP_INLINE_VISIBILITY
     type& operator()(type& __a) const {return __a;}
     type& operator()(type& __a) const {return __a;}
 };
 };
 
 
@@ -334,12 +354,13 @@ struct __outermost<_Alloc, true>
                         decltype(_STD::declval<_Alloc>().outer_allocator())
                         decltype(_STD::declval<_Alloc>().outer_allocator())
                      >::type                                    _OuterAlloc;
                      >::type                                    _OuterAlloc;
     typedef typename __outermost<_OuterAlloc>::type             type;
     typedef typename __outermost<_OuterAlloc>::type             type;
+    _LIBCPP_INLINE_VISIBILITY
     type& operator()(_Alloc& __a) const
     type& operator()(_Alloc& __a) const
         {return __outermost<_OuterAlloc>()(__a.outer_allocator());}
         {return __outermost<_OuterAlloc>()(__a.outer_allocator());}
 };
 };
 
 
 template <class _OuterAlloc, class... _InnerAllocs>
 template <class _OuterAlloc, class... _InnerAllocs>
-class scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...>
+class _LIBCPP_VISIBLE scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...>
     : public __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...>
     : public __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...>
 {
 {
     typedef __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> base;
     typedef __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> base;
@@ -381,11 +402,13 @@ public:
         > other;
         > other;
     };
     };
 
 
+    _LIBCPP_INLINE_VISIBILITY
     scoped_allocator_adaptor() {}
     scoped_allocator_adaptor() {}
     template <class _OuterA2,
     template <class _OuterA2,
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         scoped_allocator_adaptor(_OuterA2&& __outerAlloc,
         scoped_allocator_adaptor(_OuterA2&& __outerAlloc,
                                  const _InnerAllocs& ...__innerAllocs)
                                  const _InnerAllocs& ...__innerAllocs)
             : base(_STD::forward<_OuterA2>(__outerAlloc), __innerAllocs...) {}
             : base(_STD::forward<_OuterA2>(__outerAlloc), __innerAllocs...) {}
@@ -394,6 +417,7 @@ public:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, const _OuterA2&>::value
                         is_constructible<outer_allocator_type, const _OuterA2&>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         scoped_allocator_adaptor(
         scoped_allocator_adaptor(
             const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __other)
             const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __other)
                 : base(__other) {}
                 : base(__other) {}
@@ -401,41 +425,52 @@ public:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+        _LIBCPP_INLINE_VISIBILITY
         scoped_allocator_adaptor(
         scoped_allocator_adaptor(
             scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>&& __other)
             scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>&& __other)
                 : base(_STD::move(__other)) {}
                 : base(_STD::move(__other)) {}
 
 
     // ~scoped_allocator_adaptor() = default;
     // ~scoped_allocator_adaptor() = default;
 
 
+    _LIBCPP_INLINE_VISIBILITY
     inner_allocator_type& inner_allocator()
     inner_allocator_type& inner_allocator()
         {return base::inner_allocator();}
         {return base::inner_allocator();}
+    _LIBCPP_INLINE_VISIBILITY
     const inner_allocator_type& inner_allocator() const
     const inner_allocator_type& inner_allocator() const
         {return base::inner_allocator();}
         {return base::inner_allocator();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     outer_allocator_type& outer_allocator()
     outer_allocator_type& outer_allocator()
         {return base::outer_allocator();}
         {return base::outer_allocator();}
+    _LIBCPP_INLINE_VISIBILITY
     const outer_allocator_type& outer_allocator() const
     const outer_allocator_type& outer_allocator() const
         {return base::outer_allocator();}
         {return base::outer_allocator();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     pointer allocate(size_type __n)
     pointer allocate(size_type __n)
         {return allocator_traits<outer_allocator_type>::
         {return allocator_traits<outer_allocator_type>::
             allocate(outer_allocator(), __n);}
             allocate(outer_allocator(), __n);}
+    _LIBCPP_INLINE_VISIBILITY
     pointer allocate(size_type __n, const_void_pointer __hint)
     pointer allocate(size_type __n, const_void_pointer __hint)
         {return allocator_traits<outer_allocator_type>::
         {return allocator_traits<outer_allocator_type>::
             allocate(outer_allocator(), __n, __hint);}
             allocate(outer_allocator(), __n, __hint);}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     void deallocate(pointer __p, size_type __n)
     void deallocate(pointer __p, size_type __n)
         {allocator_traits<outer_allocator_type>::
         {allocator_traits<outer_allocator_type>::
             deallocate(outer_allocator(), __p, __n);}
             deallocate(outer_allocator(), __p, __n);}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     size_type max_size() const
     size_type max_size() const
-        {allocator_traits<outer_allocator_type>::max_size(outer_allocator());}
+        {return allocator_traits<outer_allocator_type>::max_size(outer_allocator());}
 
 
     template <class _Tp, class... _Args>
     template <class _Tp, class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         void construct(_Tp* __p, _Args&& ...__args)
         void construct(_Tp* __p, _Args&& ...__args)
             {__construct(__uses_alloc_ctor<_Tp, inner_allocator_type, _Args...>(),
             {__construct(__uses_alloc_ctor<_Tp, inner_allocator_type, _Args...>(),
                          __p, _STD::forward<_Args>(__args)...);}
                          __p, _STD::forward<_Args>(__args)...);}
     template <class _Tp>
     template <class _Tp>
+        _LIBCPP_INLINE_VISIBILITY
         void destroy(_Tp* __p)
         void destroy(_Tp* __p)
             {
             {
                 typedef __outermost<outer_allocator_type> _OM;
                 typedef __outermost<outer_allocator_type> _OM;
@@ -443,6 +478,7 @@ public:
                                          destroy(_OM()(outer_allocator()), __p);
                                          destroy(_OM()(outer_allocator()), __p);
             }
             }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     scoped_allocator_adaptor select_on_container_copy_construction() const
     scoped_allocator_adaptor select_on_container_copy_construction() const
         {return base::select_on_container_copy_construction();}
         {return base::select_on_container_copy_construction();}
 
 
@@ -452,11 +488,13 @@ private:
               class = typename enable_if<
               class = typename enable_if<
                         is_constructible<outer_allocator_type, _OuterA2>::value
                         is_constructible<outer_allocator_type, _OuterA2>::value
                       >::type>
                       >::type>
+    _LIBCPP_INLINE_VISIBILITY
     scoped_allocator_adaptor(_OuterA2&& __o,
     scoped_allocator_adaptor(_OuterA2&& __o,
                              const inner_allocator_type& __i)
                              const inner_allocator_type& __i)
         : base(_STD::forward<_OuterA2>(__o), __i) {}
         : base(_STD::forward<_OuterA2>(__o), __i) {}
 
 
     template <class _Tp, class... _Args>
     template <class _Tp, class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         void __construct(integral_constant<int, 0>, _Tp* __p, _Args&& ...__args)
         void __construct(integral_constant<int, 0>, _Tp* __p, _Args&& ...__args)
             {
             {
                 typedef __outermost<outer_allocator_type> _OM;
                 typedef __outermost<outer_allocator_type> _OM;
@@ -469,6 +507,7 @@ private:
             }
             }
 
 
     template <class _Tp, class... _Args>
     template <class _Tp, class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         void __construct(integral_constant<int, 1>, _Tp* __p, _Args&& ...__args)
         void __construct(integral_constant<int, 1>, _Tp* __p, _Args&& ...__args)
             {
             {
                 typedef __outermost<outer_allocator_type> _OM;
                 typedef __outermost<outer_allocator_type> _OM;
@@ -483,6 +522,7 @@ private:
             }
             }
 
 
     template <class _Tp, class... _Args>
     template <class _Tp, class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         void __construct(integral_constant<int, 2>, _Tp* __p, _Args&& ...__args)
         void __construct(integral_constant<int, 2>, _Tp* __p, _Args&& ...__args)
             {
             {
                 typedef __outermost<outer_allocator_type> _OM;
                 typedef __outermost<outer_allocator_type> _OM;

+ 120 - 16
include/set

@@ -310,7 +310,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 
 template <class _Key, class _Compare = less<_Key>,
 template <class _Key, class _Compare = less<_Key>,
           class _Allocator = allocator<_Key> >
           class _Allocator = allocator<_Key> >
-class set
+class _LIBCPP_VISIBLE set
 {
 {
 public:
 public:
     // types:
     // types:
@@ -339,11 +339,14 @@ public:
     typedef _STD::reverse_iterator<iterator>       reverse_iterator;
     typedef _STD::reverse_iterator<iterator>       reverse_iterator;
     typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
     typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
 
 
+    _LIBCPP_INLINE_VISIBILITY
     explicit set(const value_compare& __comp = value_compare())
     explicit set(const value_compare& __comp = value_compare())
         : __tree_(__comp) {}
         : __tree_(__comp) {}
+    _LIBCPP_INLINE_VISIBILITY
     set(const value_compare& __comp, const allocator_type& __a)
     set(const value_compare& __comp, const allocator_type& __a)
         : __tree_(__comp, __a) {}
         : __tree_(__comp, __a) {}
     template <class _InputIterator>
     template <class _InputIterator>
+        _LIBCPP_INLINE_VISIBILITY
         set(_InputIterator __f, _InputIterator __l,
         set(_InputIterator __f, _InputIterator __l,
             const value_compare& __comp = value_compare())
             const value_compare& __comp = value_compare())
         : __tree_(__comp)
         : __tree_(__comp)
@@ -352,6 +355,7 @@ public:
         }
         }
 
 
     template <class _InputIterator>
     template <class _InputIterator>
+        _LIBCPP_INLINE_VISIBILITY
         set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
         set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
             const allocator_type& __a)
             const allocator_type& __a)
         : __tree_(__comp, __a)
         : __tree_(__comp, __a)
@@ -359,6 +363,7 @@ public:
             insert(__f, __l);
             insert(__f, __l);
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     set(const set& __s)
     set(const set& __s)
         : __tree_(__s.__tree_)
         : __tree_(__s.__tree_)
         {
         {
@@ -366,13 +371,16 @@ public:
         }
         }
 
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     set(set&& __s)
     set(set&& __s)
         : __tree_(_STD::move(__s.__tree_)) {}
         : __tree_(_STD::move(__s.__tree_)) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 
+    _LIBCPP_INLINE_VISIBILITY
     explicit set(const allocator_type& __a)
     explicit set(const allocator_type& __a)
         : __tree_(__a) {}
         : __tree_(__a) {}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     set(const set& __s, const allocator_type& __a)
     set(const set& __s, const allocator_type& __a)
         : __tree_(__s.__tree_.value_comp(), __a)
         : __tree_(__s.__tree_.value_comp(), __a)
         {
         {
@@ -383,12 +391,14 @@ public:
     set(set&& __s, const allocator_type& __a);
     set(set&& __s, const allocator_type& __a);
 #endif
 #endif
 
 
+    _LIBCPP_INLINE_VISIBILITY
     set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
     set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
         : __tree_(__comp)
         : __tree_(__comp)
         {
         {
             insert(__il.begin(), __il.end());
             insert(__il.begin(), __il.end());
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     set(initializer_list<value_type> __il, const value_compare& __comp,
     set(initializer_list<value_type> __il, const value_compare& __comp,
         const allocator_type& __a)
         const allocator_type& __a)
         : __tree_(__comp, __a)
         : __tree_(__comp, __a)
@@ -396,6 +406,7 @@ public:
             insert(__il.begin(), __il.end());
             insert(__il.begin(), __il.end());
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     set& operator=(initializer_list<value_type> __il)
     set& operator=(initializer_list<value_type> __il)
         {
         {
             __tree_.__assign_unique(__il.begin(), __il.end());
             __tree_.__assign_unique(__il.begin(), __il.end());
@@ -403,6 +414,7 @@ public:
         }
         }
 
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     set& operator=(set&& __s)
     set& operator=(set&& __s)
         {
         {
             __tree_ = _STD::move(__s.__tree_);
             __tree_ = _STD::move(__s.__tree_);
@@ -410,84 +422,124 @@ public:
         }
         }
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 
+    _LIBCPP_INLINE_VISIBILITY
           iterator begin()       {return __tree_.begin();}
           iterator begin()       {return __tree_.begin();}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator begin() const {return __tree_.begin();}
     const_iterator begin() const {return __tree_.begin();}
+    _LIBCPP_INLINE_VISIBILITY
           iterator end()         {return __tree_.end();}
           iterator end()         {return __tree_.end();}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator end()   const {return __tree_.end();}
     const_iterator end()   const {return __tree_.end();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
           reverse_iterator rbegin()       {return       reverse_iterator(end());}
           reverse_iterator rbegin()       {return       reverse_iterator(end());}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
     const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
+    _LIBCPP_INLINE_VISIBILITY
           reverse_iterator rend()         {return       reverse_iterator(begin());}
           reverse_iterator rend()         {return       reverse_iterator(begin());}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator rend()   const {return const_reverse_iterator(begin());}
     const_reverse_iterator rend()   const {return const_reverse_iterator(begin());}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator         cbegin()  const {return begin();}
     const_iterator         cbegin()  const {return begin();}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator         cend()    const {return end();}
     const_iterator         cend()    const {return end();}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator crbegin() const {return rbegin();}
     const_reverse_iterator crbegin() const {return rbegin();}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator crend()   const {return rend();}
     const_reverse_iterator crend()   const {return rend();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     bool      empty()    const {return __tree_.size() == 0;}
     bool      empty()    const {return __tree_.size() == 0;}
+    _LIBCPP_INLINE_VISIBILITY
     size_type size()     const {return __tree_.size();}
     size_type size()     const {return __tree_.size();}
+    _LIBCPP_INLINE_VISIBILITY
     size_type max_size() const {return __tree_.max_size();}
     size_type max_size() const {return __tree_.max_size();}
 
 
     // modifiers:
     // modifiers:
 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
     template <class... _Args>
     template <class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         pair<iterator, bool> emplace(_Args&&... __args)
         pair<iterator, bool> emplace(_Args&&... __args)
             {return __tree_.__emplace_unique(_STD::forward<_Args>(__args)...);}
             {return __tree_.__emplace_unique(_STD::forward<_Args>(__args)...);}
     template <class... _Args>
     template <class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         iterator emplace_hint(const_iterator __p, _Args&&... __args)
         iterator emplace_hint(const_iterator __p, _Args&&... __args)
             {return __tree_.__emplace_hint_unique(__p, _STD::forward<_Args>(__args)...);}
             {return __tree_.__emplace_hint_unique(__p, _STD::forward<_Args>(__args)...);}
 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
+    _LIBCPP_INLINE_VISIBILITY
     pair<iterator,bool> insert(const value_type& __v)
     pair<iterator,bool> insert(const value_type& __v)
         {return __tree_.__insert_unique(__v);}
         {return __tree_.__insert_unique(__v);}
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     pair<iterator,bool> insert(value_type&& __v)
     pair<iterator,bool> insert(value_type&& __v)
         {return __tree_.__insert_unique(_STD::move(__v));}
         {return __tree_.__insert_unique(_STD::move(__v));}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     iterator insert(const_iterator __p, const value_type& __v)
     iterator insert(const_iterator __p, const value_type& __v)
         {return __tree_.__insert_unique(__p, __v);}
         {return __tree_.__insert_unique(__p, __v);}
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     iterator insert(const_iterator __p, value_type&& __v)
     iterator insert(const_iterator __p, value_type&& __v)
         {return __tree_.__insert_unique(__p, _STD::move(__v));}
         {return __tree_.__insert_unique(__p, _STD::move(__v));}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     template <class _InputIterator>
     template <class _InputIterator>
+        _LIBCPP_INLINE_VISIBILITY
         void insert(_InputIterator __f, _InputIterator __l)
         void insert(_InputIterator __f, _InputIterator __l)
         {
         {
             for (const_iterator __e = cend(); __f != __l; ++__f)
             for (const_iterator __e = cend(); __f != __l; ++__f)
                 __tree_.__insert_unique(__e, *__f);
                 __tree_.__insert_unique(__e, *__f);
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     void insert(initializer_list<value_type> __il)
     void insert(initializer_list<value_type> __il)
         {insert(__il.begin(), __il.end());}
         {insert(__il.begin(), __il.end());}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
+    _LIBCPP_INLINE_VISIBILITY
     size_type erase(const key_type& __k)
     size_type erase(const key_type& __k)
         {return __tree_.__erase_unique(__k);}
         {return __tree_.__erase_unique(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     iterator  erase(const_iterator __f, const_iterator __l)
     iterator  erase(const_iterator __f, const_iterator __l)
         {return __tree_.erase(__f, __l);}
         {return __tree_.erase(__f, __l);}
+    _LIBCPP_INLINE_VISIBILITY
     void clear() {__tree_.clear();}
     void clear() {__tree_.clear();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     void swap(set& __s) {__tree_.swap(__s.__tree_);}
     void swap(set& __s) {__tree_.swap(__s.__tree_);}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     allocator_type get_allocator() const {return __tree_.__alloc();}
     allocator_type get_allocator() const {return __tree_.__alloc();}
+    _LIBCPP_INLINE_VISIBILITY
     key_compare    key_comp()      const {return __tree_.value_comp();}
     key_compare    key_comp()      const {return __tree_.value_comp();}
+    _LIBCPP_INLINE_VISIBILITY
     value_compare  value_comp()    const {return __tree_.value_comp();}
     value_compare  value_comp()    const {return __tree_.value_comp();}
 
 
     // set operations:
     // set operations:
+    _LIBCPP_INLINE_VISIBILITY
     iterator find(const key_type& __k)             {return __tree_.find(__k);}
     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);}
     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     size_type      count(const key_type& __k) const
     size_type      count(const key_type& __k) const
         {return __tree_.__count_unique(__k);}
         {return __tree_.__count_unique(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     iterator lower_bound(const key_type& __k)
     iterator lower_bound(const key_type& __k)
         {return __tree_.lower_bound(__k);}
         {return __tree_.lower_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator lower_bound(const key_type& __k) const
     const_iterator lower_bound(const key_type& __k) const
         {return __tree_.lower_bound(__k);}
         {return __tree_.lower_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     iterator upper_bound(const key_type& __k)
     iterator upper_bound(const key_type& __k)
         {return __tree_.upper_bound(__k);}
         {return __tree_.upper_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator upper_bound(const key_type& __k) const
     const_iterator upper_bound(const key_type& __k) const
         {return __tree_.upper_bound(__k);}
         {return __tree_.upper_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     pair<iterator,iterator> equal_range(const key_type& __k)
     pair<iterator,iterator> equal_range(const key_type& __k)
         {return __tree_.__equal_range_unique(__k);}
         {return __tree_.__equal_range_unique(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
         {return __tree_.__equal_range_unique(__k);}
         {return __tree_.__equal_range_unique(__k);}
 };
 };
@@ -509,7 +561,7 @@ set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator==(const set<_Key, _Compare, _Allocator>& __x,
 operator==(const set<_Key, _Compare, _Allocator>& __x,
            const set<_Key, _Compare, _Allocator>& __y)
            const set<_Key, _Compare, _Allocator>& __y)
@@ -518,7 +570,7 @@ operator==(const set<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator< (const set<_Key, _Compare, _Allocator>& __x,
 operator< (const set<_Key, _Compare, _Allocator>& __x,
            const set<_Key, _Compare, _Allocator>& __y)
            const set<_Key, _Compare, _Allocator>& __y)
@@ -527,7 +579,7 @@ operator< (const set<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator!=(const set<_Key, _Compare, _Allocator>& __x,
 operator!=(const set<_Key, _Compare, _Allocator>& __x,
            const set<_Key, _Compare, _Allocator>& __y)
            const set<_Key, _Compare, _Allocator>& __y)
@@ -536,7 +588,7 @@ operator!=(const set<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator> (const set<_Key, _Compare, _Allocator>& __x,
 operator> (const set<_Key, _Compare, _Allocator>& __x,
            const set<_Key, _Compare, _Allocator>& __y)
            const set<_Key, _Compare, _Allocator>& __y)
@@ -545,7 +597,7 @@ operator> (const set<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator>=(const set<_Key, _Compare, _Allocator>& __x,
 operator>=(const set<_Key, _Compare, _Allocator>& __x,
            const set<_Key, _Compare, _Allocator>& __y)
            const set<_Key, _Compare, _Allocator>& __y)
@@ -554,7 +606,7 @@ operator>=(const set<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator<=(const set<_Key, _Compare, _Allocator>& __x,
 operator<=(const set<_Key, _Compare, _Allocator>& __x,
            const set<_Key, _Compare, _Allocator>& __y)
            const set<_Key, _Compare, _Allocator>& __y)
@@ -564,7 +616,7 @@ operator<=(const set<_Key, _Compare, _Allocator>& __x,
 
 
 // specialized algorithms:
 // specialized algorithms:
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 void
 void
 swap(set<_Key, _Compare, _Allocator>& __x,
 swap(set<_Key, _Compare, _Allocator>& __x,
      set<_Key, _Compare, _Allocator>& __y)
      set<_Key, _Compare, _Allocator>& __y)
@@ -574,7 +626,7 @@ swap(set<_Key, _Compare, _Allocator>& __x,
 
 
 template <class _Key, class _Compare = less<_Key>,
 template <class _Key, class _Compare = less<_Key>,
           class _Allocator = allocator<_Key> >
           class _Allocator = allocator<_Key> >
-class multiset
+class _LIBCPP_VISIBLE multiset
 {
 {
 public:
 public:
     // types:
     // types:
@@ -604,11 +656,14 @@ public:
     typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
     typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
 
 
     // construct/copy/destroy:
     // construct/copy/destroy:
+    _LIBCPP_INLINE_VISIBILITY
     explicit multiset(const value_compare& __comp = value_compare())
     explicit multiset(const value_compare& __comp = value_compare())
         : __tree_(__comp) {}
         : __tree_(__comp) {}
+    _LIBCPP_INLINE_VISIBILITY
     multiset(const value_compare& __comp, const allocator_type& __a)
     multiset(const value_compare& __comp, const allocator_type& __a)
         : __tree_(__comp, __a) {}
         : __tree_(__comp, __a) {}
     template <class _InputIterator>
     template <class _InputIterator>
+        _LIBCPP_INLINE_VISIBILITY
         multiset(_InputIterator __f, _InputIterator __l,
         multiset(_InputIterator __f, _InputIterator __l,
                  const value_compare& __comp = value_compare())
                  const value_compare& __comp = value_compare())
         : __tree_(__comp)
         : __tree_(__comp)
@@ -617,6 +672,7 @@ public:
         }
         }
 
 
     template <class _InputIterator>
     template <class _InputIterator>
+        _LIBCPP_INLINE_VISIBILITY
         multiset(_InputIterator __f, _InputIterator __l,
         multiset(_InputIterator __f, _InputIterator __l,
                  const value_compare& __comp, const allocator_type& __a)
                  const value_compare& __comp, const allocator_type& __a)
         : __tree_(__comp, __a)
         : __tree_(__comp, __a)
@@ -624,6 +680,7 @@ public:
             insert(__f, __l);
             insert(__f, __l);
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     multiset(const multiset& __s)
     multiset(const multiset& __s)
         : __tree_(__s.__tree_.value_comp(),
         : __tree_(__s.__tree_.value_comp(),
           __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
           __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
@@ -632,11 +689,14 @@ public:
         }
         }
 
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     multiset(multiset&& __s)
     multiset(multiset&& __s)
         : __tree_(_STD::move(__s.__tree_)) {}
         : __tree_(_STD::move(__s.__tree_)) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     explicit multiset(const allocator_type& __a)
     explicit multiset(const allocator_type& __a)
         : __tree_(__a) {}
         : __tree_(__a) {}
+    _LIBCPP_INLINE_VISIBILITY
     multiset(const multiset& __s, const allocator_type& __a)
     multiset(const multiset& __s, const allocator_type& __a)
         : __tree_(__s.__tree_.value_comp(), __a)
         : __tree_(__s.__tree_.value_comp(), __a)
         {
         {
@@ -646,12 +706,14 @@ public:
     multiset(multiset&& __s, const allocator_type& __a);
     multiset(multiset&& __s, const allocator_type& __a);
 #endif
 #endif
 
 
+    _LIBCPP_INLINE_VISIBILITY
     multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
     multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
         : __tree_(__comp)
         : __tree_(__comp)
         {
         {
             insert(__il.begin(), __il.end());
             insert(__il.begin(), __il.end());
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     multiset(initializer_list<value_type> __il, const value_compare& __comp,
     multiset(initializer_list<value_type> __il, const value_compare& __comp,
         const allocator_type& __a)
         const allocator_type& __a)
         : __tree_(__comp, __a)
         : __tree_(__comp, __a)
@@ -659,6 +721,7 @@ public:
             insert(__il.begin(), __il.end());
             insert(__il.begin(), __il.end());
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     multiset& operator=(initializer_list<value_type> __il)
     multiset& operator=(initializer_list<value_type> __il)
         {
         {
             __tree_.__assign_multi(__il.begin(), __il.end());
             __tree_.__assign_multi(__il.begin(), __il.end());
@@ -666,6 +729,7 @@ public:
         }
         }
 
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     multiset& operator=(multiset&& __s)
     multiset& operator=(multiset&& __s)
         {
         {
             __tree_ = _STD::move(__s.__tree_);
             __tree_ = _STD::move(__s.__tree_);
@@ -673,83 +737,123 @@ public:
         }
         }
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 
+    _LIBCPP_INLINE_VISIBILITY
           iterator begin()       {return __tree_.begin();}
           iterator begin()       {return __tree_.begin();}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator begin() const {return __tree_.begin();}
     const_iterator begin() const {return __tree_.begin();}
+    _LIBCPP_INLINE_VISIBILITY
           iterator end()         {return __tree_.end();}
           iterator end()         {return __tree_.end();}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator end()   const {return __tree_.end();}
     const_iterator end()   const {return __tree_.end();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
           reverse_iterator rbegin()       {return       reverse_iterator(end());}
           reverse_iterator rbegin()       {return       reverse_iterator(end());}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
     const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
+    _LIBCPP_INLINE_VISIBILITY
           reverse_iterator rend()         {return       reverse_iterator(begin());}
           reverse_iterator rend()         {return       reverse_iterator(begin());}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator rend()   const {return const_reverse_iterator(begin());}
     const_reverse_iterator rend()   const {return const_reverse_iterator(begin());}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator         cbegin()  const {return begin();}
     const_iterator         cbegin()  const {return begin();}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator         cend()    const {return end();}
     const_iterator         cend()    const {return end();}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator crbegin() const {return rbegin();}
     const_reverse_iterator crbegin() const {return rbegin();}
+    _LIBCPP_INLINE_VISIBILITY
     const_reverse_iterator crend()   const {return rend();}
     const_reverse_iterator crend()   const {return rend();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     bool      empty()    const {return __tree_.size() == 0;}
     bool      empty()    const {return __tree_.size() == 0;}
+    _LIBCPP_INLINE_VISIBILITY
     size_type size()     const {return __tree_.size();}
     size_type size()     const {return __tree_.size();}
+    _LIBCPP_INLINE_VISIBILITY
     size_type max_size() const {return __tree_.max_size();}
     size_type max_size() const {return __tree_.max_size();}
 
 
     // modifiers:
     // modifiers:
 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
     template <class... _Args>
     template <class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         iterator emplace(_Args&&... __args)
         iterator emplace(_Args&&... __args)
             {return __tree_.__emplace_multi(_STD::forward<_Args>(__args)...);}
             {return __tree_.__emplace_multi(_STD::forward<_Args>(__args)...);}
     template <class... _Args>
     template <class... _Args>
+        _LIBCPP_INLINE_VISIBILITY
         iterator emplace_hint(const_iterator __p, _Args&&... __args)
         iterator emplace_hint(const_iterator __p, _Args&&... __args)
             {return __tree_.__emplace_hint_multi(__p, _STD::forward<_Args>(__args)...);}
             {return __tree_.__emplace_hint_multi(__p, _STD::forward<_Args>(__args)...);}
 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
+    _LIBCPP_INLINE_VISIBILITY
     iterator insert(const value_type& __v)
     iterator insert(const value_type& __v)
         {return __tree_.__insert_multi(__v);}
         {return __tree_.__insert_multi(__v);}
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     iterator insert(value_type&& __v)
     iterator insert(value_type&& __v)
         {return __tree_.__insert_multi(_STD::move(__v));}
         {return __tree_.__insert_multi(_STD::move(__v));}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     iterator insert(const_iterator __p, const value_type& __v)
     iterator insert(const_iterator __p, const value_type& __v)
         {return __tree_.__insert_multi(__p, __v);}
         {return __tree_.__insert_multi(__p, __v);}
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+    _LIBCPP_INLINE_VISIBILITY
     iterator insert(const_iterator __p, value_type&& __v)
     iterator insert(const_iterator __p, value_type&& __v)
         {return __tree_.__insert_multi(_STD::move(__v));}
         {return __tree_.__insert_multi(_STD::move(__v));}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     template <class _InputIterator>
     template <class _InputIterator>
+        _LIBCPP_INLINE_VISIBILITY
         void insert(_InputIterator __f, _InputIterator __l)
         void insert(_InputIterator __f, _InputIterator __l)
         {
         {
             for (const_iterator __e = cend(); __f != __l; ++__f)
             for (const_iterator __e = cend(); __f != __l; ++__f)
                 __tree_.__insert_multi(__e, *__f);
                 __tree_.__insert_multi(__e, *__f);
         }
         }
 
 
+    _LIBCPP_INLINE_VISIBILITY
     void insert(initializer_list<value_type> __il)
     void insert(initializer_list<value_type> __il)
         {insert(__il.begin(), __il.end());}
         {insert(__il.begin(), __il.end());}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
+    _LIBCPP_INLINE_VISIBILITY
     size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
     size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     iterator  erase(const_iterator __f, const_iterator __l)
     iterator  erase(const_iterator __f, const_iterator __l)
         {return __tree_.erase(__f, __l);}
         {return __tree_.erase(__f, __l);}
+    _LIBCPP_INLINE_VISIBILITY
     void clear() {__tree_.clear();}
     void clear() {__tree_.clear();}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     void swap(multiset& __s) {__tree_.swap(__s.__tree_);}
     void swap(multiset& __s) {__tree_.swap(__s.__tree_);}
 
 
+    _LIBCPP_INLINE_VISIBILITY
     allocator_type get_allocator() const {return __tree_.__alloc();}
     allocator_type get_allocator() const {return __tree_.__alloc();}
+    _LIBCPP_INLINE_VISIBILITY
     key_compare    key_comp()      const {return __tree_.value_comp();}
     key_compare    key_comp()      const {return __tree_.value_comp();}
+    _LIBCPP_INLINE_VISIBILITY
     value_compare  value_comp()    const {return __tree_.value_comp();}
     value_compare  value_comp()    const {return __tree_.value_comp();}
 
 
     // set operations:
     // set operations:
+    _LIBCPP_INLINE_VISIBILITY
     iterator find(const key_type& __k)             {return __tree_.find(__k);}
     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);}
     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     size_type      count(const key_type& __k) const
     size_type      count(const key_type& __k) const
         {return __tree_.__count_multi(__k);}
         {return __tree_.__count_multi(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     iterator lower_bound(const key_type& __k)
     iterator lower_bound(const key_type& __k)
         {return __tree_.lower_bound(__k);}
         {return __tree_.lower_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator lower_bound(const key_type& __k) const
     const_iterator lower_bound(const key_type& __k) const
             {return __tree_.lower_bound(__k);}
             {return __tree_.lower_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     iterator upper_bound(const key_type& __k)
     iterator upper_bound(const key_type& __k)
             {return __tree_.upper_bound(__k);}
             {return __tree_.upper_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     const_iterator upper_bound(const key_type& __k) const
     const_iterator upper_bound(const key_type& __k) const
             {return __tree_.upper_bound(__k);}
             {return __tree_.upper_bound(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     pair<iterator,iterator>             equal_range(const key_type& __k)
     pair<iterator,iterator>             equal_range(const key_type& __k)
             {return __tree_.__equal_range_multi(__k);}
             {return __tree_.__equal_range_multi(__k);}
+    _LIBCPP_INLINE_VISIBILITY
     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
             {return __tree_.__equal_range_multi(__k);}
             {return __tree_.__equal_range_multi(__k);}
 };
 };
@@ -771,7 +875,7 @@ multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_t
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator==(const multiset<_Key, _Compare, _Allocator>& __x,
 operator==(const multiset<_Key, _Compare, _Allocator>& __x,
            const multiset<_Key, _Compare, _Allocator>& __y)
            const multiset<_Key, _Compare, _Allocator>& __y)
@@ -780,7 +884,7 @@ operator==(const multiset<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator< (const multiset<_Key, _Compare, _Allocator>& __x,
 operator< (const multiset<_Key, _Compare, _Allocator>& __x,
            const multiset<_Key, _Compare, _Allocator>& __y)
            const multiset<_Key, _Compare, _Allocator>& __y)
@@ -789,7 +893,7 @@ operator< (const multiset<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
 operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
            const multiset<_Key, _Compare, _Allocator>& __y)
            const multiset<_Key, _Compare, _Allocator>& __y)
@@ -798,7 +902,7 @@ operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator> (const multiset<_Key, _Compare, _Allocator>& __x,
 operator> (const multiset<_Key, _Compare, _Allocator>& __x,
            const multiset<_Key, _Compare, _Allocator>& __y)
            const multiset<_Key, _Compare, _Allocator>& __y)
@@ -807,7 +911,7 @@ operator> (const multiset<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
 operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
            const multiset<_Key, _Compare, _Allocator>& __y)
            const multiset<_Key, _Compare, _Allocator>& __y)
@@ -816,7 +920,7 @@ operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 bool
 operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
 operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
            const multiset<_Key, _Compare, _Allocator>& __y)
            const multiset<_Key, _Compare, _Allocator>& __y)
@@ -825,7 +929,7 @@ operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
 }
 }
 
 
 template <class _Key, class _Compare, class _Allocator>
 template <class _Key, class _Compare, class _Allocator>
-inline
+inline _LIBCPP_INLINE_VISIBILITY
 void
 void
 swap(multiset<_Key, _Compare, _Allocator>& __x,
 swap(multiset<_Key, _Compare, _Allocator>& __x,
      multiset<_Key, _Compare, _Allocator>& __y)
      multiset<_Key, _Compare, _Allocator>& __y)