Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/gsl/span_ext is written in an unsupported language. File is not indexed.

0001 ///////////////////////////////////////////////////////////////////////////////
0002 //
0003 // Copyright (c) 2015 Microsoft Corporation. All rights reserved.
0004 //
0005 // This code is licensed under the MIT License (MIT).
0006 //
0007 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0008 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0009 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0010 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0011 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0012 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
0013 // THE SOFTWARE.
0014 //
0015 ///////////////////////////////////////////////////////////////////////////////
0016 
0017 #ifndef GSL_SPAN_EXT_H
0018 #define GSL_SPAN_EXT_H
0019 
0020 ///////////////////////////////////////////////////////////////////////////////
0021 //
0022 // File: span_ext
0023 // Purpose: continue offering features that have been cut from the official
0024 //   implementation of span.
0025 //   While modernizing gsl::span a number of features needed to be removed to
0026 //   be compliant with the design of std::span
0027 //
0028 ///////////////////////////////////////////////////////////////////////////////
0029 
0030 #include "./assert" // GSL_KERNEL_MODE
0031 #include "./util"   // for narrow_cast, narrow
0032 
0033 #include <cstddef> // for ptrdiff_t, size_t
0034 #include <utility>
0035 
0036 #ifndef GSL_KERNEL_MODE
0037 #include <algorithm> // for lexicographical_compare
0038 #endif               // GSL_KERNEL_MODE
0039 
0040 namespace gsl
0041 {
0042 
0043 // [span.views.constants], constants
0044 GSL_INLINE constexpr const std::size_t dynamic_extent = narrow_cast<std::size_t>(-1);
0045 
0046 template <class ElementType, std::size_t Extent = dynamic_extent>
0047 class span;
0048 
0049 // std::equal and std::lexicographical_compare are not /kernel compatible
0050 // so all comparison operators must be removed for kernel mode.
0051 #ifndef GSL_KERNEL_MODE
0052 
0053 // [span.comparison], span comparison operators
0054 template <class ElementType, std::size_t FirstExtent, std::size_t SecondExtent>
0055 constexpr bool operator==(span<ElementType, FirstExtent> l, span<ElementType, SecondExtent> r)
0056 {
0057     return std::equal(l.begin(), l.end(), r.begin(), r.end());
0058 }
0059 
0060 template <class ElementType, std::size_t Extent>
0061 constexpr bool operator!=(span<ElementType, Extent> l, span<ElementType, Extent> r)
0062 {
0063     return !(l == r);
0064 }
0065 
0066 template <class ElementType, std::size_t Extent>
0067 constexpr bool operator<(span<ElementType, Extent> l, span<ElementType, Extent> r)
0068 {
0069     return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end());
0070 }
0071 
0072 template <class ElementType, std::size_t Extent>
0073 constexpr bool operator<=(span<ElementType, Extent> l, span<ElementType, Extent> r)
0074 {
0075     return !(l > r);
0076 }
0077 
0078 template <class ElementType, std::size_t Extent>
0079 constexpr bool operator>(span<ElementType, Extent> l, span<ElementType, Extent> r)
0080 {
0081     return r < l;
0082 }
0083 
0084 template <class ElementType, std::size_t Extent>
0085 constexpr bool operator>=(span<ElementType, Extent> l, span<ElementType, Extent> r)
0086 {
0087     return !(l < r);
0088 }
0089 
0090 #endif // GSL_KERNEL_MODE
0091 
0092 //
0093 // make_span() - Utility functions for creating spans
0094 //
0095 template <class ElementType>
0096 constexpr span<ElementType> make_span(ElementType* ptr, typename span<ElementType>::size_type count)
0097 {
0098     return span<ElementType>(ptr, count);
0099 }
0100 
0101 template <class ElementType>
0102 constexpr span<ElementType> make_span(ElementType* firstElem, ElementType* lastElem)
0103 {
0104     return span<ElementType>(firstElem, lastElem);
0105 }
0106 
0107 template <class ElementType, std::size_t N>
0108 constexpr span<ElementType, N> make_span(ElementType (&arr)[N]) noexcept
0109 {
0110     return span<ElementType, N>(arr);
0111 }
0112 
0113 template <class Container>
0114 constexpr span<typename Container::value_type> make_span(Container& cont)
0115 {
0116     return span<typename Container::value_type>(cont);
0117 }
0118 
0119 template <class Container>
0120 constexpr span<const typename Container::value_type> make_span(const Container& cont)
0121 {
0122     return span<const typename Container::value_type>(cont);
0123 }
0124 
0125 template <class Ptr>
0126 GSL_DEPRECATED("This function is deprecated. See GSL issue #1092.")
0127 constexpr span<typename Ptr::element_type> make_span(Ptr& cont, std::size_t count)
0128 {
0129     return span<typename Ptr::element_type>(cont, count);
0130 }
0131 
0132 template <class Ptr>
0133 GSL_DEPRECATED("This function is deprecated. See GSL issue #1092.")
0134 constexpr span<typename Ptr::element_type> make_span(Ptr& cont)
0135 {
0136     return span<typename Ptr::element_type>(cont);
0137 }
0138 
0139 // Specialization of gsl::at for span
0140 template <class ElementType, std::size_t Extent>
0141 constexpr ElementType& at(span<ElementType, Extent> s, index i)
0142 {
0143     // No bounds checking here because it is done in span::operator[] called below
0144     Ensures(i >= 0);
0145     return s[narrow_cast<std::size_t>(i)];
0146 }
0147 
0148 // [span.obs] Free observer functions
0149 template <class ElementType, std::size_t Extent>
0150 constexpr std::ptrdiff_t ssize(const span<ElementType, Extent>& s) noexcept
0151 {
0152     return static_cast<std::ptrdiff_t>(s.size());
0153 }
0154 
0155 // [span.iter] Free functions for begin/end functions
0156 template <class ElementType, std::size_t Extent>
0157 constexpr typename span<ElementType, Extent>::iterator
0158 begin(const span<ElementType, Extent>& s) noexcept
0159 {
0160     return s.begin();
0161 }
0162 
0163 template <class ElementType, std::size_t Extent = dynamic_extent>
0164 constexpr typename span<ElementType, Extent>::iterator
0165 end(const span<ElementType, Extent>& s) noexcept
0166 {
0167     return s.end();
0168 }
0169 
0170 template <class ElementType, std::size_t Extent>
0171 constexpr typename span<ElementType, Extent>::reverse_iterator
0172 rbegin(const span<ElementType, Extent>& s) noexcept
0173 {
0174     return s.rbegin();
0175 }
0176 
0177 template <class ElementType, std::size_t Extent>
0178 constexpr typename span<ElementType, Extent>::reverse_iterator
0179 rend(const span<ElementType, Extent>& s) noexcept
0180 {
0181     return s.rend();
0182 }
0183 
0184 template <class ElementType, std::size_t Extent>
0185 constexpr typename span<ElementType, Extent>::iterator
0186 cbegin(const span<ElementType, Extent>& s) noexcept
0187 {
0188     return s.begin();
0189 }
0190 
0191 template <class ElementType, std::size_t Extent = dynamic_extent>
0192 constexpr typename span<ElementType, Extent>::iterator
0193 cend(const span<ElementType, Extent>& s) noexcept
0194 {
0195     return s.end();
0196 }
0197 
0198 template <class ElementType, std::size_t Extent>
0199 constexpr typename span<ElementType, Extent>::reverse_iterator
0200 crbegin(const span<ElementType, Extent>& s) noexcept
0201 {
0202     return s.rbegin();
0203 }
0204 
0205 template <class ElementType, std::size_t Extent>
0206 constexpr typename span<ElementType, Extent>::reverse_iterator
0207 crend(const span<ElementType, Extent>& s) noexcept
0208 {
0209     return s.rend();
0210 }
0211 
0212 } // namespace gsl
0213 
0214 #endif // GSL_SPAN_EXT_H