aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/ext/array_allocator.h19
-rw-r--r--libstdc++-v3/include/ext/bitmap_allocator.h14
-rw-r--r--libstdc++-v3/include/ext/extptr_allocator.h15
-rw-r--r--libstdc++-v3/include/ext/malloc_allocator.h20
-rw-r--r--libstdc++-v3/include/ext/mt_allocator.h16
-rw-r--r--libstdc++-v3/include/ext/new_allocator.h16
-rw-r--r--libstdc++-v3/include/ext/pool_allocator.h19
-rw-r--r--libstdc++-v3/include/ext/throw_allocator.h30
-rw-r--r--libstdc++-v3/testsuite/util/testsuite_allocator.h66
10 files changed, 132 insertions, 96 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f02cede..f96b961 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,16 @@
+2011-06-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * include/ext/throw_allocator.h: Use noexcept.
+ * include/ext/pool_allocator.h: Likewise.
+ * include/ext/bitmap_allocator.h: Likewise.
+ * include/ext/new_allocator.h: Likewise.
+ * include/ext/malloc_allocator.h: Likewise.
+ * include/ext/array_allocator.h: Likewise.
+ * include/ext/mt_allocator.h: Likewise.
+ * include/ext/extptr_allocator.h: Likewise.
+ * testsuite/util/testsuite_allocator.h: Likewise; do not include
+ <cassert> directly, include <testsuite_hooks.h> instead.
+
2011-06-10 Benjamin Kosnik <bkoz@redhat.com>
* include/ext/pb_ds/*: Doxygen markup redo.
diff --git a/libstdc++-v3/include/ext/array_allocator.h b/libstdc++-v3/include/ext/array_allocator.h
index cee53f5..2c9666a 100644
--- a/libstdc++-v3/include/ext/array_allocator.h
+++ b/libstdc++-v3/include/ext/array_allocator.h
@@ -1,6 +1,6 @@
// array allocator -*- C++ -*-
-// Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -57,10 +57,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef _Tp value_type;
pointer
- address(reference __x) const { return std::__addressof(__x); }
+ address(reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
const_pointer
- address(const_reference __x) const { return std::__addressof(__x); }
+ address(const_reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
void
deallocate(pointer, size_type)
@@ -69,7 +71,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_t(-1) / sizeof(_Tp); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
@@ -120,17 +122,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef array_allocator<_Tp1, _Array1> other; };
- array_allocator(array_type* __array = 0) throw()
+ array_allocator(array_type* __array = 0) _GLIBCXX_USE_NOEXCEPT
: _M_array(__array), _M_used(size_type()) { }
- array_allocator(const array_allocator& __o) throw()
+ array_allocator(const array_allocator& __o) _GLIBCXX_USE_NOEXCEPT
: _M_array(__o._M_array), _M_used(__o._M_used) { }
template<typename _Tp1, typename _Array1>
- array_allocator(const array_allocator<_Tp1, _Array1>&) throw()
+ array_allocator(const array_allocator<_Tp1, _Array1>&)
+ _GLIBCXX_USE_NOEXCEPT
: _M_array(0), _M_used(size_type()) { }
- ~array_allocator() throw() { }
+ ~array_allocator() _GLIBCXX_USE_NOEXCEPT { }
pointer
allocate(size_type __n, const void* = 0)
diff --git a/libstdc++-v3/include/ext/bitmap_allocator.h b/libstdc++-v3/include/ext/bitmap_allocator.h
index b03dc6a..dd0634b 100644
--- a/libstdc++-v3/include/ext/bitmap_allocator.h
+++ b/libstdc++-v3/include/ext/bitmap_allocator.h
@@ -997,17 +997,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
public:
- bitmap_allocator() throw()
+ bitmap_allocator() _GLIBCXX_USE_NOEXCEPT
{ }
- bitmap_allocator(const bitmap_allocator&)
+ bitmap_allocator(const bitmap_allocator&) _GLIBCXX_USE_NOEXCEPT
{ }
template<typename _Tp1>
- bitmap_allocator(const bitmap_allocator<_Tp1>&) throw()
+ bitmap_allocator(const bitmap_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT
{ }
- ~bitmap_allocator() throw()
+ ~bitmap_allocator() _GLIBCXX_USE_NOEXCEPT
{ }
pointer
@@ -1042,15 +1042,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
pointer
- address(reference __r) const
+ address(reference __r) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__r); }
const_pointer
- address(const_reference __r) const
+ address(const_reference __r) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__r); }
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_type(-1) / sizeof(value_type); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
diff --git a/libstdc++-v3/include/ext/extptr_allocator.h b/libstdc++-v3/include/ext/extptr_allocator.h
index 0119b50..96aea72 100644
--- a/libstdc++-v3/include/ext/extptr_allocator.h
+++ b/libstdc++-v3/include/ext/extptr_allocator.h
@@ -72,23 +72,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef _ExtPtr_allocator<_Up> other; };
- _ExtPtr_allocator() throw()
+ _ExtPtr_allocator() _GLIBCXX_USE_NOEXCEPT
: _M_real_alloc() { }
- _ExtPtr_allocator(const _ExtPtr_allocator &__rarg) throw()
+ _ExtPtr_allocator(const _ExtPtr_allocator& __rarg) _GLIBCXX_USE_NOEXCEPT
: _M_real_alloc(__rarg._M_real_alloc) { }
template<typename _Up>
- _ExtPtr_allocator(const _ExtPtr_allocator<_Up>& __rarg) throw()
+ _ExtPtr_allocator(const _ExtPtr_allocator<_Up>& __rarg)
+ _GLIBCXX_USE_NOEXCEPT
: _M_real_alloc(__rarg._M_getUnderlyingImp()) { }
- ~_ExtPtr_allocator() throw()
+ ~_ExtPtr_allocator() _GLIBCXX_USE_NOEXCEPT
{ }
- pointer address(reference __x) const
+ pointer address(reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
- const_pointer address(const_reference __x) const
+ const_pointer address(const_reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
pointer allocate(size_type __n, void* __hint = 0)
@@ -97,7 +98,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void deallocate(pointer __p, size_type __n)
{ _M_real_alloc.deallocate(__p.get(), __n); }
- size_type max_size() const throw()
+ size_type max_size() const _GLIBCXX_USE_NOEXCEPT
{ return __numeric_traits<size_type>::__max / sizeof(_Tp); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
diff --git a/libstdc++-v3/include/ext/malloc_allocator.h b/libstdc++-v3/include/ext/malloc_allocator.h
index e1794f7..4900723 100644
--- a/libstdc++-v3/include/ext/malloc_allocator.h
+++ b/libstdc++-v3/include/ext/malloc_allocator.h
@@ -1,6 +1,7 @@
// Allocator that wraps "C" malloc -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+// 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -66,20 +67,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef malloc_allocator<_Tp1> other; };
- malloc_allocator() throw() { }
+ malloc_allocator() _GLIBCXX_USE_NOEXCEPT { }
- malloc_allocator(const malloc_allocator&) throw() { }
+ malloc_allocator(const malloc_allocator&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
- malloc_allocator(const malloc_allocator<_Tp1>&) throw() { }
+ malloc_allocator(const malloc_allocator<_Tp1>&)
+ _GLIBCXX_USE_NOEXCEPT { }
- ~malloc_allocator() throw() { }
+ ~malloc_allocator() _GLIBCXX_USE_NOEXCEPT { }
pointer
- address(reference __x) const { return std::__addressof(__x); }
+ address(reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
const_pointer
- address(const_reference __x) const { return std::__addressof(__x); }
+ address(const_reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
// NB: __n is permitted to be 0. The C++ standard says nothing
// about what the return value is when __n == 0.
@@ -101,7 +105,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ std::free(static_cast<void*>(__p)); }
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_t(-1) / sizeof(_Tp); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h
index 9281494..069476b 100644
--- a/libstdc++-v3/include/ext/mt_allocator.h
+++ b/libstdc++-v3/include/ext/mt_allocator.h
@@ -1,6 +1,6 @@
// MT-optimized allocator -*- C++ -*-
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -577,15 +577,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef _Tp value_type;
pointer
- address(reference __x) const
+ address(reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
const_pointer
- address(const_reference __x) const
+ address(const_reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_t(-1) / sizeof(_Tp); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
@@ -648,14 +648,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef __mt_alloc<_Tp1, pol_type> other;
};
- __mt_alloc() throw() { }
+ __mt_alloc() _GLIBCXX_USE_NOEXCEPT { }
- __mt_alloc(const __mt_alloc&) throw() { }
+ __mt_alloc(const __mt_alloc&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1, typename _Poolp1>
- __mt_alloc(const __mt_alloc<_Tp1, _Poolp1>&) throw() { }
+ __mt_alloc(const __mt_alloc<_Tp1, _Poolp1>&) _GLIBCXX_USE_NOEXCEPT { }
- ~__mt_alloc() throw() { }
+ ~__mt_alloc() _GLIBCXX_USE_NOEXCEPT { }
pointer
allocate(size_type __n, const void* = 0);
diff --git a/libstdc++-v3/include/ext/new_allocator.h b/libstdc++-v3/include/ext/new_allocator.h
index 4dd2ca2..0c82bd0 100644
--- a/libstdc++-v3/include/ext/new_allocator.h
+++ b/libstdc++-v3/include/ext/new_allocator.h
@@ -66,20 +66,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef new_allocator<_Tp1> other; };
- new_allocator() throw() { }
+ new_allocator() _GLIBCXX_USE_NOEXCEPT { }
- new_allocator(const new_allocator&) throw() { }
+ new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
- new_allocator(const new_allocator<_Tp1>&) throw() { }
+ new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
- ~new_allocator() throw() { }
+ ~new_allocator() _GLIBCXX_USE_NOEXCEPT { }
pointer
- address(reference __x) const { return std::__addressof(__x); }
+ address(reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
const_pointer
- address(const_reference __x) const { return std::__addressof(__x); }
+ address(const_reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
// NB: __n is permitted to be 0. The C++ standard says nothing
// about what the return value is when __n == 0.
@@ -98,7 +100,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ ::operator delete(__p); }
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_t(-1) / sizeof(_Tp); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
diff --git a/libstdc++-v3/include/ext/pool_allocator.h b/libstdc++-v3/include/ext/pool_allocator.h
index 9a47b19..03d167c 100644
--- a/libstdc++-v3/include/ext/pool_allocator.h
+++ b/libstdc++-v3/include/ext/pool_allocator.h
@@ -1,6 +1,7 @@
// Allocators -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+// 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -139,23 +140,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef __pool_alloc<_Tp1> other; };
- __pool_alloc() throw() { }
+ __pool_alloc() _GLIBCXX_USE_NOEXCEPT { }
- __pool_alloc(const __pool_alloc&) throw() { }
+ __pool_alloc(const __pool_alloc&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
- __pool_alloc(const __pool_alloc<_Tp1>&) throw() { }
+ __pool_alloc(const __pool_alloc<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
- ~__pool_alloc() throw() { }
+ ~__pool_alloc() _GLIBCXX_USE_NOEXCEPT { }
pointer
- address(reference __x) const { return std::__addressof(__x); }
+ address(reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
const_pointer
- address(const_reference __x) const { return std::__addressof(__x); }
+ address(const_reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_t(-1) / sizeof(_Tp); }
#ifdef __GXX_EXPERIMENTAL_CXX0X__
diff --git a/libstdc++-v3/include/ext/throw_allocator.h b/libstdc++-v3/include/ext/throw_allocator.h
index aa01b25..4988f8a 100644
--- a/libstdc++-v3/include/ext/throw_allocator.h
+++ b/libstdc++-v3/include/ext/throw_allocator.h
@@ -1,6 +1,6 @@
// -*- C++ -*-
-// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -618,14 +618,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
public:
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return _M_allocator.max_size(); }
pointer
- address(reference __x) const { return std::__addressof(__x); }
+ address(reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
const_pointer
- address(const_reference __x) const { return std::__addressof(__x); }
+ address(const_reference __x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(__x); }
pointer
allocate(size_type __n, std::allocator<void>::const_pointer hint = 0)
@@ -699,14 +701,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef throw_allocator_limit<_Tp1> other; };
- throw_allocator_limit() throw() { }
+ throw_allocator_limit() _GLIBCXX_USE_NOEXCEPT { }
- throw_allocator_limit(const throw_allocator_limit&) throw() { }
+ throw_allocator_limit(const throw_allocator_limit&)
+ _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
- throw_allocator_limit(const throw_allocator_limit<_Tp1>&) throw() { }
+ throw_allocator_limit(const throw_allocator_limit<_Tp1>&)
+ _GLIBCXX_USE_NOEXCEPT { }
- ~throw_allocator_limit() throw() { }
+ ~throw_allocator_limit() _GLIBCXX_USE_NOEXCEPT { }
};
/// Allocator throwing via random condition.
@@ -718,14 +722,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct rebind
{ typedef throw_allocator_random<_Tp1> other; };
- throw_allocator_random() throw() { }
+ throw_allocator_random() _GLIBCXX_USE_NOEXCEPT { }
- throw_allocator_random(const throw_allocator_random&) throw() { }
+ throw_allocator_random(const throw_allocator_random&)
+ _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
- throw_allocator_random(const throw_allocator_random<_Tp1>&) throw() { }
+ throw_allocator_random(const throw_allocator_random<_Tp1>&)
+ _GLIBCXX_USE_NOEXCEPT { }
- ~throw_allocator_random() throw() { }
+ ~throw_allocator_random() _GLIBCXX_USE_NOEXCEPT { }
};
_GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/testsuite/util/testsuite_allocator.h b/libstdc++-v3/testsuite/util/testsuite_allocator.h
index e472835..95e8d0d 100644
--- a/libstdc++-v3/testsuite/util/testsuite_allocator.h
+++ b/libstdc++-v3/testsuite/util/testsuite_allocator.h
@@ -1,7 +1,7 @@
// -*- C++ -*-
// Testing allocator for the C++ library testsuite.
//
-// Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -28,11 +28,8 @@
#define _GLIBCXX_TESTSUITE_ALLOCATOR_H
#include <tr1/unordered_map>
-#include <cassert>
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
#include <bits/move.h>
-#endif
+#include <testsuite_hooks.h>
namespace __gnu_test
{
@@ -110,28 +107,28 @@ namespace __gnu_test
template<class U> struct rebind { typedef tracker_allocator<U> other; };
pointer
- address(reference value) const
- { return &value; }
-
+ address(reference value) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(value); }
+
const_pointer
- address(const_reference value) const
- { return &value; }
-
- tracker_allocator() throw()
+ address(const_reference value) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(value); }
+
+ tracker_allocator() _GLIBCXX_USE_NOEXCEPT
{ }
- tracker_allocator(const tracker_allocator&) throw()
+ tracker_allocator(const tracker_allocator&) _GLIBCXX_USE_NOEXCEPT
{ }
template<class U>
- tracker_allocator(const tracker_allocator<U>&) throw()
+ tracker_allocator(const tracker_allocator<U>&) _GLIBCXX_USE_NOEXCEPT
{ }
- ~tracker_allocator() throw()
+ ~tracker_allocator() _GLIBCXX_USE_NOEXCEPT
{ }
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_type(-1) / sizeof(T); }
pointer
@@ -263,24 +260,29 @@ namespace __gnu_test
struct rebind
{ typedef uneq_allocator<Tp1> other; };
- uneq_allocator() throw()
+ uneq_allocator() _GLIBCXX_USE_NOEXCEPT
: personality(0) { }
- uneq_allocator(int person) throw()
+ uneq_allocator(int person) _GLIBCXX_USE_NOEXCEPT
: personality(person) { }
template<typename Tp1>
- uneq_allocator(const uneq_allocator<Tp1>& b) throw()
+ uneq_allocator(const uneq_allocator<Tp1>& b) _GLIBCXX_USE_NOEXCEPT
: personality(b.get_personality()) { }
+ ~uneq_allocator() _GLIBCXX_USE_NOEXCEPT
+ { }
+
int get_personality() const { return personality; }
pointer
- address(reference x) const { return &x; }
+ address(reference x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(x); }
const_pointer
- address(const_reference x) const { return &x; }
-
+ address(const_reference x) const _GLIBCXX_NOEXCEPT
+ { return std::__addressof(x); }
+
pointer
allocate(size_type n, const void* = 0)
{
@@ -300,27 +302,29 @@ namespace __gnu_test
}
return p;
}
-
+
void
deallocate(pointer p, size_type)
{
- assert( p );
-
+ bool test __attribute__((unused)) = true;
+
+ VERIFY( p );
+
map_type::iterator it = get_map().find(reinterpret_cast<void*>(p));
- assert( it != get_map().end() );
+ VERIFY( it != get_map().end() );
// Enforce requirements in Table 32 about deallocation vs
// allocator equality.
- assert( it->second == personality );
-
+ VERIFY( it->second == personality );
+
get_map().erase(it);
::operator delete(p);
}
-
+
size_type
- max_size() const throw()
+ max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_type(-1) / sizeof(Tp); }
-
+
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename U, typename... Args>
void