Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Uses-allocator Construction -*- C++ -*-
  2.  
  3. // Copyright (C) 2010-2015 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 3, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15.  
  16. // Under Section 7 of GPL version 3, you are granted additional
  17. // permissions described in the GCC Runtime Library Exception, version
  18. // 3.1, as published by the Free Software Foundation.
  19.  
  20. // You should have received a copy of the GNU General Public License and
  21. // a copy of the GCC Runtime Library Exception along with this program;
  22. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  23. // <http://www.gnu.org/licenses/>.
  24.  
  25. #ifndef _USES_ALLOCATOR_H
  26. #define _USES_ALLOCATOR_H 1
  27.  
  28. #if __cplusplus < 201103L
  29. # include <bits/c++0x_warning.h>
  30. #else
  31.  
  32. #include <type_traits>
  33.  
  34. namespace std _GLIBCXX_VISIBILITY(default)
  35. {
  36. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  37.  
  38.   /// [allocator.tag]
  39.   struct allocator_arg_t { };
  40.  
  41.   constexpr allocator_arg_t allocator_arg = allocator_arg_t();
  42.  
  43.   template<typename _Tp, typename _Alloc, typename = __void_t<>>
  44.     struct __uses_allocator_helper
  45.     : false_type { };
  46.  
  47.   template<typename _Tp, typename _Alloc>
  48.     struct __uses_allocator_helper<_Tp, _Alloc,
  49.                                    __void_t<typename _Tp::allocator_type>>
  50.     : is_convertible<_Alloc, typename _Tp::allocator_type>::type
  51.     { };
  52.  
  53.   /// [allocator.uses.trait]
  54.   template<typename _Tp, typename _Alloc>
  55.     struct uses_allocator
  56.     : __uses_allocator_helper<_Tp, _Alloc>::type
  57.     { };
  58.  
  59.   struct __uses_alloc_base { };
  60.  
  61.   struct __uses_alloc0 : __uses_alloc_base
  62.   {
  63.     struct _Sink { void operator=(const void*) { } } _M_a;
  64.   };
  65.  
  66.   template<typename _Alloc>
  67.     struct __uses_alloc1 : __uses_alloc_base { const _Alloc* _M_a; };
  68.  
  69.   template<typename _Alloc>
  70.     struct __uses_alloc2 : __uses_alloc_base { const _Alloc* _M_a; };
  71.  
  72.   template<bool, typename _Tp, typename _Alloc, typename... _Args>
  73.     struct __uses_alloc;
  74.  
  75.   template<typename _Tp, typename _Alloc, typename... _Args>
  76.     struct __uses_alloc<true, _Tp, _Alloc, _Args...>
  77.     : conditional<
  78.         is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value,
  79.         __uses_alloc1<_Alloc>,
  80.         __uses_alloc2<_Alloc>>::type
  81.     { };
  82.  
  83.   template<typename _Tp, typename _Alloc, typename... _Args>
  84.     struct __uses_alloc<false, _Tp, _Alloc, _Args...>
  85.     : __uses_alloc0 { };
  86.  
  87.   template<typename _Tp, typename _Alloc, typename... _Args>
  88.     using __uses_alloc_t =
  89.       __uses_alloc<uses_allocator<_Tp, _Alloc>::value, _Tp, _Alloc, _Args...>;
  90.  
  91.   template<typename _Tp, typename _Alloc, typename... _Args>
  92.     inline __uses_alloc_t<_Tp, _Alloc, _Args...>
  93.     __use_alloc(const _Alloc& __a)
  94.     {
  95.       __uses_alloc_t<_Tp, _Alloc, _Args...> __ret;
  96.       __ret._M_a = &__a;
  97.       return __ret;
  98.     }
  99.  
  100. _GLIBCXX_END_NAMESPACE_VERSION
  101. } // namespace std
  102.  
  103. #endif
  104. #endif
  105.