Commit a460d06d by Ville Voutilainen Committed by Jonathan Wakely

range_access.h: Change class to typename in every template.

2015-07-29  Ville Voutilainen  <ville.voutilainen@gmail.com>

	* include/bits/range_access.h: Change class to typename in every
	template.
	(size, empty, data): New functions from N4280.
	* testsuite/24_iterators/container_access.cc: New.

From-SVN: r226348
parent 1fa9ba22
2015-07-29 Ville Voutilainen <ville.voutilainen@gmail.com> 2015-07-29 Ville Voutilainen <ville.voutilainen@gmail.com>
* include/bits/range_access.h: Change class to typename in every
template.
(size, empty, data): New functions from N4280.
* testsuite/24_iterators/container_access.cc: New.
PR libstdc++/60970 PR libstdc++/60970
* include/bits/functional_hash.h (__hash_enum): New. * include/bits/functional_hash.h (__hash_enum): New.
(hash): Derive from __hash_enum. (hash): Derive from __hash_enum.
......
...@@ -43,7 +43,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -43,7 +43,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container. * the container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
begin(_Container& __cont) -> decltype(__cont.begin()) begin(_Container& __cont) -> decltype(__cont.begin())
{ return __cont.begin(); } { return __cont.begin(); }
...@@ -53,7 +53,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -53,7 +53,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
begin(const _Container& __cont) -> decltype(__cont.begin()) begin(const _Container& __cont) -> decltype(__cont.begin())
{ return __cont.begin(); } { return __cont.begin(); }
...@@ -63,7 +63,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -63,7 +63,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container. * the container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
end(_Container& __cont) -> decltype(__cont.end()) end(_Container& __cont) -> decltype(__cont.end())
{ return __cont.end(); } { return __cont.end(); }
...@@ -73,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -73,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
end(const _Container& __cont) -> decltype(__cont.end()) end(const _Container& __cont) -> decltype(__cont.end())
{ return __cont.end(); } { return __cont.end(); }
...@@ -82,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -82,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @brief Return an iterator pointing to the first element of the array. * @brief Return an iterator pointing to the first element of the array.
* @param __arr Array. * @param __arr Array.
*/ */
template<class _Tp, size_t _Nm> template<typename _Tp, size_t _Nm>
inline _GLIBCXX14_CONSTEXPR _Tp* inline _GLIBCXX14_CONSTEXPR _Tp*
begin(_Tp (&__arr)[_Nm]) begin(_Tp (&__arr)[_Nm])
{ return __arr; } { return __arr; }
...@@ -92,7 +92,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -92,7 +92,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* of the array. * of the array.
* @param __arr Array. * @param __arr Array.
*/ */
template<class _Tp, size_t _Nm> template<typename _Tp, size_t _Nm>
inline _GLIBCXX14_CONSTEXPR _Tp* inline _GLIBCXX14_CONSTEXPR _Tp*
end(_Tp (&__arr)[_Nm]) end(_Tp (&__arr)[_Nm])
{ return __arr + _Nm; } { return __arr + _Nm; }
...@@ -103,7 +103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -103,7 +103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline constexpr auto inline constexpr auto
cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont))) cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
-> decltype(std::begin(__cont)) -> decltype(std::begin(__cont))
...@@ -114,7 +114,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -114,7 +114,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline constexpr auto inline constexpr auto
cend(const _Container& __cont) noexcept(noexcept(std::end(__cont))) cend(const _Container& __cont) noexcept(noexcept(std::end(__cont)))
-> decltype(std::end(__cont)) -> decltype(std::end(__cont))
...@@ -125,7 +125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -125,7 +125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container. * the container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
rbegin(_Container& __cont) -> decltype(__cont.rbegin()) rbegin(_Container& __cont) -> decltype(__cont.rbegin())
{ return __cont.rbegin(); } { return __cont.rbegin(); }
...@@ -135,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -135,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
rbegin(const _Container& __cont) -> decltype(__cont.rbegin()) rbegin(const _Container& __cont) -> decltype(__cont.rbegin())
{ return __cont.rbegin(); } { return __cont.rbegin(); }
...@@ -145,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -145,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container. * the container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
rend(_Container& __cont) -> decltype(__cont.rend()) rend(_Container& __cont) -> decltype(__cont.rend())
{ return __cont.rend(); } { return __cont.rend(); }
...@@ -155,7 +155,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -155,7 +155,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
rend(const _Container& __cont) -> decltype(__cont.rend()) rend(const _Container& __cont) -> decltype(__cont.rend())
{ return __cont.rend(); } { return __cont.rend(); }
...@@ -165,7 +165,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -165,7 +165,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the array. * the array.
* @param __arr Array. * @param __arr Array.
*/ */
template<class _Tp, size_t _Nm> template<typename _Tp, size_t _Nm>
inline reverse_iterator<_Tp*> inline reverse_iterator<_Tp*>
rbegin(_Tp (&__arr)[_Nm]) rbegin(_Tp (&__arr)[_Nm])
{ return reverse_iterator<_Tp*>(__arr + _Nm); } { return reverse_iterator<_Tp*>(__arr + _Nm); }
...@@ -175,7 +175,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -175,7 +175,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the array. * the array.
* @param __arr Array. * @param __arr Array.
*/ */
template<class _Tp, size_t _Nm> template<typename _Tp, size_t _Nm>
inline reverse_iterator<_Tp*> inline reverse_iterator<_Tp*>
rend(_Tp (&__arr)[_Nm]) rend(_Tp (&__arr)[_Nm])
{ return reverse_iterator<_Tp*>(__arr); } { return reverse_iterator<_Tp*>(__arr); }
...@@ -185,7 +185,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -185,7 +185,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the initializer_list. * the initializer_list.
* @param __il initializer_list. * @param __il initializer_list.
*/ */
template<class _Tp> template<typename _Tp>
inline reverse_iterator<const _Tp*> inline reverse_iterator<const _Tp*>
rbegin(initializer_list<_Tp> __il) rbegin(initializer_list<_Tp> __il)
{ return reverse_iterator<const _Tp*>(__il.end()); } { return reverse_iterator<const _Tp*>(__il.end()); }
...@@ -195,7 +195,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -195,7 +195,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the initializer_list. * the initializer_list.
* @param __il initializer_list. * @param __il initializer_list.
*/ */
template<class _Tp> template<typename _Tp>
inline reverse_iterator<const _Tp*> inline reverse_iterator<const _Tp*>
rend(initializer_list<_Tp> __il) rend(initializer_list<_Tp> __il)
{ return reverse_iterator<const _Tp*>(__il.begin()); } { return reverse_iterator<const _Tp*>(__il.begin()); }
...@@ -205,7 +205,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -205,7 +205,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont)) crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont))
{ return std::rbegin(__cont); } { return std::rbegin(__cont); }
...@@ -215,13 +215,98 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -215,13 +215,98 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container. * the const container.
* @param __cont Container. * @param __cont Container.
*/ */
template<class _Container> template<typename _Container>
inline auto inline auto
crend(const _Container& __cont) -> decltype(std::rend(__cont)) crend(const _Container& __cont) -> decltype(std::rend(__cont))
{ return std::rend(__cont); } { return std::rend(__cont); }
#endif // C++14 #endif // C++14
#if __cplusplus > 201402L
/**
* @brief Return the size of a container.
* @param __cont Container.
*/
template <typename _Container>
constexpr auto
size(const _Container& __cont) -> decltype(__cont.size())
{ return __cont.size(); }
/**
* @brief Return the size of an array.
* @param __array Array.
*/
template <typename _Tp, size_t _N>
constexpr size_t
size(const _Tp (&/*__array*/)[_N]) noexcept
{ return _N; }
/**
* @brief Return whether a container is empty.
* @param __cont Container.
*/
template <typename _Container>
constexpr auto
empty(const _Container& __cont) -> decltype(__cont.empty())
{ return __cont.empty(); }
/**
* @brief Return whether an array is empty (always false).
* @param __array Container.
*/
template <typename _Tp, size_t _N>
constexpr bool
empty(const _Tp (&/*__array*/)[_N]) noexcept
{ return false; }
/**
* @brief Return whether an initializer_list is empty.
* @param __il Initializer list.
*/
template <typename _Tp>
constexpr bool
empty(initializer_list<_Tp> __il) noexcept
{ return __il.size() == 0;}
/**
* @brief Return the data pointer of a container.
* @param __cont Container.
*/
template <typename _Container>
constexpr auto
data(_Container& __cont) -> decltype(__cont.data())
{ return __cont.data(); }
/**
* @brief Return the data pointer of a const container.
* @param __cont Container.
*/
template <typename _Container>
constexpr auto
data(const _Container& __cont) -> decltype(__cont.data())
{ return __cont.data(); }
/**
* @brief Return the data pointer of an array.
* @param __array Array.
*/
template <typename _Tp, size_t _N>
constexpr _Tp*
data(_Tp (&__array)[_N]) noexcept
{ return __array; }
/**
* @brief Return the data pointer of an initializer list.
* @param __il Initializer list.
*/
template <typename _Tp>
constexpr const _Tp*
data(initializer_list<_Tp> __il) noexcept
{ return __il.begin(); }
#endif // C++17
_GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION
} // namespace } // namespace
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment