]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/include/std/any
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / std / any
index 229c7c6b65ec5cbf38415da886bbb74e7f7c5c2c..bdad76239b4ada0f59ac519a73d023408bdccf20 100644 (file)
@@ -1,6 +1,6 @@
 // <any> -*- C++ -*-
 
-// Copyright (C) 2014-2019 Free Software Foundation, Inc.
+// Copyright (C) 2014-2022 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
 
 #if __cplusplus >= 201703L
 
+#include <initializer_list>
 #include <typeinfo>
 #include <new>
-#include <utility>
 #include <type_traits>
+#include <bits/utility.h> // in_place_type_t
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -71,8 +72,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   /**
    *  @brief A type-safe container of any type.
    *
-   *  An @c any object's state is either empty or it stores a contained object
+   *  An `any` object's state is either empty or it stores a contained object
    *  of CopyConstructible type.
+   *
+   *  @since C++17
    */
   class any
   {
@@ -101,12 +104,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       struct _Manager_external; // creates contained object on the heap
 
     template<typename _Tp>
-      using _Manager = conditional_t<_Internal<_Tp>::value,
-                                    _Manager_internal<_Tp>,
-                                    _Manager_external<_Tp>>;
+      using _Manager = __conditional_t<_Internal<_Tp>::value,
+                                      _Manager_internal<_Tp>,
+                                      _Manager_external<_Tp>>;
 
-    template<typename _Tp, typename _Decayed = decay_t<_Tp>>
-      using _Decay = enable_if_t<!is_same<_Decayed, any>::value, _Decayed>;
+    template<typename _Tp, typename _VTp = decay_t<_Tp>>
+      using _Decay_if_not_any = enable_if_t<!is_same_v<_VTp, any>, _VTp>;
 
     /// Emplace with an object created from @p __args as the contained object.
     template <typename _Tp, typename... _Args,
@@ -125,10 +128,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       void __do_emplace(initializer_list<_Up> __il, _Args&&... __args)
       {
        reset();
-        _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
+       _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
        _M_manager = &_Mgr::_S_manage;
       }
 
+    template <typename _Res, typename _Tp, typename... _Args>
+      using __any_constructible
+       = enable_if<__and_<is_copy_constructible<_Tp>,
+                          is_constructible<_Tp, _Args...>>::value,
+                   _Res>;
+
+    template <typename _Tp, typename... _Args>
+      using __any_constructible_t
+       = typename __any_constructible<bool, _Tp, _Args...>::type;
+
+    template<typename _VTp, typename... _Args>
+      using __emplace_t
+       = typename __any_constructible<_VTp&, _VTp, _Args...>::type;
+
   public:
     // construct/destruct
 
@@ -165,65 +182,39 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
     }
 
-    template <typename _Res, typename _Tp, typename... _Args>
-    using __any_constructible =
-      enable_if<__and_<is_copy_constructible<_Tp>,
-                        is_constructible<_Tp, _Args...>>::value,
-                 _Res>;
-
-    template <typename _Tp, typename... _Args>
-    using __any_constructible_t =
-      typename __any_constructible<bool, _Tp, _Args...>::type;
-
-    /// Construct with a copy of @p __value as the contained object.
-    template <typename _ValueType, typename _Tp = _Decay<_ValueType>,
-             typename _Mgr = _Manager<_Tp>,
-              __any_constructible_t<_Tp, _ValueType&&> = true,
-             enable_if_t<!__is_in_place_type<_Tp>::value, bool> = true>
-      any(_ValueType&& __value)
-      : _M_manager(&_Mgr::_S_manage)
-      {
-        _Mgr::_S_create(_M_storage, std::forward<_ValueType>(__value));
-      }
-
     /// Construct with a copy of @p __value as the contained object.
-    template <typename _ValueType, typename _Tp = _Decay<_ValueType>,
-             typename _Mgr = _Manager<_Tp>,
-              enable_if_t<__and_v<is_copy_constructible<_Tp>,
-                                 __not_<is_constructible<_Tp, _ValueType&&>>,
-                                 __not_<__is_in_place_type<_Tp>>>,
-                         bool> = false>
-      any(_ValueType&& __value)
+    template <typename _Tp, typename _VTp = _Decay_if_not_any<_Tp>,
+             typename _Mgr = _Manager<_VTp>,
+             typename = _Require<__not_<__is_in_place_type<_VTp>>,
+                                 is_copy_constructible<_VTp>>>
+      any(_Tp&& __value)
       : _M_manager(&_Mgr::_S_manage)
       {
-        _Mgr::_S_create(_M_storage, __value);
+       _Mgr::_S_create(_M_storage, std::forward<_Tp>(__value));
       }
 
     /// Construct with an object created from @p __args as the contained object.
