re PR libstdc++/23081 (Finish the implementation of tr1::array)
authorPaolo Carlini <pcarlini@suse.de>
Fri, 26 Aug 2005 15:52:53 +0000 (15:52 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 26 Aug 2005 15:52:53 +0000 (15:52 +0000)
2005-08-26  Paolo Carlini  <pcarlini@suse.de>

PR libstdc++/23081
* include/tr1/array: Implement members back(), front(), data(),
and the tuple interface; tidy.
* testsuite/tr1/6_containers/array/element_access/back.cc: New.
* testsuite/tr1/6_containers/array/element_access/data.cc: Likewise.
* testsuite/tr1/6_containers/array/element_access/front.cc: Likewise.
* testsuite/tr1/6_containers/array/tuple_interface/get.cc: Likewise.
* testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc:
Likewise.
* testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc:
Likewise.

From-SVN: r103525

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/array
libstdc++-v3/testsuite/tr1/6_containers/array/element_access/back.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/6_containers/array/element_access/data.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/6_containers/array/element_access/front.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/get.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc [new file with mode: 0644]

index 83ec79377d377cffd657529473dbe82cfb6ba0fa..e512e6f9177aa84d652ac702c3cad5c84b962ad7 100644 (file)
@@ -1,3 +1,17 @@
+2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/23081
+       * include/tr1/array: Implement members back(), front(), data(),
+       and the tuple interface; tidy.
+       * testsuite/tr1/6_containers/array/element_access/back.cc: New.
+       * testsuite/tr1/6_containers/array/element_access/data.cc: Likewise.
+       * testsuite/tr1/6_containers/array/element_access/front.cc: Likewise.
+       * testsuite/tr1/6_containers/array/tuple_interface/get.cc: Likewise.
+       * testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc:
+       Likewise.
+       * testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc:
+       Likewise.
+
 2005-08-25  Paolo Carlini  <pcarlini@suse.de>
 
        * include/tr1/hashtable: Use __throw_exception_again,
index 4f91687b60f21cd5c7cdcc06f27e7aea4d70dd2d..4b500fc48a2176eb2214b184da5d2f33e8f273b3 100644 (file)
@@ -1,6 +1,6 @@
 // class template array -*- C++ -*-
 
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 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
@@ -37,6 +37,7 @@
 #include <new>
 #include <iterator>
 #include <algorithm>
+#include <cstddef>
 #include <bits/functexcept.h>
 
 //namespace std::tr1
@@ -46,7 +47,7 @@ namespace tr1
 {
   /// @brief  struct array [6.2.2].
   /// NB: Requires complete type _Tp.
-  template<typename _Tp, size_t _Nm = 1>
+  template<typename _Tp, std::size_t _Nm = 1>
     struct array
     {
       typedef _Tp                              value_type;
@@ -54,8 +55,8 @@ namespace tr1
       typedef const value_type&                const_reference;
       typedef value_type*                      iterator;
       typedef const value_type*                        const_iterator;
-      typedef size_t                           size_type;
-      typedef ptrdiff_t                        difference_type;
+      typedef std::size_t                      size_type;
+      typedef std::ptrdiff_t                           difference_type;
       typedef std::reverse_iterator<iterator>  reverse_iterator;
       typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
 
@@ -76,35 +77,35 @@ namespace tr1
       // Iterators.
       iterator 
       begin()
-      { return reinterpret_cast<iterator>(&_M_instance[0]); }
+      { return &_M_instance[0]; }
 
       const_iterator 
       begin() const 
-      { return reinterpret_cast<const_iterator>(&_M_instance[0]); }
+      { return &_M_instance[0]; }
 
       iterator 
       end() 
-      { return reinterpret_cast<iterator>(&_M_instance[_Nm]); }
+      { return &_M_instance[_Nm]; }
 
       const_iterator 
       end() const
-      { return reinterpret_cast<const_iterator>(&_M_instance[_Nm]); }
+      { return &_M_instance[_Nm]; }
 
       reverse_iterator 
       rbegin()
-      { return reverse_iterator(this->end()); }
+      { return reverse_iterator(end()); }
 
       const_reverse_iterator 
       rbegin() const
-      { return const_reverse_iterator(this->end()); }
+      { return const_reverse_iterator(end()); }
 
       reverse_iterator 
       rend()
-      { return reverse_iterator(this->begin()); }
+      { return reverse_iterator(begin()); }
 
       const_reverse_iterator 
       rend() const
-      { return const_reverse_iterator(this->begin()); }
+      { return const_reverse_iterator(begin()); }
 
       // Capacity.
       size_type 
@@ -119,18 +120,18 @@ namespace tr1
       // Element access.
       reference 
       operator[](size_type __n)
-      { return reinterpret_cast<reference>(_M_instance[__n]); }
+      { return _M_instance[__n]; }
 
       const_reference 
       operator[](size_type __n) const
-      { return reinterpret_cast<const_reference>(_M_instance[__n]); }
+      { return _M_instance[__n]; }
 
       const_reference 
       at(size_type __n) const
       { 
        if (__builtin_expect(__n > _Nm, false))
          std::__throw_out_of_range("array::at");
-       return reinterpret_cast<const_reference>(_M_instance[__n])
+       return _M_instance[__n]
       }
 
       reference 
@@ -138,67 +139,95 @@ namespace tr1
       { 
        if (__builtin_expect(__n > _Nm, false))
          std::__throw_out_of_range("array::at");
-       return reinterpret_cast<reference>(_M_instance[__n])
+       return _M_instance[__n]
       }
 
       reference 
-      front(); 
+      front()
+      { return *begin(); }
 
       const_reference 
-      front() const; 
+      front() const
+      { return *begin(); }
 
       reference 
-      back(); 
+      back()
+      { return *(end() - 1); }
 
       const_reference 
-      back() const; 
+      back() const
+      { return *(end() - 1); }
 
       _Tp* 
-      data(); 
+      data()
+      { return &_M_instance[0]; }
 
       const _Tp* 
-      data() const;
+      data() const
+      { return &_M_instance[0]; }
     };
 
   // Array comparisons.
template<typename _Tp, size_t _Nm>
-   bool 
-   operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
-   { return std::equal(__one.begin(), __one.end(), __two.begin()); }
-
template<typename _Tp, size_t _Nm>
-   bool 
-   operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
-   { return !(__one == __two); }
-
template<typename _Tp, size_t _Nm>
-   bool 
-   operator<(const array<_Tp, _Nm>& a, const array<_Tp, _Nm>& b)
-   { 
-     return std::lexicographical_compare(a.begin(), a.end(), 
-                                        b.begin(), b.end()); 
-   }
-
template<typename _Tp, size_t _Nm>
-   bool 
-   operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
-   { return __two < __one; }
-
template<typename _Tp, size_t _Nm>
-   bool 
-   operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
-   { return !(__one > __two); }
-
template<typename _Tp, size_t _Nm>
-   bool 
-   operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
-   { return !(__one < __two); }
 template<typename _Tp, std::size_t _Nm>
+    bool 
+    operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
+    { return std::equal(__one.begin(), __one.end(), __two.begin()); }
+
 template<typename _Tp, std::size_t _Nm>
+    bool 
+    operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
+    { return !(__one == __two); }
+
 template<typename _Tp, std::size_t _Nm>
+    bool 
+    operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b)
+    
+      return std::lexicographical_compare(__a.begin(), __a.end(),
+                                         __b.begin(), __b.end()); 
+    }
+
 template<typename _Tp, std::size_t _Nm>
