This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]