aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2015-07-29 15:41:32 +0300
committerJonathan Wakely <redi@gcc.gnu.org>2015-07-29 13:41:32 +0100
commita460d06d168e1406f780dd3f5a71b23684bf0769 (patch)
tree835179fd52aee02b4f5df9b66a94d7d6c67d8d70
parent1fa9ba224e9c93221cda08900070b7e66b5541ee (diff)
downloadgcc-a460d06d168e1406f780dd3f5a71b23684bf0769.zip
gcc-a460d06d168e1406f780dd3f5a71b23684bf0769.tar.gz
gcc-a460d06d168e1406f780dd3f5a71b23684bf0769.tar.bz2
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
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/include/bits/range_access.h121
2 files changed, 108 insertions, 18 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f0f8c1a..bf774bf 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,10 @@
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
* include/bits/functional_hash.h (__hash_enum): New.
(hash): Derive from __hash_enum.
diff --git a/libstdc++-v3/include/bits/range_access.h b/libstdc++-v3/include/bits/range_access.h
index 510c0b1..2a10598 100644
--- a/libstdc++-v3/include/bits/range_access.h
+++ b/libstdc++-v3/include/bits/range_access.h
@@ -43,7 +43,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
begin(_Container& __cont) -> decltype(__cont.begin())
{ return __cont.begin(); }
@@ -53,7 +53,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
begin(const _Container& __cont) -> decltype(__cont.begin())
{ return __cont.begin(); }
@@ -63,7 +63,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
end(_Container& __cont) -> decltype(__cont.end())
{ return __cont.end(); }
@@ -73,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
end(const _Container& __cont) -> decltype(__cont.end())
{ return __cont.end(); }
@@ -82,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @brief Return an iterator pointing to the first element of the array.
* @param __arr Array.
*/
- template<class _Tp, size_t _Nm>
+ template<typename _Tp, size_t _Nm>
inline _GLIBCXX14_CONSTEXPR _Tp*
begin(_Tp (&__arr)[_Nm])
{ return __arr; }
@@ -92,7 +92,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* of the array.
* @param __arr Array.
*/
- template<class _Tp, size_t _Nm>
+ template<typename _Tp, size_t _Nm>
inline _GLIBCXX14_CONSTEXPR _Tp*
end(_Tp (&__arr)[_Nm])
{ return __arr + _Nm; }
@@ -103,7 +103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline constexpr auto
cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
-> decltype(std::begin(__cont))
@@ -114,7 +114,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline constexpr auto
cend(const _Container& __cont) noexcept(noexcept(std::end(__cont)))
-> decltype(std::end(__cont))
@@ -125,7 +125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
rbegin(_Container& __cont) -> decltype(__cont.rbegin())
{ return __cont.rbegin(); }
@@ -135,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
rbegin(const _Container& __cont) -> decltype(__cont.rbegin())
{ return __cont.rbegin(); }
@@ -145,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
rend(_Container& __cont) -> decltype(__cont.rend())
{ return __cont.rend(); }
@@ -155,7 +155,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
rend(const _Container& __cont) -> decltype(__cont.rend())
{ return __cont.rend(); }
@@ -165,7 +165,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the array.
* @param __arr Array.
*/
- template<class _Tp, size_t _Nm>
+ template<typename _Tp, size_t _Nm>
inline reverse_iterator<_Tp*>
rbegin(_Tp (&__arr)[_Nm])
{ return reverse_iterator<_Tp*>(__arr + _Nm); }
@@ -175,7 +175,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the array.
* @param __arr Array.
*/
- template<class _Tp, size_t _Nm>
+ template<typename _Tp, size_t _Nm>
inline reverse_iterator<_Tp*>
rend(_Tp (&__arr)[_Nm])
{ return reverse_iterator<_Tp*>(__arr); }
@@ -185,7 +185,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the initializer_list.
* @param __il initializer_list.
*/
- template<class _Tp>
+ template<typename _Tp>
inline reverse_iterator<const _Tp*>
rbegin(initializer_list<_Tp> __il)
{ return reverse_iterator<const _Tp*>(__il.end()); }
@@ -195,7 +195,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the initializer_list.
* @param __il initializer_list.
*/
- template<class _Tp>
+ template<typename _Tp>
inline reverse_iterator<const _Tp*>
rend(initializer_list<_Tp> __il)
{ return reverse_iterator<const _Tp*>(__il.begin()); }
@@ -205,7 +205,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont))
{ return std::rbegin(__cont); }
@@ -215,13 +215,98 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the const container.
* @param __cont Container.
*/
- template<class _Container>
+ template<typename _Container>
inline auto
crend(const _Container& __cont) -> decltype(std::rend(__cont))
{ return std::rend(__cont); }
#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
} // namespace