-    template <typename _ValueType, typename... _Args,
-             typename _Tp = _Decay<_ValueType>,
-             typename _Mgr = _Manager<_Tp>,
-              __any_constructible_t<_Tp, _Args&&...> = false>
+    template <typename _Tp, typename... _Args, typename _VTp = decay_t<_Tp>,
+             typename _Mgr = _Manager<_VTp>,
+             __any_constructible_t<_VTp, _Args&&...> = false>
       explicit
-      any(in_place_type_t<_ValueType>, _Args&&... __args)
+      any(in_place_type_t<_Tp>, _Args&&... __args)
       : _M_manager(&_Mgr::_S_manage)
       {
-        _Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...);
+       _Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...);
       }
 
     /// Construct with an object created from @p __il and @p __args as
     /// the contained object.
-    template <typename _ValueType, typename _Up, typename... _Args,
-             typename _Tp = _Decay<_ValueType>,
-             typename _Mgr = _Manager<_Tp>,
-              __any_constructible_t<_Tp, initializer_list<_Up>,
+    template <typename _Tp, typename _Up, typename... _Args,
+             typename _VTp = decay_t<_Tp>, typename _Mgr = _Manager<_VTp>,
+             __any_constructible_t<_VTp, initializer_list<_Up>&,
                                    _Args&&...> = false>
       explicit
-      any(in_place_type_t<_ValueType>,
-         initializer_list<_Up> __il, _Args&&... __args)
+      any(in_place_type_t<_Tp>, initializer_list<_Up> __il, _Args&&... __args)
       : _M_manager(&_Mgr::_S_manage)
       {
-        _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
+       _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
       }
 
     /// Destructor, calls @c reset()
@@ -232,7 +223,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     // assignments
 
     /// Copy the state of another object.
-    any& operator=(const any& __rhs)
+    any&
+    operator=(const any& __rhs)
     {
       *this = any(__rhs);
       return *this;
@@ -243,7 +235,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
      *
      * @post @c !__rhs.has_value() (not guaranteed for other implementations)
      */
-    any& operator=(any&& __rhs) noexcept
+    any&
+    operator=(any&& __rhs) noexcept
     {
       if (!__rhs.has_value())
        reset();
@@ -258,40 +251,33 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
     /// Store a copy of @p __rhs as the contained object.
-    template<typename _ValueType>
-      enable_if_t<is_copy_constructible<_Decay<_ValueType>>::value, any&>
-      operator=(_ValueType&& __rhs)
+    template<typename _Tp>
+      enable_if_t<is_copy_constructible<_Decay_if_not_any<_Tp>>::value, any&>
+      operator=(_Tp&& __rhs)
       {
-       *this = any(std::forward<_ValueType>(__rhs));
+       *this = any(std::forward<_Tp>(__rhs));
        return *this;
       }
 
     /// Emplace with an object created from @p __args as the contained object.
-    template <typename _ValueType, typename... _Args>
-      typename __any_constructible<_Decay<_ValueType>&,
-                                  _Decay<_ValueType>, _Args&&...>::type
+    template <typename _Tp, typename... _Args>
+      __emplace_t<decay_t<_Tp>, _Args...>
       emplace(_Args&&... __args)
       {
-       __do_emplace<_Decay<_ValueType>>(std::forward<_Args>(__args)...);
-       any::_Arg __arg;
-       this->_M_manager(any::_Op_access, this, &__arg);
-       return *static_cast<_Decay<_ValueType>*>(__arg._M_obj);
+       using _VTp = decay_t<_Tp>;
+       __do_emplace<_VTp>(std::forward<_Args>(__args)...);
+       return *any::_Manager<_VTp>::_S_access(_M_storage);
       }
 
     /// Emplace with an object created from @p __il and @p __args as
     /// the contained object.
-    template <typename _ValueType, typename _Up, typename... _Args>
-      typename __any_constructible<_Decay<_ValueType>&,
-                                  _Decay<_ValueType>,
-                                  initializer_list<_Up>,
-                                  _Args&&...>::type
+    template <typename _Tp, typename _Up, typename... _Args>
+      __emplace_t<decay_t<_Tp>, initializer_list<_Up>&, _Args&&...>
       emplace(initializer_list<_Up> __il, _Args&&... __args)
       {
-       __do_emplace<_Decay<_ValueType>, _Up>(__il,
-                                             std::forward<_Args>(__args)...);
-       any::_Arg __arg;
-       this->_M_manager(any::_Op_access, this, &__arg);
-       return *static_cast<_Decay<_ValueType>*>(__arg._M_obj);
+       using _VTp = decay_t<_Tp>;
+       __do_emplace<_VTp, _Up>(__il, std::forward<_Args>(__args)...);
+       return *any::_Manager<_VTp>::_S_access(_M_storage);
       }
 
     // modifiers
@@ -353,9 +339,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 #endif
 
+    /// @cond undocumented
     template<typename _Tp>
       static constexpr bool __is_valid_cast()
       { return __or_<is_reference<_Tp>, is_copy_constructible<_Tp>>::value; }
+    /// @endcond
 
   private:
     enum _Op {
@@ -372,8 +360,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     void (*_M_manager)(_Op, const any*, _Arg*);
     _Storage _M_storage;
 
+    /// @cond undocumented
     template<typename _Tp>
       friend void* __any_caster(const any* __any);
+    /// @endcond
 
     // Manage in-place contained object.
     template<typename _Tp>
@@ -397,6 +387,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            void* __addr = &__storage._M_buffer;
            ::new (__addr) _Tp(std::forward<_Args>(__args)...);
          }
+
+       static _Tp*
+       _S_access(const _Storage& __storage)
+       {
+         // The contained object is in __storage._M_buffer
+         const void* __addr = &__storage._M_buffer;
+         return static_cast<_Tp*>(const_cast<void*>(__addr));
+       }
       };
 
     // Manage external contained object.
@@ -418,22 +416,33 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          {
            __storage._M_ptr = new _Tp(std::forward<_Args>(__args)...);
          }
+       static _Tp*
+       _S_access(const _Storage& __storage)
+       {
+         // The contained object is in *__storage._M_ptr
+         return static_cast<_Tp*>(__storage._M_ptr);
+       }
       };
   };
 
   /// Exchange the states of two @c any objects.
   inline void swap(any& __x, any& __y) noexcept { __x.swap(__y); }
 
-  /// Create an any holding a @c _Tp constructed from @c __args.
+  /// Create an `any` holding a `_Tp` constructed from `__args...`.
   template <typename _Tp, typename... _Args>
-    any make_any(_Args&&... __args)
+    inline
+    enable_if_t<is_constructible_v<any, in_place_type_t<_Tp>, _Args...>, any>
+    make_any(_Args&&... __args)
     {
       return any(in_place_type<_Tp>, std::forward<_Args>(__args)...);
     }
 
-  /// Create an any holding a @c _Tp constructed from @c __il and @c __args.
+  /// Create an `any` holding a `_Tp` constructed from `__il` and `__args...`.
   template <typename _Tp, typename _Up, typename... _Args>
-    any make_any(initializer_list<_Up> __il, _Args&&... __args)
+    inline
+    enable_if_t<is_constructible_v<any, in_place_type_t<_Tp>,
+                                  initializer_list<_Up>&, _Args...>, any>
+    make_any(initializer_list<_Up> __il, _Args&&... __args)
     {
       return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...);
     }
@@ -501,7 +510,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        return static_cast<_ValueType>(std::move(*__p));
       __throw_bad_any_cast();
     }
-  // @}
+  /// @}
 
   /// @cond undocumented
   template<typename _Tp>
@@ -524,9 +533,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
          )
        {
-         any::_Arg __arg;
-         __any->_M_manager(any::_Op_access, __any, &__arg);
-         return __arg._M_obj;
+         return any::_Manager<_Up>::_S_access(__any->_M_storage);
        }
       return nullptr;
     }
@@ -560,7 +567,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          return static_cast<_ValueType*>(__any_caster<_ValueType>(__any));
       return nullptr;
     }
-  // @}
+  /// @}
 
   template<typename _Tp>
     void