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 + + 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 * 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 #include #include +#include #include //namespace std::tr1 @@ -46,7 +47,7 @@ namespace tr1 { /// @brief struct array [6.2.2]. /// NB: Requires complete type _Tp. - template + template 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 reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; @@ -76,35 +77,35 @@ namespace tr1 // Iterators. iterator begin() - { return reinterpret_cast(&_M_instance[0]); } + { return &_M_instance[0]; } const_iterator begin() const - { return reinterpret_cast(&_M_instance[0]); } + { return &_M_instance[0]; } iterator end() - { return reinterpret_cast(&_M_instance[_Nm]); } + { return &_M_instance[_Nm]; } const_iterator end() const - { return reinterpret_cast(&_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(_M_instance[__n]); } + { return _M_instance[__n]; } const_reference operator[](size_type __n) const - { return reinterpret_cast(_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(_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(_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 - bool - operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return std::equal(__one.begin(), __one.end(), __two.begin()); } + template + bool + operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return std::equal(__one.begin(), __one.end(), __two.begin()); } - template - bool - operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return !(__one == __two); } + template + bool + operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one == __two); } - template - 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 + 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 - bool - operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return __two < __one; } + template + bool + operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return __two < __one; } - template - bool - operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return !(__one > __two); } + template + bool + operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one > __two); } - template - bool - operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) - { return !(__one < __two); } + template + bool + operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one < __two); } // Specialized algorithms [6.2.2.2]. - template - void - swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two) - { swap_ranges(__one.begin(), __one.end(), __two.begin()); } + template + 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 class tuple_size; + template class tuple_element; + + template + struct tuple_size > + { static const int value = _Nm; }; + + template + struct tuple_element<_Int, array<_Tp, _Nm> > + { typedef _Tp type; }; + + template + _Tp& + get(array<_Tp, _Nm>& __arr) + { return __arr[_Int]; } + + template + 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 +// +// 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 +#include + +void +test01() +{ + bool test __attribute__((unused)) = true; + + const size_t len = 5; + typedef std::tr1::array 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 +// +// 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 +#include + +void +test01() +{ + bool test __attribute__((unused)) = true; + + const size_t len = 5; + typedef std::tr1::array 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 +// +// 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 +#include + +void +test01() +{ + bool test __attribute__((unused)) = true; + + const size_t len = 5; + typedef std::tr1::array 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 +// +// 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 +#include + +void +test01() +{ + bool test __attribute__((unused)) = true; + using namespace std::tr1; + + const size_t len = 5; + typedef array 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 +// +// 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 +#include +#include + +void +test01() +{ + bool test __attribute__((unused)) = true; + using namespace std::tr1; + + { + const size_t len = 3; + typedef array array_type; + VERIFY( (is_same::type, int>::value == true) ); + VERIFY( (is_same::type, int>::value == true) ); + VERIFY( (is_same::type, int>::value == true) ); + } + + { + const size_t len = 0; + typedef array array_type; + VERIFY( (is_same::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 +// +// 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 +#include + +void +test01() +{ + bool test __attribute__((unused)) = true; + using namespace std::tr1; + + { + const size_t len = 5; + typedef array array_type; + VERIFY( tuple_size::value == 5 ); + } + + { + const size_t len = 0; + typedef array array_type; + VERIFY( tuple_size::value == 0 ); + } +} + +int main() +{ + test01(); + return 0; +}