aboutsummaryrefslogtreecommitdiffstats
path: root/include/gsl/gsl_util
diff options
context:
space:
mode:
authorCasey Carter <Casey@Carter.net>2017-04-03 22:43:43 -0700
committerNeil MacIntosh <neilmac@microsoft.com>2017-04-03 22:43:43 -0700
commitebab8cab7f552e0fa2265f940e1dab2fdb6551d2 (patch)
tree183356b4ef02ebcfd433e9ea94ba2c1cf2c3d2f9 /include/gsl/gsl_util
parentd65660760b8ce5aef58a4b7c5706273c7f37c501 (diff)
downloadplatform_external_Microsoft-GSL-ebab8cab7f552e0fa2265f940e1dab2fdb6551d2.tar.gz
platform_external_Microsoft-GSL-ebab8cab7f552e0fa2265f940e1dab2fdb6551d2.tar.bz2
platform_external_Microsoft-GSL-ebab8cab7f552e0fa2265f940e1dab2fdb6551d2.zip
gsl::at clean-up: (#479)
* initializer_list overload returns by value to avoid lifetime issues * generic overload uses expression SFINAE to work with any type that has member size() and operator[], which notably includes const/non-const vector and array. * Add test coverage for const objects, rvalue initializer_lists, and constexpr usage. Fixes #357.
Diffstat (limited to 'include/gsl/gsl_util')
-rw-r--r--include/gsl/gsl_util18
1 files changed, 6 insertions, 12 deletions
diff --git a/include/gsl/gsl_util b/include/gsl/gsl_util
index 8961539..24c35e0 100644
--- a/include/gsl/gsl_util
+++ b/include/gsl/gsl_util
@@ -127,31 +127,25 @@ inline T narrow(U u)
}
//
-// at() - Bounds-checked way of accessing static arrays, std::array, std::vector
+// at() - Bounds-checked way of accessing builtin arrays, std::array, std::vector
//
template <class T, std::size_t N>
-inline constexpr T& at(T (&arr)[N], std::ptrdiff_t index)
-{
- Expects(index >= 0 && index < narrow_cast<std::ptrdiff_t>(N));
- return arr[static_cast<std::size_t>(index)];
-}
-
-template <class T, std::size_t N>
-inline constexpr T& at(std::array<T, N>& arr, std::ptrdiff_t index)
+inline constexpr T& at(T (&arr)[N], const std::ptrdiff_t index)
{
Expects(index >= 0 && index < narrow_cast<std::ptrdiff_t>(N));
return arr[static_cast<std::size_t>(index)];
}
template <class Cont>
-inline constexpr typename Cont::value_type& at(Cont& cont, std::ptrdiff_t index)
+inline constexpr auto at(Cont& cont, const std::ptrdiff_t index) -> decltype(cont[cont.size()])
{
Expects(index >= 0 && index < narrow_cast<std::ptrdiff_t>(cont.size()));
- return cont[static_cast<typename Cont::size_type>(index)];
+ using size_type = decltype(cont.size());
+ return cont[static_cast<size_type>(index)];
}
template <class T>
-inline constexpr const T& at(std::initializer_list<T> cont, std::ptrdiff_t index)
+inline constexpr T at(const std::initializer_list<T> cont, const std::ptrdiff_t index)
{
Expects(index >= 0 && index < narrow_cast<std::ptrdiff_t>(cont.size()));
return *(cont.begin() + index);