+    bool 
+    operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
+    { return __two < __one; }
+
 template<typename _Tp, std::size_t _Nm>
+    bool 
+    operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
+    { return !(__one > __two); }
+
 template<typename _Tp, std::size_t _Nm>
+    bool 
+    operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
+    { return !(__one < __two); }
 
   // Specialized algorithms [6.2.2.2].
- template<typename _Tp, size_t _Nm>
-   void
-   swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)
-   { swap_ranges(__one.begin(), __one.end(), __two.begin()); }
+  template<typename _Tp, std::size_t _Nm>
+    void
+    swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)
+    { swap_ranges(__one.begin(), __one.end(), __two.begin()); }
+
+  // Tuple interface to class template array [6.2.2.5].
+  template<typename _Tp> class tuple_size;
+  template<int _Int, typename _Tp> class tuple_element;
+  
+  template<typename _Tp, std::size_t _Nm>
+    struct tuple_size<array<_Tp, _Nm> >
+    { static const int value = _Nm; };
+  template<int _Int, typename _Tp, std::size_t _Nm>
+    struct tuple_element<_Int, array<_Tp, _Nm> >
+    { typedef _Tp type; };
+
+  template<int _Int, typename _Tp, std::size_t _Nm>
+    _Tp&
+    get(array<_Tp, _Nm>& __arr)
+    { return __arr[_Int]; }
+
+  template<int _Int, typename _Tp, std::size_t _Nm>
+    const _Tp&
+    get(const array<_Tp, _Nm>& __arr)
+    { return __arr[_Int]; }
 } // namespace std::tr1
 }
 
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/back.cc b/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/back.cc
new file mode 100644 (file)
index 0000000..cc08381
--- /dev/null
@@ -0,0 +1,51 @@
+// 2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 6.2.2 Class template array
+
+#include <tr1/array>
+#include <testsuite_hooks.h>
+
+void
+test01() 
+{ 
+  bool test __attribute__((unused)) = true;
+
+  const size_t len = 5;
+  typedef std::tr1::array<int, len> array_type;
+  
+  {
+    array_type a = { 0, 1, 2, 3, 4 };
+    int& ri = a.back();
+    VERIFY( ri == 4 );
+  }
+
+  {
+    const array_type ca = { 4, 3, 2, 1, 0 };
+    const int& cri = ca.back();
+    VERIFY( cri == 0 );
+  }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/data.cc b/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/data.cc
new file mode 100644 (file)
index 0000000..f6866dc
--- /dev/null
@@ -0,0 +1,51 @@
+// 2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 6.2.2 Class template array
+
+#include <tr1/array>
+#include <testsuite_hooks.h>
+
+void
+test01() 
+{ 
+  bool test __attribute__((unused)) = true;
+
+  const size_t len = 5;
+  typedef std::tr1::array<int, len> array_type;
+  
+  {
+    array_type a = { 0, 1, 2, 3, 4 };
+    int* pi = a.data();
+    VERIFY( *pi == 0 );
+  }
+
+  {
+    const array_type ca = { 4, 3, 2, 1, 0 };
+    const int* pci = ca.data();
+    VERIFY( *pci == 4 );
+  }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/front.cc b/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/front.cc
new file mode 100644 (file)
index 0000000..33c93be
--- /dev/null
@@ -0,0 +1,51 @@
+// 2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 6.2.2 Class template array
+
+#include <tr1/array>
+#include <testsuite_hooks.h>
+
+void
+test01() 
+{ 
+  bool test __attribute__((unused)) = true;
+
+  const size_t len = 5;
+  typedef std::tr1::array<int, len> array_type;
+  
+  {
+    array_type a = { 0, 1, 2, 3, 4 };
+    int& ri = a.front();
+    VERIFY( ri == 0 );
+  }
+
+  {
+    const array_type ca = { 4, 3, 2, 1, 0 };
+    const int& cri = ca.front();
+    VERIFY( cri == 4 );
+  }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/get.cc b/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/get.cc
new file mode 100644 (file)
index 0000000..b7463b3
--- /dev/null
@@ -0,0 +1,52 @@
+// 2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 6.2.2 Class template array
+
+#include <tr1/array>
+#include <testsuite_hooks.h>
+
+void
+test01() 
+{ 
+  bool test __attribute__((unused)) = true;
+  using namespace std::tr1;
+
+  const size_t len = 5;
+  typedef array<int, len> array_type;
+
+  {
+    array_type a = { 0, 1, 2, 3, 4 };
+    int& ri = get<0>(a);
+    VERIFY( ri == 0 );
+  }
+
+  {
+    const array_type a = { 4, 3, 2, 1, 0 };
+    const int& cri = get<1>(a);
+    VERIFY( cri == 3 );
+  }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc b/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc
new file mode 100644 (file)
index 0000000..6ffa7bb
--- /dev/null
@@ -0,0 +1,52 @@
+// 2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 6.2.2 Class template array
+
+#include <tr1/array>
+#include <tr1/type_traits>
+#include <testsuite_hooks.h>
+
+void
+test01() 
+{ 
+  bool test __attribute__((unused)) = true;
+  using namespace std::tr1;
+
+  {
+    const size_t len = 3;
+    typedef array<int, len> array_type;
+    VERIFY( (is_same<tuple_element<0, array_type>::type, int>::value == true) );
+    VERIFY( (is_same<tuple_element<1, array_type>::type, int>::value == true) );
+    VERIFY( (is_same<tuple_element<2, array_type>::type, int>::value == true) );
+  }
+
+  {
+    const size_t len = 0;
+    typedef array<int, len> array_type;
+    VERIFY( (is_same<tuple_element<0, array_type>::type, int>::value == true) );
+  }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc b/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc
new file mode 100644 (file)
index 0000000..3e6974f
--- /dev/null
@@ -0,0 +1,49 @@
+// 2005-08-26  Paolo Carlini  <pcarlini@suse.de>
+//
+// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 6.2.2 Class template array
+
+#include <tr1/array>
+#include <testsuite_hooks.h>
+
+void
+test01() 
+{ 
+  bool test __attribute__((unused)) = true;
+  using namespace std::tr1;
+
+  {
+    const size_t len = 5;
+    typedef array<int, len> array_type;
+    VERIFY( tuple_size<array_type>::value == 5 );
+  }
+
+  {
+    const size_t len = 0;
+    typedef array<float, len> array_type;
+    VERIFY( tuple_size<array_type>::value == 0 );
+  }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}