aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorCasey Carter <Casey@Carter.net>2018-05-09 14:01:22 -0700
committerAnna Gringauze <annagrin@microsoft.com>2018-05-09 14:01:22 -0700
commitd6a2242d97827449f3f1c1c2e54214ceb9e80d62 (patch)
tree43b5275abae7aa9eebd29e564514a70bcb998fa1 /include
parent5cbde3008aa43a9c5f6c219ee15b8388336d4433 (diff)
downloadplatform_external_Microsoft-GSL-d6a2242d97827449f3f1c1c2e54214ceb9e80d62.tar.gz
platform_external_Microsoft-GSL-d6a2242d97827449f3f1c1c2e54214ceb9e80d62.tar.bz2
platform_external_Microsoft-GSL-d6a2242d97827449f3f1c1c2e54214ceb9e80d62.zip
[span] Tell MSVC how to avoid range-checking (#664)
* [span] implement non-member + as a hidden friend Drive-by: remove garbage `operator-(difference_type, span_iterator)`. * [span] Use pointers for range-based-for on MSVC
Diffstat (limited to 'include')
-rw-r--r--include/gsl/span33
1 files changed, 14 insertions, 19 deletions
diff --git a/include/gsl/span b/include/gsl/span
index 6dd1c1f..f5f1332 100644
--- a/include/gsl/span
+++ b/include/gsl/span
@@ -191,6 +191,11 @@ namespace details
return ret += n;
}
+ friend constexpr span_iterator operator+(difference_type n, span_iterator const& rhs)
+ {
+ return rhs + n;
+ }
+
constexpr span_iterator& operator+=(difference_type n)
{
Expects((index_ + n) >= 0 && (index_ + n) <= span_->size());
@@ -258,22 +263,6 @@ namespace details
std::ptrdiff_t index_ = 0;
};
- template <class Span, bool IsConst>
- constexpr span_iterator<Span, IsConst>
- operator+(typename span_iterator<Span, IsConst>::difference_type n,
- span_iterator<Span, IsConst> rhs)
- {
- return rhs + n;
- }
-
- template <class Span, bool IsConst>
- constexpr span_iterator<Span, IsConst>
- operator-(typename span_iterator<Span, IsConst>::difference_type n,
- span_iterator<Span, IsConst> rhs)
- {
- return rhs - n;
- }
-
template <std::ptrdiff_t Ext>
class extent_type
{
@@ -418,7 +407,7 @@ public:
~span() noexcept = default;
constexpr span& operator=(const span& other) noexcept = default;
-
+
// [span.sub], span subviews
template <std::ptrdiff_t Count>
constexpr span<element_type, Count> first() const
@@ -493,10 +482,16 @@ public:
constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator{cend()}; }
constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator{cbegin()}; }
+#ifdef _MSC_VER
+ // Tell MSVC how to unwrap spans in range-based-for
+ constexpr pointer _Unchecked_begin() const noexcept { return data(); }
+ constexpr pointer _Unchecked_end() const noexcept { return data() + size(); }
+#endif // _MSC_VER
+
private:
// Needed to remove unnecessary null check in subspans
- struct KnownNotNull
+ struct KnownNotNull
{
pointer p;
};
@@ -508,7 +503,7 @@ private:
class storage_type : public ExtentType
{
public:
- // KnownNotNull parameter is needed to remove unnecessary null check
+ // KnownNotNull parameter is needed to remove unnecessary null check
// in subspans and constructors from arrays
template <class OtherExtentType>
constexpr storage_type(KnownNotNull data, OtherExtentType ext) : ExtentType(ext), data_(data.p)