diff options
author | Casey Carter <Casey@Carter.net> | 2018-05-09 14:01:22 -0700 |
---|---|---|
committer | Anna Gringauze <annagrin@microsoft.com> | 2018-05-09 14:01:22 -0700 |
commit | d6a2242d97827449f3f1c1c2e54214ceb9e80d62 (patch) | |
tree | 43b5275abae7aa9eebd29e564514a70bcb998fa1 /include | |
parent | 5cbde3008aa43a9c5f6c219ee15b8388336d4433 (diff) | |
download | platform_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/span | 33 |
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) |