On 10 June 2011 22:06, Jonathan Wakely wrote: > > * overload construct and destroy so both the old- and new-style > signatures are present. > > template<typename... _Args> > void > construct(pointer __p, _Args&&... __args) > { construct(__p.get(), std::forward<_Args>(__args)...); } > > void destroy(pointer __p) > { destroy(__p.get()); }
Here's a patch implementing this option along with some tests to use the ExtPtr_allocator in C++0x mode Those tests fail without the patch so I'm committing this so that ExtPtr_allocator isn't completely broken in C++0x mode. 2011-06-11 Jonathan Wakely <jwakely....@gmail.com> * include/ext/extptr_allocator.h (construct, destroy): Fix for C++0x mode by overloading to take allocator's pointer type. * testsuite/23_containers/vector/ext_pointer/types/2.cc: New. * testsuite/23_containers/vector/ext_pointer/explicit_instantiation/ 2.cc: New. Tested x86_64-linux, committed to trunk.
Index: include/ext/extptr_allocator.h =================================================================== --- include/ext/extptr_allocator.h (revision 174931) +++ include/ext/extptr_allocator.h (working copy) @@ -107,10 +107,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION construct(_Up* __p, _Args&&... __args) { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } + template<typename... _Args> + void + construct(pointer __p, _Args&&... __args) + { construct(__p.get(), std::forward<_Args>(__args)...); } + template<typename _Up> void destroy(_Up* __p) { __p->~_Up(); } + + void destroy(pointer __p) + { destroy(__p.get()); } + #else void construct(pointer __p, const _Tp& __val) Index: testsuite/23_containers/vector/ext_pointer/types/2.cc =================================================================== --- testsuite/23_containers/vector/ext_pointer/types/2.cc (revision 0) +++ testsuite/23_containers/vector/ext_pointer/types/2.cc (revision 0) @@ -0,0 +1,63 @@ +// Test for Container using non-standard pointer types. + +// Copyright (C) 2011 +// 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 +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + + +// { dg-options "-std=gnu++0x" } + +// This is a copy of vector/types/1.cc with altered allocator. +// The operator+()s in this test initially failed the test - +// they stress the accurate recognition, by the compiler, +// of _Pointer_adapter's own pointer arithmetic functions, +// which have to match perfectly on the int type to get +// chosen by the compiler when it sees: _Pointer_adapter<T> + int, etc. + +#include <vector> +#include <ext/extptr_allocator.h> + +namespace N +{ + struct X { }; + + template<typename T> + X operator+(T, std::size_t) + { return X(); } + + template<typename T> + X operator-(T, T) + { return X(); } +} + +int main() +{ + std::vector<N::X, __gnu_cxx::_ExtPtr_allocator<N::X> > v(5); + const std::vector<N::X, __gnu_cxx::_ExtPtr_allocator<N::X> > w(1); + + v[0]; + w[0]; + v.size(); + v.capacity(); + v.resize(1); + v.insert(v.begin(), N::X()); + v.insert(v.begin(), 1, N::X()); + v.insert(v.begin(), w.begin(), w.end()); + v = w; + + return 0; +} Index: testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc =================================================================== --- testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc (revision 0) +++ testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc (revision 0) @@ -0,0 +1,28 @@ +// Test for Container using non-standard pointer types. + +// Copyright (C) 2011 +// 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 +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + + +#include <vector> +#include <ext/extptr_allocator.h> + +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template class std::vector<int, __gnu_cxx::_ExtPtr_allocator<int> >;