From 0dc6ced9559ec263aaacd8e1a52f2892a6417e43 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Tue, 5 Nov 2019 15:22:57 +0000 Subject: [PATCH 01/13] Implement Math Constants --- stl/CMakeLists.txt | 1 + stl/inc/numbers | 98 ++++++++++++++++++++++++++++++++++++++++++++ stl/inc/yvals_core.h | 2 + 3 files changed, 101 insertions(+) create mode 100644 stl/inc/numbers 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/numbers b/stl/inc/numbers new file mode 100644 index 00000000000..e6bbdb7163d --- /dev/null +++ b/stl/inc/numbers @@ -0,0 +1,98 @@ +// numbers standard header + +// 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 + +_STD_BEGIN +namespace numbers { +#ifdef __cpp_lib_concepts + template + inline constexpr _Floating e_v = static_cast<_Floating>(2.71828182845904523536); + template + inline constexpr _Floating log2e_v = static_cast<_Floating>(1.44269504088896340736); + template + inline constexpr _Floating log10e_v = static_cast<_Floating>(0.434294481903251827651); + template + inline constexpr _Floating pi_v = static_cast<_Floating>(3.14159265358979323846); + template + inline constexpr _Floating inv_pi_v = static_cast<_Floating>(0.318309886183790671538); + template + inline constexpr _Floating inv_sqrtpi_v = static_cast<_Floating>(0.564189583547756286948); + template + inline constexpr _Floating ln2_v = static_cast<_Floating>(0.693147180559945309417); + template + inline constexpr _Floating ln10_v = static_cast<_Floating>(2.30258509299404568402); + template + inline constexpr _Floating sqrt2_v = static_cast<_Floating>(1.41421356237309504880); + template + inline constexpr _Floating sqrt3_v = static_cast<_Floating>(1.73205080756887729353); + template + inline constexpr _Floating inv_sqrt3_v = static_cast<_Floating>(0.577350269189625764509); + template + inline constexpr _Floating egamma_v = static_cast<_Floating>(0.577215664901532860607); + template + inline constexpr _Floating phi_v = static_cast<_Floating>(1.61803398874989484820); +#else // ^^^ defined(__cpp_lib_concepts) / !defined(__cpp_lib_concepts) vvv + template + using _Floating = enable_if_t, _Ty>; + + template + inline constexpr _Ty e_v = static_cast<_Floating<_Ty>>(2.71828182845904523536); + template + inline constexpr _Ty log2e_v = static_cast<_Floating<_Ty>>(1.44269504088896340736); + template + inline constexpr _Ty log10e_v = static_cast<_Floating<_Ty>>(0.434294481903251827651); + template + inline constexpr _Ty pi_v = static_cast<_Floating<_Ty>>(3.14159265358979323846); + template + inline constexpr _Ty inv_pi_v = static_cast<_Floating<_Ty>>(0.318309886183790671538); + template + inline constexpr _Ty inv_sqrtpi_v = static_cast<_Floating<_Ty>>(0.564189583547756286948); + template + inline constexpr _Ty ln2_v = static_cast<_Floating<_Ty>>(0.693147180559945309417); + template + inline constexpr _Ty ln10_v = static_cast<_Floating<_Ty>>(2.30258509299404568402); + template + inline constexpr _Ty sqrt2_v = static_cast<_Floating<_Ty>>(1.41421356237309504880); + template + inline constexpr _Ty sqrt3_v = static_cast<_Floating<_Ty>>(1.73205080756887729353); + template + inline constexpr _Ty inv_sqrt3_v = static_cast<_Floating<_Ty>>(0.577350269189625764509); + template + inline constexpr _Ty egamma_v = static_cast<_Floating<_Ty>>(0.577215664901532860607); + template + inline constexpr _Ty phi_v = static_cast<_Floating<_Ty>>(1.61803398874989484820); +#endif + 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; +} +_STD_END + +#endif // _HAS_CXX20 +#endif // _STL_COMPILER_PREPROCESSOR +#endif // _NUMBERS_ \ No newline at end of file diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 527ef6d4ea9..13ce31a9fea 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() @@ -968,6 +969,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 From 6b3903c8ca05729d512eb950d09d9ef90ec6d6fb Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 10:43:31 +0000 Subject: [PATCH 02/13] Add floating_point concept --- stl/inc/concepts | 4 ++++ 1 file changed, 4 insertions(+) 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> From 43bdaae86bd37a171e40d1285ad23f39feb6fe66 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 10:48:19 +0000 Subject: [PATCH 03/13] Add warning supressions --- stl/inc/numbers | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/stl/inc/numbers b/stl/inc/numbers index e6bbdb7163d..304424bd759 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -17,6 +17,13 @@ #include #endif +#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 { #ifdef __cpp_lib_concepts @@ -93,6 +100,10 @@ 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_ \ No newline at end of file From 89f59e32861b35dd6598e6e82fd901d62897169e Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 10:55:55 +0000 Subject: [PATCH 04/13] Add comments and newline --- stl/inc/numbers | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index 304424bd759..9edf209a389 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -1,4 +1,4 @@ -// numbers standard header +// numbers standard header (core) // Copyright (c) Microsoft Corporation. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception @@ -15,7 +15,7 @@ #include #else // ^^^ defined(__cpp_lib_concepts) / !defined(__cpp_lib_concepts) vvv #include -#endif +#endif // ^^^ !defined(__cpp_lib_concepts) ^^^ #pragma pack(push, _CRT_PACKING) #pragma warning(push, _STL_WARNING_LEVEL) @@ -83,7 +83,7 @@ namespace numbers { inline constexpr _Ty egamma_v = static_cast<_Floating<_Ty>>(0.577215664901532860607); template inline constexpr _Ty phi_v = static_cast<_Floating<_Ty>>(1.61803398874989484820); -#endif +#endif // ^^^ !defined(__cpp_lib_concepts) ^^^ inline constexpr double e = e_v; inline constexpr double log2e = log2e_v; inline constexpr double log10e = log10e_v; @@ -97,7 +97,7 @@ namespace numbers { 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") @@ -106,4 +106,4 @@ _STL_RESTORE_CLANG_WARNINGS #pragma pack(pop) #endif // _HAS_CXX20 #endif // _STL_COMPILER_PREPROCESSOR -#endif // _NUMBERS_ \ No newline at end of file +#endif // _NUMBERS_ From 50eebc0f03cc3948956e1f8c2eda23ac4d8d2c65 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 11:23:07 +0000 Subject: [PATCH 05/13] Remove whitespace --- stl/inc/numbers | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index 9edf209a389..1f407587199 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -17,13 +17,13 @@ #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 - +#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 { #ifdef __cpp_lib_concepts @@ -100,10 +100,10 @@ namespace numbers { } // namespace numbers _STD_END -#pragma pop_macro("new") -_STL_RESTORE_CLANG_WARNINGS -#pragma warning(pop) -#pragma pack(pop) +#pragma pop_macro("new") +_STL_RESTORE_CLANG_WARNINGS +#pragma warning(pop) +#pragma pack(pop) #endif // _HAS_CXX20 #endif // _STL_COMPILER_PREPROCESSOR #endif // _NUMBERS_ From f8ff577a903f757673f3a1ee87983afe3b951e47 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 14:49:00 +0000 Subject: [PATCH 06/13] Use to_chars for values --- stl/inc/numbers | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index 1f407587199..b70914082de 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -28,61 +28,61 @@ _STD_BEGIN namespace numbers { #ifdef __cpp_lib_concepts template - inline constexpr _Floating e_v = static_cast<_Floating>(2.71828182845904523536); + inline constexpr _Floating e_v = static_cast<_Floating>(2.718281828459045); template - inline constexpr _Floating log2e_v = static_cast<_Floating>(1.44269504088896340736); + inline constexpr _Floating log2e_v = static_cast<_Floating>(1.4426950408889634); template - inline constexpr _Floating log10e_v = static_cast<_Floating>(0.434294481903251827651); + inline constexpr _Floating log10e_v = static_cast<_Floating>(0.4342944819032518); template - inline constexpr _Floating pi_v = static_cast<_Floating>(3.14159265358979323846); + inline constexpr _Floating pi_v = static_cast<_Floating>(3.141592653589793); template - inline constexpr _Floating inv_pi_v = static_cast<_Floating>(0.318309886183790671538); + inline constexpr _Floating inv_pi_v = static_cast<_Floating>(0.3183098861837907); template - inline constexpr _Floating inv_sqrtpi_v = static_cast<_Floating>(0.564189583547756286948); + inline constexpr _Floating inv_sqrtpi_v = static_cast<_Floating>(0.5641895835477563); template - inline constexpr _Floating ln2_v = static_cast<_Floating>(0.693147180559945309417); + inline constexpr _Floating ln2_v = static_cast<_Floating>(0.6931471805599453); template - inline constexpr _Floating ln10_v = static_cast<_Floating>(2.30258509299404568402); + inline constexpr _Floating ln10_v = static_cast<_Floating>(2.302585092994046); template - inline constexpr _Floating sqrt2_v = static_cast<_Floating>(1.41421356237309504880); + inline constexpr _Floating sqrt2_v = static_cast<_Floating>(1.4142135623730951); template - inline constexpr _Floating sqrt3_v = static_cast<_Floating>(1.73205080756887729353); + inline constexpr _Floating sqrt3_v = static_cast<_Floating>(1.7320508075688772); template - inline constexpr _Floating inv_sqrt3_v = static_cast<_Floating>(0.577350269189625764509); + inline constexpr _Floating inv_sqrt3_v = static_cast<_Floating>(0.5773502691896257); template - inline constexpr _Floating egamma_v = static_cast<_Floating>(0.577215664901532860607); + inline constexpr _Floating egamma_v = static_cast<_Floating>(0.5772156649015329); template - inline constexpr _Floating phi_v = static_cast<_Floating>(1.61803398874989484820); + inline constexpr _Floating phi_v = static_cast<_Floating>(1.618033988749895); #else // ^^^ defined(__cpp_lib_concepts) / !defined(__cpp_lib_concepts) vvv template using _Floating = enable_if_t, _Ty>; template - inline constexpr _Ty e_v = static_cast<_Floating<_Ty>>(2.71828182845904523536); + inline constexpr _Ty e_v = static_cast<_Floating<_Ty>>(2.718281828459045); template - inline constexpr _Ty log2e_v = static_cast<_Floating<_Ty>>(1.44269504088896340736); + inline constexpr _Ty log2e_v = static_cast<_Floating<_Ty>>(1.4426950408889634); template - inline constexpr _Ty log10e_v = static_cast<_Floating<_Ty>>(0.434294481903251827651); + inline constexpr _Ty log10e_v = static_cast<_Floating<_Ty>>(0.4342944819032518); template - inline constexpr _Ty pi_v = static_cast<_Floating<_Ty>>(3.14159265358979323846); + inline constexpr _Ty pi_v = static_cast<_Floating<_Ty>>(3.141592653589793); template - inline constexpr _Ty inv_pi_v = static_cast<_Floating<_Ty>>(0.318309886183790671538); + inline constexpr _Ty inv_pi_v = static_cast<_Floating<_Ty>>(0.3183098861837907); template - inline constexpr _Ty inv_sqrtpi_v = static_cast<_Floating<_Ty>>(0.564189583547756286948); + inline constexpr _Ty inv_sqrtpi_v = static_cast<_Floating<_Ty>>(0.5641895835477563); template - inline constexpr _Ty ln2_v = static_cast<_Floating<_Ty>>(0.693147180559945309417); + inline constexpr _Ty ln2_v = static_cast<_Floating<_Ty>>(0.6931471805599453); template - inline constexpr _Ty ln10_v = static_cast<_Floating<_Ty>>(2.30258509299404568402); + inline constexpr _Ty ln10_v = static_cast<_Floating<_Ty>>(2.302585092994046); template - inline constexpr _Ty sqrt2_v = static_cast<_Floating<_Ty>>(1.41421356237309504880); + inline constexpr _Ty sqrt2_v = static_cast<_Floating<_Ty>>(1.4142135623730951); template - inline constexpr _Ty sqrt3_v = static_cast<_Floating<_Ty>>(1.73205080756887729353); + inline constexpr _Ty sqrt3_v = static_cast<_Floating<_Ty>>(1.7320508075688772); template - inline constexpr _Ty inv_sqrt3_v = static_cast<_Floating<_Ty>>(0.577350269189625764509); + inline constexpr _Ty inv_sqrt3_v = static_cast<_Floating<_Ty>>(0.5773502691896257); template - inline constexpr _Ty egamma_v = static_cast<_Floating<_Ty>>(0.577215664901532860607); + inline constexpr _Ty egamma_v = static_cast<_Floating<_Ty>>(0.5772156649015329); template - inline constexpr _Ty phi_v = static_cast<_Floating<_Ty>>(1.61803398874989484820); + inline constexpr _Ty phi_v = static_cast<_Floating<_Ty>>(1.618033988749895); #endif // ^^^ !defined(__cpp_lib_concepts) ^^^ inline constexpr double e = e_v; inline constexpr double log2e = log2e_v; From 459164351d6c004e4a71c95f1ab799019d004a38 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 16:16:42 +0000 Subject: [PATCH 07/13] Provide primary template and specialise floating point types --- stl/inc/numbers | 189 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 135 insertions(+), 54 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index b70914082de..e56deef62bc 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -26,77 +26,158 @@ _STL_DISABLE_CLANG_WARNINGS _STD_BEGIN namespace numbers { + template + struct _Invalid { + static_assert(_Always_false<_Ty>, "This variable template is not specialised for this type which is invalid."); + }; + 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 = static_cast<_Floating>(2.718281828459045); + inline constexpr _Floating e_v<_Floating> = static_cast<_Floating>(2.718281828459045); template - inline constexpr _Floating log2e_v = static_cast<_Floating>(1.4426950408889634); + inline constexpr _Floating log2e_v<_Floating> = static_cast<_Floating>(1.4426950408889634); template - inline constexpr _Floating log10e_v = static_cast<_Floating>(0.4342944819032518); + inline constexpr _Floating log10e_v<_Floating> = static_cast<_Floating>(0.4342944819032518); template - inline constexpr _Floating pi_v = static_cast<_Floating>(3.141592653589793); + inline constexpr _Floating pi_v<_Floating> = static_cast<_Floating>(3.141592653589793); template - inline constexpr _Floating inv_pi_v = static_cast<_Floating>(0.3183098861837907); + inline constexpr _Floating inv_pi_v<_Floating> = static_cast<_Floating>(0.3183098861837907); template - inline constexpr _Floating inv_sqrtpi_v = static_cast<_Floating>(0.5641895835477563); + inline constexpr _Floating inv_sqrtpi_v<_Floating> = static_cast<_Floating>(0.5641895835477563); template - inline constexpr _Floating ln2_v = static_cast<_Floating>(0.6931471805599453); + inline constexpr _Floating ln2_v<_Floating> = static_cast<_Floating>(0.6931471805599453); template - inline constexpr _Floating ln10_v = static_cast<_Floating>(2.302585092994046); + inline constexpr _Floating ln10_v<_Floating> = static_cast<_Floating>(2.302585092994046); template - inline constexpr _Floating sqrt2_v = static_cast<_Floating>(1.4142135623730951); + inline constexpr _Floating sqrt2_v<_Floating> = static_cast<_Floating>(1.4142135623730951); template - inline constexpr _Floating sqrt3_v = static_cast<_Floating>(1.7320508075688772); + inline constexpr _Floating sqrt3_v<_Floating> = static_cast<_Floating>(1.7320508075688772); template - inline constexpr _Floating inv_sqrt3_v = static_cast<_Floating>(0.5773502691896257); + inline constexpr _Floating inv_sqrt3_v<_Floating> = static_cast<_Floating>(0.5773502691896257); template - inline constexpr _Floating egamma_v = static_cast<_Floating>(0.5772156649015329); + inline constexpr _Floating egamma_v<_Floating> = static_cast<_Floating>(0.5772156649015329); template - inline constexpr _Floating phi_v = static_cast<_Floating>(1.618033988749895); + inline constexpr _Floating phi_v<_Floating> = static_cast<_Floating>(1.618033988749895); #else // ^^^ defined(__cpp_lib_concepts) / !defined(__cpp_lib_concepts) vvv - template - using _Floating = enable_if_t, _Ty>; + template <> + inline constexpr double e_v = static_cast(2.718281828459045); + template <> + inline constexpr double log2e_v = static_cast(1.4426950408889634); + template <> + inline constexpr double log10e_v = static_cast(0.4342944819032518); + template <> + inline constexpr double pi_v = static_cast(3.141592653589793); + template <> + inline constexpr double inv_pi_v = static_cast(0.3183098861837907); + template <> + inline constexpr double inv_sqrtpi_v = static_cast(0.5641895835477563); + template <> + inline constexpr double ln2_v = static_cast(0.6931471805599453); + template <> + inline constexpr double ln10_v = static_cast(2.302585092994046); + template <> + inline constexpr double sqrt2_v = static_cast(1.4142135623730951); + template <> + inline constexpr double sqrt3_v = static_cast(1.7320508075688772); + template <> + inline constexpr double inv_sqrt3_v = static_cast(0.5773502691896257); + template <> + inline constexpr double egamma_v = static_cast(0.5772156649015329); + template <> + inline constexpr double phi_v = static_cast(1.618033988749895); - template - inline constexpr _Ty e_v = static_cast<_Floating<_Ty>>(2.718281828459045); - template - inline constexpr _Ty log2e_v = static_cast<_Floating<_Ty>>(1.4426950408889634); - template - inline constexpr _Ty log10e_v = static_cast<_Floating<_Ty>>(0.4342944819032518); - template - inline constexpr _Ty pi_v = static_cast<_Floating<_Ty>>(3.141592653589793); - template - inline constexpr _Ty inv_pi_v = static_cast<_Floating<_Ty>>(0.3183098861837907); - template - inline constexpr _Ty inv_sqrtpi_v = static_cast<_Floating<_Ty>>(0.5641895835477563); - template - inline constexpr _Ty ln2_v = static_cast<_Floating<_Ty>>(0.6931471805599453); - template - inline constexpr _Ty ln10_v = static_cast<_Floating<_Ty>>(2.302585092994046); - template - inline constexpr _Ty sqrt2_v = static_cast<_Floating<_Ty>>(1.4142135623730951); - template - inline constexpr _Ty sqrt3_v = static_cast<_Floating<_Ty>>(1.7320508075688772); - template - inline constexpr _Ty inv_sqrt3_v = static_cast<_Floating<_Ty>>(0.5773502691896257); - template - inline constexpr _Ty egamma_v = static_cast<_Floating<_Ty>>(0.5772156649015329); - template - inline constexpr _Ty phi_v = static_cast<_Floating<_Ty>>(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 = static_cast(e_v); + template <> + inline constexpr long double log2e_v = static_cast(log2e_v); + template <> + inline constexpr long double log10e_v = static_cast(log10e_v); + template <> + inline constexpr long double pi_v = static_cast(pi_v); + template <> + inline constexpr long double inv_pi_v = static_cast(inv_pi_v); + template <> + inline constexpr long double inv_sqrtpi_v = static_cast(inv_sqrtpi_v); + template <> + inline constexpr long double ln2_v = static_cast(ln2_v); + template <> + inline constexpr long double ln10_v = static_cast(ln10_v); + template <> + inline constexpr long double sqrt2_v = static_cast(sqrt2_v); + template <> + inline constexpr long double sqrt3_v = static_cast(sqrt3_v); + template <> + inline constexpr long double inv_sqrt3_v = static_cast(inv_sqrt3_v); + template <> + inline constexpr long double egamma_v = static_cast(egamma_v); + template <> + inline constexpr long double phi_v = static_cast(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; + 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 From 9d256c18e8528fa3f01909b446d26a9480b3cd36 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Thu, 7 Nov 2019 17:23:36 +0000 Subject: [PATCH 08/13] Remove unused header --- stl/inc/numbers | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index e56deef62bc..7a371248a57 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -13,9 +13,7 @@ #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) ^^^ +#endif #pragma pack(push, _CRT_PACKING) #pragma warning(push, _STL_WARNING_LEVEL) @@ -30,31 +28,31 @@ namespace numbers { struct _Invalid { static_assert(_Always_false<_Ty>, "This variable template is not specialised for this type which is invalid."); }; - template + template inline constexpr _Ty e_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty log2e_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty log10e_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty pi_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty inv_pi_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty inv_sqrtpi_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty ln2_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty ln10_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty sqrt2_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty sqrt3_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty inv_sqrt3_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty egamma_v = _Invalid<_Ty>(); - template + template inline constexpr _Ty phi_v = _Invalid<_Ty>(); #ifdef __cpp_lib_concepts template From 92b26c4ed78e96d439e7202571e798e787acea5b Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Fri, 8 Nov 2019 08:02:42 +0000 Subject: [PATCH 09/13] Improve wording and formatting of _Invalid --- stl/inc/numbers | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index 7a371248a57..b4a3d4766de 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -26,34 +26,37 @@ _STD_BEGIN namespace numbers { template struct _Invalid { - static_assert(_Always_false<_Ty>, "This variable template is not specialised for this type which is 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>(); + inline constexpr _Ty e_v = _Invalid<_Ty>{}; template - inline constexpr _Ty log2e_v = _Invalid<_Ty>(); + inline constexpr _Ty log2e_v = _Invalid<_Ty>{}; template - inline constexpr _Ty log10e_v = _Invalid<_Ty>(); + inline constexpr _Ty log10e_v = _Invalid<_Ty>{}; template - inline constexpr _Ty pi_v = _Invalid<_Ty>(); + inline constexpr _Ty pi_v = _Invalid<_Ty>{}; template - inline constexpr _Ty inv_pi_v = _Invalid<_Ty>(); + inline constexpr _Ty inv_pi_v = _Invalid<_Ty>{}; template - inline constexpr _Ty inv_sqrtpi_v = _Invalid<_Ty>(); + inline constexpr _Ty inv_sqrtpi_v = _Invalid<_Ty>{}; template - inline constexpr _Ty ln2_v = _Invalid<_Ty>(); + inline constexpr _Ty ln2_v = _Invalid<_Ty>{}; template - inline constexpr _Ty ln10_v = _Invalid<_Ty>(); + inline constexpr _Ty ln10_v = _Invalid<_Ty>{}; template - inline constexpr _Ty sqrt2_v = _Invalid<_Ty>(); + inline constexpr _Ty sqrt2_v = _Invalid<_Ty>{}; template - inline constexpr _Ty sqrt3_v = _Invalid<_Ty>(); + inline constexpr _Ty sqrt3_v = _Invalid<_Ty>{}; template - inline constexpr _Ty inv_sqrt3_v = _Invalid<_Ty>(); + inline constexpr _Ty inv_sqrt3_v = _Invalid<_Ty>{}; template - inline constexpr _Ty egamma_v = _Invalid<_Ty>(); + inline constexpr _Ty egamma_v = _Invalid<_Ty>{}; template - inline constexpr _Ty phi_v = _Invalid<_Ty>(); + inline constexpr _Ty phi_v = _Invalid<_Ty>{}; + #ifdef __cpp_lib_concepts template inline constexpr _Floating e_v<_Floating> = static_cast<_Floating>(2.718281828459045); From d97ed663acdc67935c5a8925ffe2307e9d5e31ee Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Fri, 8 Nov 2019 08:08:55 +0000 Subject: [PATCH 10/13] Remove unnecessary casts --- stl/inc/numbers | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index b4a3d4766de..2baa6b320b3 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -86,31 +86,31 @@ namespace numbers { 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 = static_cast(2.718281828459045); + inline constexpr double e_v = 2.718281828459045; template <> - inline constexpr double log2e_v = static_cast(1.4426950408889634); + inline constexpr double log2e_v = 1.4426950408889634; template <> - inline constexpr double log10e_v = static_cast(0.4342944819032518); + inline constexpr double log10e_v = 0.4342944819032518; template <> - inline constexpr double pi_v = static_cast(3.141592653589793); + inline constexpr double pi_v = 3.141592653589793; template <> - inline constexpr double inv_pi_v = static_cast(0.3183098861837907); + inline constexpr double inv_pi_v = 0.3183098861837907; template <> - inline constexpr double inv_sqrtpi_v = static_cast(0.5641895835477563); + inline constexpr double inv_sqrtpi_v = 0.5641895835477563; template <> - inline constexpr double ln2_v = static_cast(0.6931471805599453); + inline constexpr double ln2_v = 0.6931471805599453; template <> - inline constexpr double ln10_v = static_cast(2.302585092994046); + inline constexpr double ln10_v = 2.302585092994046; template <> - inline constexpr double sqrt2_v = static_cast(1.4142135623730951); + inline constexpr double sqrt2_v = 1.4142135623730951; template <> - inline constexpr double sqrt3_v = static_cast(1.7320508075688772); + inline constexpr double sqrt3_v = 1.7320508075688772; template <> - inline constexpr double inv_sqrt3_v = static_cast(0.5773502691896257); + inline constexpr double inv_sqrt3_v = 0.5773502691896257; template <> - inline constexpr double egamma_v = static_cast(0.5772156649015329); + inline constexpr double egamma_v = 0.5772156649015329; template <> - inline constexpr double phi_v = static_cast(1.618033988749895); + inline constexpr double phi_v = 1.618033988749895; template <> inline constexpr float e_v = static_cast(e_v); @@ -140,31 +140,31 @@ namespace numbers { inline constexpr float phi_v = static_cast(phi_v); template <> - inline constexpr long double e_v = static_cast(e_v); + inline constexpr long double e_v = e_v; template <> - inline constexpr long double log2e_v = static_cast(log2e_v); + inline constexpr long double log2e_v = log2e_v; template <> - inline constexpr long double log10e_v = static_cast(log10e_v); + inline constexpr long double log10e_v = log10e_v; template <> - inline constexpr long double pi_v = static_cast(pi_v); + inline constexpr long double pi_v = pi_v; template <> - inline constexpr long double inv_pi_v = static_cast(inv_pi_v); + inline constexpr long double inv_pi_v = inv_pi_v; template <> - inline constexpr long double inv_sqrtpi_v = static_cast(inv_sqrtpi_v); + inline constexpr long double inv_sqrtpi_v = inv_sqrtpi_v; template <> - inline constexpr long double ln2_v = static_cast(ln2_v); + inline constexpr long double ln2_v = ln2_v; template <> - inline constexpr long double ln10_v = static_cast(ln10_v); + inline constexpr long double ln10_v = ln10_v; template <> - inline constexpr long double sqrt2_v = static_cast(sqrt2_v); + inline constexpr long double sqrt2_v = sqrt2_v; template <> - inline constexpr long double sqrt3_v = static_cast(sqrt3_v); + inline constexpr long double sqrt3_v = sqrt3_v; template <> - inline constexpr long double inv_sqrt3_v = static_cast(inv_sqrt3_v); + inline constexpr long double inv_sqrt3_v = inv_sqrt3_v; template <> - inline constexpr long double egamma_v = static_cast(egamma_v); + inline constexpr long double egamma_v = egamma_v; template <> - inline constexpr long double phi_v = static_cast(phi_v); + 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; From fa8140a2f972014687d3aed4d009e9d5b763a178 Mon Sep 17 00:00:00 2001 From: Daniel Marshall Date: Fri, 8 Nov 2019 08:10:31 +0000 Subject: [PATCH 11/13] Formatting --- stl/inc/numbers | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index 2baa6b320b3..7c489b58e0f 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -13,7 +13,7 @@ #else // ^^^ !_HAS_CXX20 / _HAS_CXX20 vvv #ifdef __cpp_lib_concepts #include -#endif +#endif // ^^^ defined(__cpp_lib_concepts) ^^^ #pragma pack(push, _CRT_PACKING) #pragma warning(push, _STL_WARNING_LEVEL) @@ -84,6 +84,7 @@ namespace numbers { 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; @@ -165,6 +166,7 @@ namespace numbers { 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; From 701da46b2818fbb1bf5fe451a934234ed808f5af Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 8 Nov 2019 19:11:45 -0800 Subject: [PATCH 12/13] Include xstddef for _Always_false. Adjust formatting. --- stl/inc/numbers | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/stl/inc/numbers b/stl/inc/numbers index 7c489b58e0f..61a8a641efd 100644 --- a/stl/inc/numbers +++ b/stl/inc/numbers @@ -13,7 +13,9 @@ #else // ^^^ !_HAS_CXX20 / _HAS_CXX20 vvv #ifdef __cpp_lib_concepts #include -#endif // ^^^ defined(__cpp_lib_concepts) ^^^ +#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) @@ -84,7 +86,6 @@ namespace numbers { 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; @@ -166,21 +167,21 @@ namespace numbers { 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; + + 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 From 48d9cad2492ce251bea854185fbfcf0844f3f52f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 8 Nov 2019 19:45:28 -0800 Subject: [PATCH 13/13] Update __msvc_all_public_headers.hpp. --- stl/inc/__msvc_all_public_headers.hpp | 1 + 1 file changed, 1 insertion(+) 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