Home | History | Annotate | Download | only in gsl
      1 ///////////////////////////////////////////////////////////////////////////////
      2 //
      3 // Copyright (c) 2015 Microsoft Corporation. All rights reserved.
      4 //
      5 // This code is licensed under the MIT License (MIT).
      6 //
      7 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      8 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      9 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     10 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     11 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     12 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     13 // THE SOFTWARE.
     14 //
     15 ///////////////////////////////////////////////////////////////////////////////
     16 
     17 #pragma once
     18 
     19 #ifndef GSL_ALGORITHM_H
     20 #define GSL_ALGORITHM_H
     21 
     22 #include <gsl/span>
     23 
     24 #include <algorithm>
     25 
     26 #ifdef _MSC_VER
     27 #pragma warning(push)
     28 
     29 // turn off some warnings that are noisy about our Expects statements
     30 #pragma warning(disable : 4127) // conditional expression is constant
     31 
     32 // blanket turn off warnings from CppCoreCheck for now
     33 // so people aren't annoyed by them when running the tool.
     34 // more targeted suppressions will be added in a future update to the GSL
     35 #pragma warning(disable : 26481 26482 26483 26485 26490 26491 26492 26493 26495)
     36 #endif // _MSC_VER
     37 
     38 namespace gsl
     39 {
     40 
     41 template <class SrcElementType, std::ptrdiff_t SrcExtent, class DestElementType,
     42           std::ptrdiff_t DestExtent>
     43 void copy(span<SrcElementType, SrcExtent> src, span<DestElementType, DestExtent> dest)
     44 {
     45     static_assert(std::is_assignable<decltype(*dest.data()), decltype(*src.data())>::value,
     46                   "Elements of source span can not be assigned to elements of destination span");
     47     static_assert(SrcExtent == dynamic_extent || DestExtent == dynamic_extent ||
     48                       (SrcExtent <= DestExtent),
     49                   "Source range is longer than target range");
     50 
     51     Expects(dest.size() >= src.size());
     52     std::copy_n(src.data(), src.size(), dest.data());
     53 }
     54 
     55 } // namespace gsl
     56 
     57 #ifdef _MSC_VER
     58 #pragma warning(pop)
     59 #endif // _MSC_VER
     60 
     61 #endif // GSL_ALGORITHM_H
     62