diff --git a/stl/CMakeLists.txt b/stl/CMakeLists.txt index 41e5d8acfdd..9596c5d1699 100644 --- a/stl/CMakeLists.txt +++ b/stl/CMakeLists.txt @@ -158,6 +158,7 @@ set(HEADERS ${CMAKE_CURRENT_LIST_DIR}/inc/memory_resource ${CMAKE_CURRENT_LIST_DIR}/inc/mutex ${CMAKE_CURRENT_LIST_DIR}/inc/new + ${CMAKE_CURRENT_LIST_DIR}/inc/numbers ${CMAKE_CURRENT_LIST_DIR}/inc/numeric ${CMAKE_CURRENT_LIST_DIR}/inc/optional ${CMAKE_CURRENT_LIST_DIR}/inc/ostream diff --git a/stl/inc/__msvc_all_public_headers.hpp b/stl/inc/__msvc_all_public_headers.hpp index c48d7e6a7d6..66688081eb6 100644 --- a/stl/inc/__msvc_all_public_headers.hpp +++ b/stl/inc/__msvc_all_public_headers.hpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include #include diff --git a/stl/inc/concepts b/stl/inc/concepts index 7d507516cf6..7ba91673c72 100644 --- a/stl/inc/concepts +++ b/stl/inc/concepts @@ -91,6 +91,10 @@ concept signed_integral = integral<_Ty> && _Ty(-1) < _Ty(0); template concept unsigned_integral = integral<_Ty> && !signed_integral<_Ty>; +// CONCEPT floating_point +template +concept floating_point = is_floating_point_v<_Ty>; + // CONCEPT assignable_from template concept assignable_from = is_lvalue_reference_v<_LTy> diff --git a/stl/inc/numbers b/stl/inc/numbers new file mode 100644 index 00000000000..61a8a641efd --- /dev/null +++ b/stl/inc/numbers @@ -0,0 +1,194 @@ +// numbers standard header (core) + +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#pragma once +#ifndef _NUMBERS_ +#define _NUMBERS_ +#include +#if _STL_COMPILER_PREPROCESSOR +#if !_HAS_CXX20 +#pragma message("The contents of are available only with C++20 or later.") +#else // ^^^ !_HAS_CXX20 / _HAS_CXX20 vvv +#ifdef __cpp_lib_concepts +#include +#else // ^^^ defined(__cpp_lib_concepts) / !defined(__cpp_lib_concepts) vvv +#include +#endif // ^^^ !defined(__cpp_lib_concepts) ^^^ + +#pragma pack(push, _CRT_PACKING) +#pragma warning(push, _STL_WARNING_LEVEL) +#pragma warning(disable : _STL_DISABLED_WARNINGS) +_STL_DISABLE_CLANG_WARNINGS +#pragma push_macro("new") +#undef new + +_STD_BEGIN +namespace numbers { + template + struct _Invalid { + static_assert(_Always_false<_Ty>, "A program that instantiates a primary template of a mathematical constant " + "variable template is ill-formed. (N4835 [math.constants]/3)"); + }; + + template + inline constexpr _Ty e_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty log2e_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty log10e_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty pi_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty inv_pi_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty inv_sqrtpi_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty ln2_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty ln10_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty sqrt2_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty sqrt3_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty inv_sqrt3_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty egamma_v = _Invalid<_Ty>{}; + template + inline constexpr _Ty phi_v = _Invalid<_Ty>{}; + +#ifdef __cpp_lib_concepts + template + inline constexpr _Floating e_v<_Floating> = static_cast<_Floating>(2.718281828459045); + template + inline constexpr _Floating log2e_v<_Floating> = static_cast<_Floating>(1.4426950408889634); + template + inline constexpr _Floating log10e_v<_Floating> = static_cast<_Floating>(0.4342944819032518); + template + inline constexpr _Floating pi_v<_Floating> = static_cast<_Floating>(3.141592653589793); + template + inline constexpr _Floating inv_pi_v<_Floating> = static_cast<_Floating>(0.3183098861837907); + template + inline constexpr _Floating inv_sqrtpi_v<_Floating> = static_cast<_Floating>(0.5641895835477563); + template + inline constexpr _Floating ln2_v<_Floating> = static_cast<_Floating>(0.6931471805599453); + template + inline constexpr _Floating ln10_v<_Floating> = static_cast<_Floating>(2.302585092994046); + template + inline constexpr _Floating sqrt2_v<_Floating> = static_cast<_Floating>(1.4142135623730951); + template + inline constexpr _Floating sqrt3_v<_Floating> = static_cast<_Floating>(1.7320508075688772); + template + inline constexpr _Floating inv_sqrt3_v<_Floating> = static_cast<_Floating>(0.5773502691896257); + template + inline constexpr _Floating egamma_v<_Floating> = static_cast<_Floating>(0.5772156649015329); + template + inline constexpr _Floating phi_v<_Floating> = static_cast<_Floating>(1.618033988749895); +#else // ^^^ defined(__cpp_lib_concepts) / !defined(__cpp_lib_concepts) vvv + template <> + inline constexpr double e_v = 2.718281828459045; + template <> + inline constexpr double log2e_v = 1.4426950408889634; + template <> + inline constexpr double log10e_v = 0.4342944819032518; + template <> + inline constexpr double pi_v = 3.141592653589793; + template <> + inline constexpr double inv_pi_v = 0.3183098861837907; + template <> + inline constexpr double inv_sqrtpi_v = 0.5641895835477563; + template <> + inline constexpr double ln2_v = 0.6931471805599453; + template <> + inline constexpr double ln10_v = 2.302585092994046; + template <> + inline constexpr double sqrt2_v = 1.4142135623730951; + template <> + inline constexpr double sqrt3_v = 1.7320508075688772; + template <> + inline constexpr double inv_sqrt3_v = 0.5773502691896257; + template <> + inline constexpr double egamma_v = 0.5772156649015329; + template <> + inline constexpr double phi_v = 1.618033988749895; + + template <> + inline constexpr float e_v = static_cast(e_v); + template <> + inline constexpr float log2e_v = static_cast(log2e_v); + template <> + inline constexpr float log10e_v = static_cast(log10e_v); + template <> + inline constexpr float pi_v = static_cast(pi_v); + template <> + inline constexpr float inv_pi_v = static_cast(inv_pi_v); + template <> + inline constexpr float inv_sqrtpi_v = static_cast(inv_sqrtpi_v); + template <> + inline constexpr float ln2_v = static_cast(ln2_v); + template <> + inline constexpr float ln10_v = static_cast(ln10_v); + template <> + inline constexpr float sqrt2_v = static_cast(sqrt2_v); + template <> + inline constexpr float sqrt3_v = static_cast(sqrt3_v); + template <> + inline constexpr float inv_sqrt3_v = static_cast(inv_sqrt3_v); + template <> + inline constexpr float egamma_v = static_cast(egamma_v); + template <> + inline constexpr float phi_v = static_cast(phi_v); + + template <> + inline constexpr long double e_v = e_v; + template <> + inline constexpr long double log2e_v = log2e_v; + template <> + inline constexpr long double log10e_v = log10e_v; + template <> + inline constexpr long double pi_v = pi_v; + template <> + inline constexpr long double inv_pi_v = inv_pi_v; + template <> + inline constexpr long double inv_sqrtpi_v = inv_sqrtpi_v; + template <> + inline constexpr long double ln2_v = ln2_v; + template <> + inline constexpr long double ln10_v = ln10_v; + template <> + inline constexpr long double sqrt2_v = sqrt2_v; + template <> + inline constexpr long double sqrt3_v = sqrt3_v; + template <> + inline constexpr long double inv_sqrt3_v = inv_sqrt3_v; + template <> + inline constexpr long double egamma_v = egamma_v; + template <> + inline constexpr long double phi_v = phi_v; +#endif // ^^^ !defined(__cpp_lib_concepts) ^^^ + + inline constexpr double e = e_v; + inline constexpr double log2e = log2e_v; + inline constexpr double log10e = log10e_v; + inline constexpr double pi = pi_v; + inline constexpr double inv_pi = inv_pi_v; + inline constexpr double inv_sqrtpi = inv_sqrtpi_v; + inline constexpr double ln2 = ln2_v; + inline constexpr double ln10 = ln10_v; + inline constexpr double sqrt2 = sqrt2_v; + inline constexpr double sqrt3 = sqrt3_v; + inline constexpr double inv_sqrt3 = inv_sqrt3_v; + inline constexpr double egamma = egamma_v; + inline constexpr double phi = phi_v; +} // namespace numbers +_STD_END + +#pragma pop_macro("new") +_STL_RESTORE_CLANG_WARNINGS +#pragma warning(pop) +#pragma pack(pop) +#endif // _HAS_CXX20 +#endif // _STL_COMPILER_PREPROCESSOR +#endif // _NUMBERS_ diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 1da8c63ed42..1c190fd3b61 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -32,6 +32,7 @@ // P0487R1 Fixing operator>>(basic_istream&, CharT*) // P0550R2 remove_cvref // P0616R0 Using move() In +// P0631R8 Math Constants // P0646R1 list/forward_list remove()/remove_if()/unique() Return size_type // P0653R2 to_address() // P0655R1 visit() @@ -969,6 +970,7 @@ #define __cpp_lib_erase_if 201811L #define __cpp_lib_generic_unordered_lookup 201811L #define __cpp_lib_list_remove_return_type 201806L +#define __cpp_lib_math_constants 201907L #define __cpp_lib_to_array 201907L #endif // _HAS_CXX20