Hey y'all. I noticed the repeated, repeated, repeated use of std::allocator forward decls as I was trying to debug some doxygen output.
Clearly, it's past time for a memory forward header, like bits/stringfwd.h. The following patch implements this. Perhaps some of the other headers can now be optimized because of this, but that was not my primary focus. Instead, I was just trying to come up with the smallest patch that was semantically equivalent to existing trunk. tested x86/linux -benjamin
2013-03-08 Benjamin Kosnik <b...@redhat.com> * include/bits/memoryfwd.h: New. Centralize forward declarations. * include/bits/algorithmfwd.h: Consistent comments. * include/bits/localefwd.h: Same. * include/ext/vstring_fwd.h: Same. * include/parallel/algorithmfwd.h: Same. * include/parallel/numericfwd.h: Same. * include/std/iosfwd: Same. * include/bits/alloc_traits.h: Include memoryfwd.h, remove allocator forward decl. * include/ext/alloc_traits.h: Remove allocator forward decl. * include/bits/stl_construct.h: Same. * include/bits/stringfwd.h: Include memoryfwd.h, remove allocator forward decl. Consistent comments. * doc/doxygen/user.cfg.in (TEMPLATE_RELATIONS): To NO. * include/Makefile.am (bits_headers): Add memoryfwd.h. * include/Makefile.in: Regenerate. * configure: Same. * include/bits/vector.tcc (vector<>operator=(const vector<>&): diff --git a/libstdc++-v3/doc/doxygen/user.cfg.in b/libstdc++-v3/doc/doxygen/user.cfg.in index 4a3afc4..45efb63 100644 --- a/libstdc++-v3/doc/doxygen/user.cfg.in +++ b/libstdc++-v3/doc/doxygen/user.cfg.in @@ -1957,7 +1957,7 @@ UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. -TEMPLATE_RELATIONS = YES +TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 5342217..6bd3b43 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -113,6 +113,7 @@ bits_headers = \ ${bits_srcdir}/locale_facets_nonio.tcc \ ${bits_srcdir}/localefwd.h \ ${bits_srcdir}/mask_array.h \ + ${bits_srcdir}/memoryfwd.h \ ${bits_srcdir}/move.h \ ${bits_srcdir}/ostream.tcc \ ${bits_srcdir}/ostream_insert.h \ diff --git a/libstdc++-v3/include/bits/algorithmfwd.h b/libstdc++-v3/include/bits/algorithmfwd.h index 7b8448c..e6321b2 100644 --- a/libstdc++-v3/include/bits/algorithmfwd.h +++ b/libstdc++-v3/include/bits/algorithmfwd.h @@ -1,4 +1,4 @@ -// <algorithm> declarations -*- C++ -*- +// <algorithm> Forward declarations -*- C++ -*- // Copyright (C) 2007-2013 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/include/bits/alloc_traits.h b/libstdc++-v3/include/bits/alloc_traits.h index 26c64f2..33ea145 100644 --- a/libstdc++-v3/include/bits/alloc_traits.h +++ b/libstdc++-v3/include/bits/alloc_traits.h @@ -32,6 +32,7 @@ #if __cplusplus >= 201103L +#include <bits/memoryfwd.h> #include <bits/ptr_traits.h> #include <ext/numeric_traits.h> @@ -39,9 +40,6 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION - template<typename _Tp> - class allocator; - template<typename _Alloc, typename _Tp> class __alloctr_rebind_helper { diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 97477fb..28df242 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -43,8 +43,8 @@ #ifndef _ALLOCATOR_H #define _ALLOCATOR_H 1 -// Define the base class to std::allocator. -#include <bits/c++allocator.h> +#include <bits/c++allocator.h> // Define the base class to std::allocator. +#include <bits/memoryfwd.h> #if __cplusplus >= 201103L #include <type_traits> #endif @@ -54,17 +54,10 @@ namespace std _GLIBCXX_VISIBILITY(default) _GLIBCXX_BEGIN_NAMESPACE_VERSION /** - * @defgroup allocators Allocators - * @ingroup memory - * - * Classes encapsulating memory operations. - * - * @{ + * @addtogroup allocators + * @{ */ - template<typename _Tp> - class allocator; - /// allocator<void> specialization. template<> class allocator<void> @@ -150,13 +143,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator!=(const allocator<_Tp>&, const allocator<_Tp>&) { return false; } - /// Declare uses_allocator so it can be specialized in \<queue\> etc. - template<typename, typename> - struct uses_allocator; - - /** - * @} - */ + /// @} group allocator // Inhibit implicit instantiations for required instantiations, // which are defined via explicit instantiations elsewhere. diff --git a/libstdc++-v3/include/bits/localefwd.h b/libstdc++-v3/include/bits/localefwd.h index e0a233b..ca06dc1 100644 --- a/libstdc++-v3/include/bits/localefwd.h +++ b/libstdc++-v3/include/bits/localefwd.h @@ -1,4 +1,4 @@ -// Locale support -*- C++ -*- +// <locale> Forward declarations -*- C++ -*- // Copyright (C) 1997-2013 Free Software Foundation, Inc. // @@ -185,6 +185,6 @@ _GLIBCXX_END_NAMESPACE_LDBL class messages_byname; _GLIBCXX_END_NAMESPACE_VERSION -} // namespace +} // namespace std #endif diff --git a/libstdc++-v3/include/bits/memoryfwd.h b/libstdc++-v3/include/bits/memoryfwd.h new file mode 100644 index 0000000..7c85970 --- /dev/null +++ b/libstdc++-v3/include/bits/memoryfwd.h @@ -0,0 +1,78 @@ +// <memory> Forward declarations -*- C++ -*- + +// Copyright (C) 2001-2013 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. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// <http://www.gnu.org/licenses/>. + +/* + * Copyright (c) 1996-1997 + * Silicon Graphics Computer Systems, Inc. + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Silicon Graphics makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + */ + +/** @file bits/memoryfwd.h + * This is an internal header file, included by other library headers. + * Do not attempt to use it directly. @headername{memory} + */ + +#ifndef _MEMORYFWD_H +#define _MEMORYFWD_H 1 + +#pragma GCC system_header + +#include <bits/c++config.h> + +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + /** + * @defgroup allocators Allocators + * @ingroup memory + * + * Classes encapsulating memory operations. + * + * @{ + */ + + template<typename> + class allocator; + + template<> + class allocator<void>; + + /// Declare uses_allocator so it can be specialized in \<queue\> etc. + template<typename, typename> + struct uses_allocator; + + /// @} group memory + +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace std + +#endif diff --git a/libstdc++-v3/include/bits/stl_construct.h b/libstdc++-v3/include/bits/stl_construct.h index 5dd5626..c1863e64 100644 --- a/libstdc++-v3/include/bits/stl_construct.h +++ b/libstdc++-v3/include/bits/stl_construct.h @@ -133,8 +133,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * destroy() even if _Tp has a trivial destructor. */ - template <typename _Tp> class allocator; - template<typename _ForwardIterator, typename _Allocator> void _Destroy(_ForwardIterator __first, _ForwardIterator __last, @@ -154,7 +152,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } _GLIBCXX_END_NAMESPACE_VERSION -} // namespace +} // namespace std #endif /* _STL_CONSTRUCT_H */ diff --git a/libstdc++-v3/include/bits/stringfwd.h b/libstdc++-v3/include/bits/stringfwd.h index 5d5b83f..9601116 100644 --- a/libstdc++-v3/include/bits/stringfwd.h +++ b/libstdc++-v3/include/bits/stringfwd.h @@ -1,4 +1,4 @@ -// String support -*- C++ -*- +// <string> Forward declarations -*- C++ -*- // Copyright (C) 2001-2013 Free Software Foundation, Inc. // @@ -37,14 +37,12 @@ #pragma GCC system_header #include <bits/c++config.h> +#include <bits/memoryfwd.h> namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION - template<typename _Alloc> - class allocator; - /** * @defgroup strings Strings * diff --git a/libstdc++-v3/include/ext/alloc_traits.h b/libstdc++-v3/include/ext/alloc_traits.h index 706bfd3..333473a 100644 --- a/libstdc++-v3/include/ext/alloc_traits.h +++ b/libstdc++-v3/include/ext/alloc_traits.h @@ -38,13 +38,6 @@ # include <bits/allocator.h> // for __alloc_swap #endif -namespace std _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - template<typename> struct allocator; -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -244,6 +237,6 @@ template<typename _Alloc> }; _GLIBCXX_END_NAMESPACE_VERSION -} // namespace +} // namespace std #endif diff --git a/libstdc++-v3/include/ext/vstring_fwd.h b/libstdc++-v3/include/ext/vstring_fwd.h index 61bc2fe..b917e93 100644 --- a/libstdc++-v3/include/ext/vstring_fwd.h +++ b/libstdc++-v3/include/ext/vstring_fwd.h @@ -1,4 +1,4 @@ -// Versatile string forward -*- C++ -*- +// <vstring.h> Forward declarations -*- C++ -*- // Copyright (C) 2005-2013 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/include/parallel/algorithmfwd.h b/libstdc++-v3/include/parallel/algorithmfwd.h index 9706185..01a8a5a 100644 --- a/libstdc++-v3/include/parallel/algorithmfwd.h +++ b/libstdc++-v3/include/parallel/algorithmfwd.h @@ -1,4 +1,4 @@ -// <algorithm> parallel extensions -*- C++ -*- +// <parallel/algorithm> Forward declarations -*- C++ -*- // Copyright (C) 2007-2013 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/include/parallel/numericfwd.h b/libstdc++-v3/include/parallel/numericfwd.h index 1314169..6b3d2f1 100644 --- a/libstdc++-v3/include/parallel/numericfwd.h +++ b/libstdc++-v3/include/parallel/numericfwd.h @@ -1,4 +1,4 @@ -// <numeric> parallel extensions -*- C++ -*- +// <parallel/numeric> Forward declarations -*- C++ -*- // Copyright (C) 2007-2013 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/include/std/iosfwd b/libstdc++-v3/include/std/iosfwd index 156ed92..c5fe26d 100644 --- a/libstdc++-v3/include/std/iosfwd +++ b/libstdc++-v3/include/std/iosfwd @@ -1,4 +1,4 @@ -// Forwarding declarations -*- C++ -*- +// <iosfwd> Forward declarations -*- C++ -*- // Copyright (C) 1997-2013 Free Software Foundation, Inc. //