summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-08-26 15:52:53 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-08-26 15:52:53 +0000
commit70260a0cd91bb23aac78315c729c9bc6794f5ebf (patch)
tree2137778c26f216db35fd58a264af6aeb3630b453 /libstdc++-v3
parentef40b58e695a3c5f25b8f4c8d2e4a52f76149d96 (diff)
downloadgcc-70260a0cd91bb23aac78315c729c9bc6794f5ebf.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103525 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog14
-rw-r--r--libstdc++-v3/include/tr1/array145
-rw-r--r--libstdc++-v3/testsuite/tr1/6_containers/array/element_access/back.cc51
-rw-r--r--libstdc++-v3/testsuite/tr1/6_containers/array/element_access/data.cc51
-rw-r--r--libstdc++-v3/testsuite/tr1/6_containers/array/element_access/front.cc51
-rw-r--r--libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/get.cc52
-rw-r--r--libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc52
-rw-r--r--libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc49
8 files changed, 407 insertions, 58 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 83ec79377d3..e512e6f9177 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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,
diff --git a/libstdc++-v3/include/tr1/array b/libstdc++-v3/include/tr1/array
index 4f91687b60f..4b500fc48a2 100644
--- a/libstdc++-v3/include/tr1/array
+++ b/libstdc++-v3/include/tr1/array
@@ -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
index 00000000000..cc08381341e
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/back.cc
@@ -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
index 00000000000..f6866dcc670
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/data.cc
@@ -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
index 00000000000..33c93bef52f
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/array/element_access/front.cc
@@ -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
index 00000000000..b7463b38957
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/get.cc
@@ -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
index 00000000000..6ffa7bb064f
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_element.cc
@@ -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
index 00000000000..3e6974f6aa4
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/6_containers/array/tuple_interface/tuple_size.cc
@@ -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;
+}