This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[PATCH] Move stl_uninitialized.h extensions to <ext/memory>
- From: Paolo Carlini <pcarlini at unitus dot it>
- To: libstdc++ at gcc dot gnu dot org
- Cc: gdr at codesourcery dot com
- Date: Sat, 29 Dec 2001 19:46:49 +0100
- Subject: [PATCH] Move stl_uninitialized.h extensions to <ext/memory>
Hi,
this one moves some extensions present in stl_uninitialized.h to ext/memory. I
followed the very same approach used for stl_algo.h.
A small surprise came from discovering that the implementation of deque in fact
uses such extensions! (I learned that by grepping, since we are not currently
testing much deque... :-(
Tested on i686-pc-linux-gnu.
Cheers,
Paolo.
P.S. Coming soon the extensions already present in ext (slist, hash_map, etc.)
//////////////
2001-12-29 Paolo Carlini <pcarlini@unitus.it>
* include/bits/stl_uninitialized.h (uninitialized_copy_n +
helpers, __uninitialized_copy_copy, __uninitialized_fill_copy,
__uninitialized_copy_fill): Move to...
* include/ext/memory: ...here, new file.
* include/Makefile.am (ext_headers): Add new file.
* include/Makefile.in: Regenerate.
* testsuite/ext/headers.cc: Include <ext/memory>.
* include/bits/stl_deque.h: Include <ext/memory>.
diff -prN libstdc++-v3-orig/include/Makefile.am libstdc++-v3/include/Makefile.am
*** libstdc++-v3-orig/include/Makefile.am Fri Dec 28 18:43:35 2001
--- libstdc++-v3/include/Makefile.am Sat Dec 29 18:18:25 2001
*************** ext_srcdir = ${glibcpp_srcdir}/include/e
*** 173,178 ****
--- 173,179 ----
ext_builddir = ./ext
ext_headers = \
${ext_srcdir}/algorithm \
+ ${ext_srcdir}/memory \
${ext_srcdir}/rope \
${ext_srcdir}/ropeimpl.h \
${ext_srcdir}/stl_rope.h \
diff -prN libstdc++-v3-orig/include/bits/stl_uninitialized.h
libstdc++-v3/include/bits/stl_uninitialized.h
*** libstdc++-v3-orig/include/bits/stl_uninitialized.h Wed Dec 19 22:57:42 2001
--- libstdc++-v3/include/bits/stl_uninitialized.h Sat Dec 29 18:05:58 2001
*************** namespace std
*** 127,190 ****
return __result + (__last - __first);
}
- // uninitialized_copy_n (not part of the C++ standard)
-
- template<typename _InputIter, typename _Size, typename _ForwardIter>
- pair<_InputIter, _ForwardIter>
- __uninitialized_copy_n(_InputIter __first, _Size __count,
- _ForwardIter __result,
- input_iterator_tag)
- {
- _ForwardIter __cur = __result;
- try {
- for ( ; __count > 0 ; --__count, ++__first, ++__cur)
- _Construct(&*__cur, *__first);
- return pair<_InputIter, _ForwardIter>(__first, __cur);
- }
- catch(...)
- {
- _Destroy(__result, __cur);
- __throw_exception_again;
- }
- }
-
- template<typename _RandomAccessIter, typename _Size, typename _ForwardIter>
- inline pair<_RandomAccessIter, _ForwardIter>
- __uninitialized_copy_n(_RandomAccessIter __first, _Size __count,
- _ForwardIter __result,
- random_access_iterator_tag)
- {
- _RandomAccessIter __last = __first + __count;
- return pair<_RandomAccessIter, _ForwardIter>(
- __last,
- uninitialized_copy(__first, __last, __result));
- }
-
- template<typename _InputIter, typename _Size, typename _ForwardIter>
- inline pair<_InputIter, _ForwardIter>
- __uninitialized_copy_n(_InputIter __first, _Size __count,
- _ForwardIter __result) {
- return __uninitialized_copy_n(__first, __count, __result,
- __iterator_category(__first));
- }
-
- /**
- * @brief Copies the range [first,last) into result.
- * @param first An input iterator.
- * @param last An input iterator.
- * @param result An output iterator.
- * @return result + (first - last)
- *
- * Like copy(), but does not require an initialized output range.
- */
- template<typename _InputIter, typename _Size, typename _ForwardIter>
- inline pair<_InputIter, _ForwardIter>
- uninitialized_copy_n(_InputIter __first, _Size __count,
- _ForwardIter __result) {
- return __uninitialized_copy_n(__first, __count, __result,
- __iterator_category(__first));
- }
-
// Valid if copy construction is equivalent to assignment, and if the
// destructor is trivial.
template<typename _ForwardIter, typename _Tp>
--- 127,132 ----
*************** namespace std
*** 272,342 ****
typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
typedef typename __type_traits<_ValueType>::is_POD_type _Is_POD;
return __uninitialized_fill_n_aux(__first, __n, __x, _Is_POD());
- }
-
- // Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill,
- // __uninitialized_fill_copy.
-
- // __uninitialized_copy_copy
- // Copies [first1, last1) into [result, result + (last1 - first1)), and
- // copies [first2, last2) into
- // [result, result + (last1 - first1) + (last2 - first2)).
-
- template<typename _InputIter1, typename _InputIter2, typename _ForwardIter>
- inline _ForwardIter
- __uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
- _InputIter2 __first2, _InputIter2 __last2,
- _ForwardIter __result)
- {
- _ForwardIter __mid = uninitialized_copy(__first1, __last1, __result);
- try {
- return uninitialized_copy(__first2, __last2, __mid);
- }
- catch(...)
- {
- _Destroy(__result, __mid);
- __throw_exception_again;
- }
- }
-
- // __uninitialized_fill_copy
- // Fills [result, mid) with x, and copies [first, last) into
- // [mid, mid + (last - first)).
- template<typename _ForwardIter, typename _Tp, typename _InputIter>
- inline _ForwardIter
- __uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid,
- const _Tp& __x,
- _InputIter __first, _InputIter __last)
- {
- uninitialized_fill(__result, __mid, __x);
- try {
- return uninitialized_copy(__first, __last, __mid);
- }
- catch(...)
- {
- _Destroy(__result, __mid);
- __throw_exception_again;
- }
- }
-
- // __uninitialized_copy_fill
- // Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
- // fills [first2 + (last1 - first1), last2) with x.
- template<typename _InputIter, typename _ForwardIter, typename _Tp>
- inline void
- __uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
- _ForwardIter __first2, _ForwardIter __last2,
- const _Tp& __x)
- {
- _ForwardIter __mid2 = uninitialized_copy(__first1, __last1, __first2);
- try {
- uninitialized_fill(__mid2, __last2, __x);
- }
- catch(...)
- {
- _Destroy(__first2, __mid2);
- __throw_exception_again;
- }
}
} // namespace std
--- 214,219 ----
diff -prN libstdc++-v3-orig/include/ext/memory libstdc++-v3/include/ext/memory
*** libstdc++-v3-orig/include/ext/memory Thu Jan 1 01:00:00 1970
--- libstdc++-v3/include/ext/memory Sat Dec 29 18:45:15 2001
***************
*** 0 ****
--- 1,194 ----
+ // Memory extensions -*- C++ -*-
+
+ // Copyright (C) 2001 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 2, 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 COPYING. If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+
+ // As a special exception, you may use this file as part of a free software
+ // library without restriction. Specifically, if other files instantiate
+ // templates or use macros or inline functions from this file, or you compile
+ // this file and link it with other files to produce an executable, this
+ // file does not by itself cause the resulting executable to be covered by
+ // the GNU General Public License. This exception does not however
+ // invalidate any other reasons why the executable file might be covered by
+ // the GNU General Public License.
+
+ /*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * 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. Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ *
+ * 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.
+ */
+
+ #ifndef _EXT_MEMORY
+ #define _EXT_MEMORY
+
+ #include <bits/std_memory.h>
+
+ namespace __gnu_cxx
+ {
+ using std::_Destroy;
+ using std::pair;
+ using std::uninitialized_copy;
+ using std::uninitialized_fill;
+ using std::__iterator_category;
+
+ // uninitialized_copy_n (not part of the C++ standard)
+
+ template<typename _InputIter, typename _Size, typename _ForwardIter>
+ pair<_InputIter, _ForwardIter>
+ __uninitialized_copy_n(_InputIter __first, _Size __count,
+ _ForwardIter __result,
+ std::input_iterator_tag)
+ {
+ _ForwardIter __cur = __result;
+ try {
+ for ( ; __count > 0 ; --__count, ++__first, ++__cur)
+ std::_Construct(&*__cur, *__first);
+ return pair<_InputIter, _ForwardIter>(__first, __cur);
+ }
+ catch(...)
+ {
+ _Destroy(__result, __cur);
+ __throw_exception_again;
+ }
+ }
+
+ template<typename _RandomAccessIter, typename _Size, typename _ForwardIter>
+ inline pair<_RandomAccessIter, _ForwardIter>
+ __uninitialized_copy_n(_RandomAccessIter __first, _Size __count,
+ _ForwardIter __result,
+ std::random_access_iterator_tag)
+ {
+ _RandomAccessIter __last = __first + __count;
+ return pair<_RandomAccessIter, _ForwardIter>(
+ __last,
+ uninitialized_copy(__first, __last, __result));
+ }
+
+ template<typename _InputIter, typename _Size, typename _ForwardIter>
+ inline pair<_InputIter, _ForwardIter>
+ __uninitialized_copy_n(_InputIter __first, _Size __count,
+ _ForwardIter __result) {
+ return __uninitialized_copy_n(__first, __count, __result,
+ __iterator_category(__first));
+ }
+
+ /**
+ * @brief Copies the range [first,last) into result.
+ * @param first An input iterator.
+ * @param last An input iterator.
+ * @param result An output iterator.
+ * @return result + (first - last)
+ *
+ * Like copy(), but does not require an initialized output range.
+ */
+ template<typename _InputIter, typename _Size, typename _ForwardIter>
+ inline pair<_InputIter, _ForwardIter>
+ uninitialized_copy_n(_InputIter __first, _Size __count,
+ _ForwardIter __result) {
+ return __uninitialized_copy_n(__first, __count, __result,
+ __iterator_category(__first));
+ }
+
+ // Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill,
+ // __uninitialized_fill_copy.
+
+ // __uninitialized_copy_copy
+ // Copies [first1, last1) into [result, result + (last1 - first1)), and
+ // copies [first2, last2) into
+ // [result, result + (last1 - first1) + (last2 - first2)).
+
+ template<typename _InputIter1, typename _InputIter2, typename _ForwardIter>
+ inline _ForwardIter
+ __uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
+ _InputIter2 __first2, _InputIter2 __last2,
+ _ForwardIter __result)
+ {
+ _ForwardIter __mid = uninitialized_copy(__first1, __last1, __result);
+ try {
+ return uninitialized_copy(__first2, __last2, __mid);
+ }
+ catch(...)
+ {
+ _Destroy(__result, __mid);
+ __throw_exception_again;
+ }
+ }
+
+ // __uninitialized_fill_copy
+ // Fills [result, mid) with x, and copies [first, last) into
+ // [mid, mid + (last - first)).
+ template<typename _ForwardIter, typename _Tp, typename _InputIter>
+ inline _ForwardIter
+ __uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid,
+ const _Tp& __x,
+ _InputIter __first, _InputIter __last)
+ {
+ uninitialized_fill(__result, __mid, __x);
+ try {
+ return uninitialized_copy(__first, __last, __mid);
+ }
+ catch(...)
+ {
+ _Destroy(__result, __mid);
+ __throw_exception_again;
+ }
+ }
+
+ // __uninitialized_copy_fill
+ // Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
+ // fills [first2 + (last1 - first1), last2) with x.
+ template<typename _InputIter, typename _ForwardIter, typename _Tp>
+ inline void
+ __uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
+ _ForwardIter __first2, _ForwardIter __last2,
+ const _Tp& __x)
+ {
+ _ForwardIter __mid2 = uninitialized_copy(__first1, __last1, __first2);
+ try {
+ uninitialized_fill(__mid2, __last2, __x);
+ }
+ catch(...)
+ {
+ _Destroy(__first2, __mid2);
+ __throw_exception_again;
+ }
+ }
+
+ } // namespace __gnu_cxx
+
+ #endif /* _EXT_MEMORY */
diff -prN libstdc++-v3-orig/testsuite/ext/headers.cc
libstdc++-v3/testsuite/ext/headers.cc
*** libstdc++-v3-orig/testsuite/ext/headers.cc Fri Dec 28 18:44:18 2001
--- libstdc++-v3/testsuite/ext/headers.cc Sat Dec 29 18:20:58 2001
***************
*** 24,29 ****
--- 24,30 ----
// subdirectory that are meant to be directly included.
#include <ext/algorithm>
+ #include <ext/memory>
#include <ext/hash_map>
#include <ext/hash_set>
#include <ext/rope>
diff -prN libstdc++-v3-orig/include/bits/stl_deque.h
libstdc++-v3/include/bits/stl_deque.h
*** libstdc++-v3-orig/include/bits/stl_deque.h Thu Dec 6 21:29:31 2001
--- libstdc++-v3/include/bits/stl_deque.h Sat Dec 29 19:38:34 2001
***************
*** 99,106 ****
* template template parameters), and it has been removed.
*/
namespace std
! {
// Note: this function is simply a kludge to work around several compilers'
// bugs in handling constant expressions.
inline size_t
--- 99,114 ----
* template template parameters), and it has been removed.
*/
+ #include <ext/memory> // For __uninitialized_copy_copy,
+ // __uninitialized_copy_fill,
+ // __uninitialized_fill_copy
+
namespace std
! {
! using __gnu_cxx::__uninitialized_copy_copy;
! using __gnu_cxx::__uninitialized_copy_fill;
! using __gnu_cxx::__uninitialized_fill_copy;
!
// Note: this function is simply a kludge to work around several compilers'
// bugs in handling constant expressions.
inline size_t