This repository has been archived by the owner on Mar 31, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
17 changed files
with
1,048 additions
and
3,092 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/////////////////////////////////////////////////////////////////////////////// | ||
// | ||
// Copyright (c) 2015 Microsoft Corporation. All rights reserved. | ||
// | ||
// This code is licensed under the MIT License (MIT). | ||
// | ||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
// THE SOFTWARE. | ||
// | ||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
#ifndef GSL_ALGORITHM_H | ||
#define GSL_ALGORITHM_H | ||
|
||
#include "assert" // for Expects | ||
#include "span" // for dynamic_extent, span | ||
|
||
#include <algorithm> // for copy_n | ||
#include <cstddef> // for ptrdiff_t | ||
#include <type_traits> // for is_assignable | ||
|
||
#ifdef _MSC_VER | ||
#pragma warning(push) | ||
|
||
// turn off some warnings that are noisy about our Expects statements | ||
#pragma warning(disable : 4127) // conditional expression is constant | ||
#pragma warning(disable : 4996) // unsafe use of std::copy_n | ||
|
||
#endif // _MSC_VER | ||
|
||
namespace gsl | ||
{ | ||
// Note: this will generate faster code than std::copy using span iterator in older msvc+stl | ||
// not necessary for msvc since VS2017 15.8 (_MSC_VER >= 1915) | ||
template <class SrcElementType, std::size_t SrcExtent, class DestElementType, | ||
std::size_t DestExtent> | ||
void copy(span<SrcElementType, SrcExtent> src, span<DestElementType, DestExtent> dest) | ||
{ | ||
static_assert(std::is_assignable<decltype(*dest.data()), decltype(*src.data())>::value, | ||
"Elements of source span can not be assigned to elements of destination span"); | ||
static_assert(SrcExtent == dynamic_extent || DestExtent == dynamic_extent || | ||
(SrcExtent <= DestExtent), | ||
"Source range is longer than target range"); | ||
|
||
Expects(dest.size() >= src.size()); | ||
// clang-format off | ||
GSL_SUPPRESS(stl.1) // NO-FORMAT: attribute | ||
// clang-format on | ||
std::copy_n(src.data(), src.size(), dest.data()); | ||
} | ||
|
||
} // namespace gsl | ||
|
||
#ifdef _MSC_VER | ||
#pragma warning(pop) | ||
#endif // _MSC_VER | ||
|
||
#endif // GSL_ALGORITHM_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
/////////////////////////////////////////////////////////////////////////////// | ||
// | ||
// Copyright (c) 2015 Microsoft Corporation. All rights reserved. | ||
// | ||
// This code is licensed under the MIT License (MIT). | ||
// | ||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
// THE SOFTWARE. | ||
// | ||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
#ifndef GSL_CONTRACTS_H | ||
#define GSL_CONTRACTS_H | ||
|
||
// | ||
// Temporary until MSVC STL supports no-exceptions mode. | ||
// Currently terminate is a no-op in this mode, so we add termination behavior back | ||
// | ||
#if defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS)) | ||
#define GSL_KERNEL_MODE | ||
|
||
#define GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND | ||
#include <intrin.h> | ||
#define RANGE_CHECKS_FAILURE 0 | ||
|
||
#if defined(__clang__) | ||
#pragma clang diagnostic push | ||
#pragma clang diagnostic ignored "-Winvalid-noreturn" | ||
#endif // defined(__clang__) | ||
|
||
#else // defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && | ||
// !_HAS_EXCEPTIONS)) | ||
|
||
#include <exception> | ||
|
||
#endif // defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && | ||
// !_HAS_EXCEPTIONS)) | ||
|
||
// | ||
// make suppress attributes parse for some compilers | ||
// Hopefully temporary until suppression standardization occurs | ||
// | ||
#if defined(__clang__) | ||
#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] | ||
#else | ||
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) | ||
#define GSL_SUPPRESS(x) [[gsl::suppress(x)]] | ||
#else | ||
#define GSL_SUPPRESS(x) | ||
#endif // _MSC_VER | ||
#endif // __clang__ | ||
|
||
#define GSL_STRINGIFY_DETAIL(x) #x | ||
#define GSL_STRINGIFY(x) GSL_STRINGIFY_DETAIL(x) | ||
|
||
#if defined(__clang__) || defined(__GNUC__) | ||
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1) | ||
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0) | ||
|
||
#else | ||
|
||
#define GSL_LIKELY(x) (!!(x)) | ||
#define GSL_UNLIKELY(x) (!!(x)) | ||
#endif // defined(__clang__) || defined(__GNUC__) | ||
|
||
// | ||
// GSL_ASSUME(cond) | ||
// | ||
// Tell the optimizer that the predicate cond must hold. It is unspecified | ||
// whether or not cond is actually evaluated. | ||
// | ||
#ifdef _MSC_VER | ||
#define GSL_ASSUME(cond) __assume(cond) | ||
#elif defined(__GNUC__) | ||
#define GSL_ASSUME(cond) ((cond) ? static_cast<void>(0) : __builtin_unreachable()) | ||
#else | ||
#define GSL_ASSUME(cond) static_cast<void>((cond) ? 0 : 0) | ||
#endif | ||
|
||
// | ||
// GSL.assert: assertions | ||
// | ||
|
||
namespace gsl | ||
{ | ||
|
||
namespace details | ||
{ | ||
#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) | ||
|
||
typedef void(__cdecl* terminate_handler)(); | ||
|
||
// clang-format off | ||
GSL_SUPPRESS(f.6) // NO-FORMAT: attribute | ||
// clang-format on | ||
[[noreturn]] inline void __cdecl default_terminate_handler() | ||
{ | ||
__fastfail(RANGE_CHECKS_FAILURE); | ||
} | ||
|
||
inline gsl::details::terminate_handler& get_terminate_handler() noexcept | ||
{ | ||
static terminate_handler handler = &default_terminate_handler; | ||
return handler; | ||
} | ||
|
||
#endif // defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) | ||
|
||
[[noreturn]] inline void terminate() noexcept | ||
{ | ||
#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) | ||
(*gsl::details::get_terminate_handler())(); | ||
#else | ||
std::terminate(); | ||
#endif // defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) | ||
} | ||
|
||
} // namespace details | ||
} // namespace gsl | ||
|
||
#define GSL_CONTRACT_CHECK(type, cond) \ | ||
(GSL_LIKELY(cond) ? static_cast<void>(0) : gsl::details::terminate()) | ||
|
||
#define Expects(cond) GSL_CONTRACT_CHECK("Precondition", cond) | ||
#define Ensures(cond) GSL_CONTRACT_CHECK("Postcondition", cond) | ||
|
||
#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) && defined(__clang__) | ||
#pragma clang diagnostic pop | ||
#endif | ||
|
||
#endif // GSL_CONTRACTS_H |
Oops, something went wrong.