diff --git a/.github/workflows/scripts/check_for_license.sh b/.github/workflows/scripts/check_for_license.sh
index 18298db29..e2655e58a 100755
--- a/.github/workflows/scripts/check_for_license.sh
+++ b/.github/workflows/scripts/check_for_license.sh
@@ -5,8 +5,9 @@ print_and_exit() {
exit 1
}
+EXCLUDE_DIRS="-path ./compiler/include/boost-single-header -prune -o"
-files=$(find ./compiler/{include,lib,src} -iregex '^.*\.\(cpp\|cc\|h\|hpp\)$')
+files=$(find ./compiler/{include,lib,src} $EXCLUDE_DIRS -iregex '^.*\.\(cpp\|cc\|h\|hpp\)$' -print)
for file in $files
do
diff --git a/.github/workflows/scripts/format_cpp.sh b/.github/workflows/scripts/format_cpp.sh
index 6755e396a..93b1df4c9 100755
--- a/.github/workflows/scripts/format_cpp.sh
+++ b/.github/workflows/scripts/format_cpp.sh
@@ -2,7 +2,9 @@
set -e -o pipefail
-find ./compiler/{include,lib,src} -iregex '^.*\.\(cpp\|cc\|h\|hpp\)$' | xargs clang-format -i -style='file'
+EXCLUDE_DIRS="-path ./compiler/include/boost-single-header -prune -o"
+
+find ./compiler/{include,lib,src} $EXCLUDE_DIRS -iregex '^.*\.\(cpp\|cc\|h\|hpp\)$' -print | xargs clang-format -i -style='file'
# show changes if any
git --no-pager diff
diff --git a/compiler/CMakeLists.txt b/compiler/CMakeLists.txt
index a4d794b96..2577786bb 100644
--- a/compiler/CMakeLists.txt
+++ b/compiler/CMakeLists.txt
@@ -12,6 +12,16 @@ if (APPLE)
add_definitions("-Wno-narrowing")
endif()
+add_compile_options(-Wfatal-errors) # stop at first error
+ # variable length array = vla
+if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ # using Clang
+ add_compile_options(-Wno-vla-extension)
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ # using GCC
+ add_compile_options(-Wno-vla)
+endif()
+
# If we are trying to build the compiler with LLVM/MLIR as libraries
if( NOT DEFINED LLVM_EXTERNAL_CONCRETELANG_SOURCE_DIR )
message(FATAL_ERROR "Concrete compiler requires a unified build with LLVM/MLIR")
diff --git a/compiler/Makefile b/compiler/Makefile
index 5be572c83..ec146987b 100644
--- a/compiler/Makefile
+++ b/compiler/Makefile
@@ -5,6 +5,8 @@ PARALLEL_EXECUTION_ENABLED=OFF
CC_COMPILER=
CXX_COMPILER=
+EXTERNAL_HEADERS=include/boost-single-header/outcome.hpp
+
export PATH := $(BUILD_DIR)/bin:$(PATH)
ifeq ($(shell which ccache),)
@@ -51,7 +53,10 @@ $(BUILD_DIR)/configured.stamp:
-DPython3_EXECUTABLE=${Python3_EXECUTABLE}
touch $@
-build-initialized: $(BUILD_DIR)/configured.stamp
+include/boost-single-header/outcome.hpp:
+ wget https://github.com/ned14/outcome/raw/master/single-header/outcome.hpp -O $@
+
+build-initialized: $(EXTERNAL_HEADERS) $(BUILD_DIR)/configured.stamp
doc: build-initialized
cmake --build $(BUILD_DIR) --target mlir-doc
@@ -63,6 +68,12 @@ python-bindings: build-initialized
cmake --build $(BUILD_DIR) --target ConcretelangMLIRPythonModules
cmake --build $(BUILD_DIR) --target ConcretelangPythonModules
+clientlib: build-initialized
+ cmake --build $(BUILD_DIR) --target ConcretelangClientLib
+
+serverlib: build-initialized
+ cmake --build $(BUILD_DIR) --target ConcretelangServerLib
+
test-check: concretecompiler file-check not
$(BUILD_DIR)/bin/llvm-lit -v tests/
@@ -87,6 +98,12 @@ uninstall_runtime_lib:
# unit-test
+clientlib-unit-test: build-clientlib-unit-test
+ $(BUILD_DIR)/bin/clientlib_unit_test
+
+build-clientlib-unit-test:
+ cmake --build $(BUILD_DIR) --target clientlib_unit_test
+
testlib-unit-test: build-testlib-unit-test
$(BUILD_DIR)/bin/testlib_unit_test
diff --git a/compiler/include/boost-single-header/outcome.hpp b/compiler/include/boost-single-header/outcome.hpp
new file mode 100644
index 000000000..8ca27cb99
--- /dev/null
+++ b/compiler/include/boost-single-header/outcome.hpp
@@ -0,0 +1,7939 @@
+/* Include the default amount of outcome
+(C) 2018-2021 Niall Douglas (4 commits)
+File Created: Mar 2018
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#if !OUTCOME_ENABLE_CXX_MODULES || !0 || defined(GENERATING_OUTCOME_MODULE_INTERFACE) || OUTCOME_DISABLE_CXX_MODULES
+/* Tells C++ coroutines about Outcome's result
+(C) 2019 Niall Douglas (12 commits)
+File Created: Oct 2019
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef OUTCOME_COROUTINE_SUPPORT_HPP
+#define OUTCOME_COROUTINE_SUPPORT_HPP
+/* Configure Outcome with QuickCppLib
+(C) 2015-2021 Niall Douglas (24 commits)
+File Created: August 2015
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef OUTCOME_V2_CONFIG_HPP
+#define OUTCOME_V2_CONFIG_HPP
+/* Sets Outcome version
+(C) 2017-2019 Niall Douglas (4 commits)
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+/*! AWAITING HUGO JSON CONVERSION TOOL */
+#define OUTCOME_VERSION_MAJOR 2
+/*! AWAITING HUGO JSON CONVERSION TOOL */
+#define OUTCOME_VERSION_MINOR 2
+/*! AWAITING HUGO JSON CONVERSION TOOL */
+#define OUTCOME_VERSION_PATCH 0
+/*! AWAITING HUGO JSON CONVERSION TOOL */
+#define OUTCOME_VERSION_REVISION 0 // Revision version for cmake and DLL version stamping
+/*! AWAITING HUGO JSON CONVERSION TOOL */
+#ifndef OUTCOME_DISABLE_ABI_PERMUTATION
+#define OUTCOME_UNSTABLE_VERSION
+#endif
+// Pull in detection of __MINGW64_VERSION_MAJOR
+#if defined(__MINGW32__) && !0
+#include <_mingw.h>
+#endif
+/* Configure QuickCppLib
+(C) 2016-2021 Niall Douglas (8 commits)
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef QUICKCPPLIB_CONFIG_HPP
+#define QUICKCPPLIB_CONFIG_HPP
+/* Provides SG-10 feature checking for all C++ compilers
+(C) 2014-2017 Niall Douglas (13 commits)
+File Created: Nov 2014
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef QUICKCPPLIB_HAS_FEATURE_H
+#define QUICKCPPLIB_HAS_FEATURE_H
+#if __cplusplus >= 201103
+// Some of these macros ended up getting removed by ISO standards,
+// they are prefixed with ////
+////#if !defined(__cpp_alignas)
+////#define __cpp_alignas 190000
+////#endif
+////#if !defined(__cpp_default_function_template_args)
+////#define __cpp_default_function_template_args 190000
+////#endif
+////#if !defined(__cpp_defaulted_functions)
+////#define __cpp_defaulted_functions 190000
+////#endif
+////#if !defined(__cpp_deleted_functions)
+////#define __cpp_deleted_functions 190000
+////#endif
+////#if !defined(__cpp_generalized_initializers)
+////#define __cpp_generalized_initializers 190000
+////#endif
+////#if !defined(__cpp_implicit_moves)
+////#define __cpp_implicit_moves 190000
+////#endif
+////#if !defined(__cpp_inline_namespaces)
+////#define __cpp_inline_namespaces 190000
+////#endif
+////#if !defined(__cpp_local_type_template_args)
+////#define __cpp_local_type_template_args 190000
+////#endif
+////#if !defined(__cpp_noexcept)
+////#define __cpp_noexcept 190000
+////#endif
+////#if !defined(__cpp_nonstatic_member_init)
+////#define __cpp_nonstatic_member_init 190000
+////#endif
+////#if !defined(__cpp_nullptr)
+////#define __cpp_nullptr 190000
+////#endif
+////#if !defined(__cpp_override_control)
+////#define __cpp_override_control 190000
+////#endif
+////#if !defined(__cpp_thread_local)
+////#define __cpp_thread_local 190000
+////#endif
+////#if !defined(__cpp_auto_type)
+////#define __cpp_auto_type 190000
+////#endif
+////#if !defined(__cpp_strong_enums)
+////#define __cpp_strong_enums 190000
+////#endif
+////#if !defined(__cpp_trailing_return)
+////#define __cpp_trailing_return 190000
+////#endif
+////#if !defined(__cpp_unrestricted_unions)
+////#define __cpp_unrestricted_unions 190000
+////#endif
+#if !defined(__cpp_alias_templates)
+#define __cpp_alias_templates 190000
+#endif
+#if !defined(__cpp_attributes)
+#define __cpp_attributes 190000
+#endif
+#if !defined(__cpp_constexpr)
+#if __cplusplus >= 201402
+#define __cpp_constexpr 201304 // relaxed constexpr
+#else
+#define __cpp_constexpr 190000
+#endif
+#endif
+#if !defined(__cpp_decltype)
+#define __cpp_decltype 190000
+#endif
+#if !defined(__cpp_delegating_constructors)
+#define __cpp_delegating_constructors 190000
+#endif
+#if !defined(__cpp_explicit_conversion) //// renamed from __cpp_explicit_conversions
+#define __cpp_explicit_conversion 190000
+#endif
+#if !defined(__cpp_inheriting_constructors)
+#define __cpp_inheriting_constructors 190000
+#endif
+#if !defined(__cpp_initializer_lists) //// NEW
+#define __cpp_initializer_lists 190000
+#endif
+#if !defined(__cpp_lambdas)
+#define __cpp_lambdas 190000
+#endif
+#if !defined(__cpp_nsdmi)
+#define __cpp_nsdmi 190000 //// NEW
+#endif
+#if !defined(__cpp_range_based_for) //// renamed from __cpp_range_for
+#define __cpp_range_based_for 190000
+#endif
+#if !defined(__cpp_raw_strings)
+#define __cpp_raw_strings 190000
+#endif
+#if !defined(__cpp_ref_qualifiers) //// renamed from __cpp_reference_qualified_functions
+#define __cpp_ref_qualifiers 190000
+#endif
+#if !defined(__cpp_rvalue_references)
+#define __cpp_rvalue_references 190000
+#endif
+#if !defined(__cpp_static_assert)
+#define __cpp_static_assert 190000
+#endif
+#if !defined(__cpp_unicode_characters) //// NEW
+#define __cpp_unicode_characters 190000
+#endif
+#if !defined(__cpp_unicode_literals)
+#define __cpp_unicode_literals 190000
+#endif
+#if !defined(__cpp_user_defined_literals)
+#define __cpp_user_defined_literals 190000
+#endif
+#if !defined(__cpp_variadic_templates)
+#define __cpp_variadic_templates 190000
+#endif
+#endif
+#if __cplusplus >= 201402
+// Some of these macros ended up getting removed by ISO standards,
+// they are prefixed with ////
+////#if !defined(__cpp_contextual_conversions)
+////#define __cpp_contextual_conversions 190000
+////#endif
+////#if !defined(__cpp_digit_separators)
+////#define __cpp_digit_separators 190000
+////#endif
+////#if !defined(__cpp_relaxed_constexpr)
+////#define __cpp_relaxed_constexpr 190000
+////#endif
+////#if !defined(__cpp_runtime_arrays)
+////# define __cpp_runtime_arrays 190000
+////#endif
+#if !defined(__cpp_aggregate_nsdmi)
+#define __cpp_aggregate_nsdmi 190000
+#endif
+#if !defined(__cpp_binary_literals)
+#define __cpp_binary_literals 190000
+#endif
+#if !defined(__cpp_decltype_auto)
+#define __cpp_decltype_auto 190000
+#endif
+#if !defined(__cpp_generic_lambdas)
+#define __cpp_generic_lambdas 190000
+#endif
+#if !defined(__cpp_init_captures)
+#define __cpp_init_captures 190000
+#endif
+#if !defined(__cpp_return_type_deduction)
+#define __cpp_return_type_deduction 190000
+#endif
+#if !defined(__cpp_sized_deallocation)
+#define __cpp_sized_deallocation 190000
+#endif
+#if !defined(__cpp_variable_templates)
+#define __cpp_variable_templates 190000
+#endif
+#endif
+// VS2010: _MSC_VER=1600
+// VS2012: _MSC_VER=1700
+// VS2013: _MSC_VER=1800
+// VS2015: _MSC_VER=1900
+// VS2017: _MSC_VER=1910
+#if defined(_MSC_VER) && !defined(__clang__)
+#if !defined(__cpp_exceptions) && defined(_CPPUNWIND)
+#define __cpp_exceptions 190000
+#endif
+#if !defined(__cpp_rtti) && defined(_CPPRTTI)
+#define __cpp_rtti 190000
+#endif
+// C++ 11
+#if !defined(__cpp_alias_templates) && _MSC_VER >= 1800
+#define __cpp_alias_templates 190000
+#endif
+#if !defined(__cpp_attributes)
+#define __cpp_attributes 190000
+#endif
+#if !defined(__cpp_constexpr) && _MSC_FULL_VER >= 190023506 /* VS2015 */
+#define __cpp_constexpr 190000
+#endif
+#if !defined(__cpp_decltype) && _MSC_VER >= 1600
+#define __cpp_decltype 190000
+#endif
+#if !defined(__cpp_delegating_constructors) && _MSC_VER >= 1800
+#define __cpp_delegating_constructors 190000
+#endif
+#if !defined(__cpp_explicit_conversion) && _MSC_VER >= 1800
+#define __cpp_explicit_conversion 190000
+#endif
+#if !defined(__cpp_inheriting_constructors) && _MSC_VER >= 1900
+#define __cpp_inheriting_constructors 190000
+#endif
+#if !defined(__cpp_initializer_lists) && _MSC_VER >= 1900
+#define __cpp_initializer_lists 190000
+#endif
+#if !defined(__cpp_lambdas) && _MSC_VER >= 1600
+#define __cpp_lambdas 190000
+#endif
+#if !defined(__cpp_nsdmi) && _MSC_VER >= 1900
+#define __cpp_nsdmi 190000
+#endif
+#if !defined(__cpp_range_based_for) && _MSC_VER >= 1700
+#define __cpp_range_based_for 190000
+#endif
+#if !defined(__cpp_raw_strings) && _MSC_VER >= 1800
+#define __cpp_raw_strings 190000
+#endif
+#if !defined(__cpp_ref_qualifiers) && _MSC_VER >= 1900
+#define __cpp_ref_qualifiers 190000
+#endif
+#if !defined(__cpp_rvalue_references) && _MSC_VER >= 1600
+#define __cpp_rvalue_references 190000
+#endif
+#if !defined(__cpp_static_assert) && _MSC_VER >= 1600
+#define __cpp_static_assert 190000
+#endif
+//#if !defined(__cpp_unicode_literals)
+//# define __cpp_unicode_literals 190000
+//#endif
+#if !defined(__cpp_user_defined_literals) && _MSC_VER >= 1900
+#define __cpp_user_defined_literals 190000
+#endif
+#if !defined(__cpp_variadic_templates) && _MSC_VER >= 1800
+#define __cpp_variadic_templates 190000
+#endif
+// C++ 14
+//#if !defined(__cpp_aggregate_nsdmi)
+//#define __cpp_aggregate_nsdmi 190000
+//#endif
+#if !defined(__cpp_binary_literals) && _MSC_VER >= 1900
+#define __cpp_binary_literals 190000
+#endif
+#if !defined(__cpp_decltype_auto) && _MSC_VER >= 1900
+#define __cpp_decltype_auto 190000
+#endif
+#if !defined(__cpp_generic_lambdas) && _MSC_VER >= 1900
+#define __cpp_generic_lambdas 190000
+#endif
+#if !defined(__cpp_init_captures) && _MSC_VER >= 1900
+#define __cpp_init_captures 190000
+#endif
+#if !defined(__cpp_return_type_deduction) && _MSC_VER >= 1900
+#define __cpp_return_type_deduction 190000
+#endif
+#if !defined(__cpp_sized_deallocation) && _MSC_VER >= 1900
+#define __cpp_sized_deallocation 190000
+#endif
+#if !defined(__cpp_variable_templates) && _MSC_FULL_VER >= 190023506
+#define __cpp_variable_templates 190000
+#endif
+#endif // _MSC_VER
+// Much to my surprise, GCC's support of these is actually incomplete, so fill in the gaps
+#if (defined(__GNUC__) && !defined(__clang__))
+#define QUICKCPPLIB_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#if !defined(__cpp_exceptions) && defined(__EXCEPTIONS)
+#define __cpp_exceptions 190000
+#endif
+#if !defined(__cpp_rtti) && defined(__GXX_RTTI)
+#define __cpp_rtti 190000
+#endif
+// C++ 11
+#if defined(__GXX_EXPERIMENTAL_CXX0X__)
+#if !defined(__cpp_alias_templates) && (QUICKCPPLIB_GCC >= 40700)
+#define __cpp_alias_templates 190000
+#endif
+#if !defined(__cpp_attributes) && (QUICKCPPLIB_GCC >= 40800)
+#define __cpp_attributes 190000
+#endif
+#if !defined(__cpp_constexpr) && (QUICKCPPLIB_GCC >= 40600)
+#define __cpp_constexpr 190000
+#endif
+#if !defined(__cpp_decltype) && (QUICKCPPLIB_GCC >= 40300)
+#define __cpp_decltype 190000
+#endif
+#if !defined(__cpp_delegating_constructors) && (QUICKCPPLIB_GCC >= 40700)
+#define __cpp_delegating_constructors 190000
+#endif
+#if !defined(__cpp_explicit_conversion) && (QUICKCPPLIB_GCC >= 40500)
+#define __cpp_explicit_conversion 190000
+#endif
+#if !defined(__cpp_inheriting_constructors) && (QUICKCPPLIB_GCC >= 40800)
+#define __cpp_inheriting_constructors 190000
+#endif
+#if !defined(__cpp_initializer_lists) && (QUICKCPPLIB_GCC >= 40800)
+#define __cpp_initializer_lists 190000
+#endif
+#if !defined(__cpp_lambdas) && (QUICKCPPLIB_GCC >= 40500)
+#define __cpp_lambdas 190000
+#endif
+#if !defined(__cpp_nsdmi) && (QUICKCPPLIB_GCC >= 40700)
+#define __cpp_nsdmi 190000
+#endif
+#if !defined(__cpp_range_based_for) && (QUICKCPPLIB_GCC >= 40600)
+#define __cpp_range_based_for 190000
+#endif
+#if !defined(__cpp_raw_strings) && (QUICKCPPLIB_GCC >= 40500)
+#define __cpp_raw_strings 190000
+#endif
+#if !defined(__cpp_ref_qualifiers) && (QUICKCPPLIB_GCC >= 40801)
+#define __cpp_ref_qualifiers 190000
+#endif
+// __cpp_rvalue_reference deviation
+#if !defined(__cpp_rvalue_references) && defined(__cpp_rvalue_reference)
+#define __cpp_rvalue_references __cpp_rvalue_reference
+#endif
+#if !defined(__cpp_static_assert) && (QUICKCPPLIB_GCC >= 40300)
+#define __cpp_static_assert 190000
+#endif
+#if !defined(__cpp_unicode_characters) && (QUICKCPPLIB_GCC >= 40500)
+#define __cpp_unicode_characters 190000
+#endif
+#if !defined(__cpp_unicode_literals) && (QUICKCPPLIB_GCC >= 40500)
+#define __cpp_unicode_literals 190000
+#endif
+#if !defined(__cpp_user_defined_literals) && (QUICKCPPLIB_GCC >= 40700)
+#define __cpp_user_defined_literals 190000
+#endif
+#if !defined(__cpp_variadic_templates) && (QUICKCPPLIB_GCC >= 40400)
+#define __cpp_variadic_templates 190000
+#endif
+// C++ 14
+// Every C++ 14 supporting GCC does the right thing here
+#endif // __GXX_EXPERIMENTAL_CXX0X__
+#endif // GCC
+// clang deviates in some places from the present SG-10 draft, plus older
+// clangs are quite incomplete
+#if defined(__clang__)
+#define QUICKCPPLIB_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
+#if !defined(__cpp_exceptions) && (defined(__EXCEPTIONS) || defined(_CPPUNWIND))
+#define __cpp_exceptions 190000
+#endif
+#if !defined(__cpp_rtti) && (defined(__GXX_RTTI) || defined(_CPPRTTI))
+#define __cpp_rtti 190000
+#endif
+// C++ 11
+#if defined(__GXX_EXPERIMENTAL_CXX0X__)
+#if !defined(__cpp_alias_templates) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_alias_templates 190000
+#endif
+#if !defined(__cpp_attributes) && (QUICKCPPLIB_CLANG >= 30300)
+#define __cpp_attributes 190000
+#endif
+#if !defined(__cpp_constexpr) && (QUICKCPPLIB_CLANG >= 30100)
+#define __cpp_constexpr 190000
+#endif
+#if !defined(__cpp_decltype) && (QUICKCPPLIB_CLANG >= 20900)
+#define __cpp_decltype 190000
+#endif
+#if !defined(__cpp_delegating_constructors) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_delegating_constructors 190000
+#endif
+#if !defined(__cpp_explicit_conversion) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_explicit_conversion 190000
+#endif
+#if !defined(__cpp_inheriting_constructors) && (QUICKCPPLIB_CLANG >= 30300)
+#define __cpp_inheriting_constructors 190000
+#endif
+#if !defined(__cpp_initializer_lists) && (QUICKCPPLIB_CLANG >= 30100)
+#define __cpp_initializer_lists 190000
+#endif
+#if !defined(__cpp_lambdas) && (QUICKCPPLIB_CLANG >= 30100)
+#define __cpp_lambdas 190000
+#endif
+#if !defined(__cpp_nsdmi) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_nsdmi 190000
+#endif
+#if !defined(__cpp_range_based_for) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_range_based_for 190000
+#endif
+// __cpp_raw_string_literals deviation
+#if !defined(__cpp_raw_strings) && defined(__cpp_raw_string_literals)
+#define __cpp_raw_strings __cpp_raw_string_literals
+#endif
+#if !defined(__cpp_raw_strings) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_raw_strings 190000
+#endif
+#if !defined(__cpp_ref_qualifiers) && (QUICKCPPLIB_CLANG >= 20900)
+#define __cpp_ref_qualifiers 190000
+#endif
+// __cpp_rvalue_reference deviation
+#if !defined(__cpp_rvalue_references) && defined(__cpp_rvalue_reference)
+#define __cpp_rvalue_references __cpp_rvalue_reference
+#endif
+#if !defined(__cpp_rvalue_references) && (QUICKCPPLIB_CLANG >= 20900)
+#define __cpp_rvalue_references 190000
+#endif
+#if !defined(__cpp_static_assert) && (QUICKCPPLIB_CLANG >= 20900)
+#define __cpp_static_assert 190000
+#endif
+#if !defined(__cpp_unicode_characters) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_unicode_characters 190000
+#endif
+#if !defined(__cpp_unicode_literals) && (QUICKCPPLIB_CLANG >= 30000)
+#define __cpp_unicode_literals 190000
+#endif
+// __cpp_user_literals deviation
+#if !defined(__cpp_user_defined_literals) && defined(__cpp_user_literals)
+#define __cpp_user_defined_literals __cpp_user_literals
+#endif
+#if !defined(__cpp_user_defined_literals) && (QUICKCPPLIB_CLANG >= 30100)
+#define __cpp_user_defined_literals 190000
+#endif
+#if !defined(__cpp_variadic_templates) && (QUICKCPPLIB_CLANG >= 20900)
+#define __cpp_variadic_templates 190000
+#endif
+// C++ 14
+// Every C++ 14 supporting clang does the right thing here
+#endif // __GXX_EXPERIMENTAL_CXX0X__
+#endif // clang
+#endif
+#ifndef QUICKCPPLIB_DISABLE_ABI_PERMUTATION
+// Note the second line of this file must ALWAYS be the git SHA, third line ALWAYS the git SHA update time
+#define QUICKCPPLIB_PREVIOUS_COMMIT_REF e691a6dc0358c1091d59022af06a97d68fcc074d
+#define QUICKCPPLIB_PREVIOUS_COMMIT_DATE "2021-09-15 10:28:22 +00:00"
+#define QUICKCPPLIB_PREVIOUS_COMMIT_UNIQUE e691a6dc
+#endif
+#define QUICKCPPLIB_VERSION_GLUE2(a, b) a##b
+#define QUICKCPPLIB_VERSION_GLUE(a, b) QUICKCPPLIB_VERSION_GLUE2(a, b)
+// clang-format off
+#if defined(QUICKCPPLIB_DISABLE_ABI_PERMUTATION)
+#define QUICKCPPLIB_NAMESPACE quickcpplib
+#define QUICKCPPLIB_NAMESPACE_BEGIN namespace quickcpplib {
+#define QUICKCPPLIB_NAMESPACE_END }
+#else
+#define QUICKCPPLIB_NAMESPACE quickcpplib::QUICKCPPLIB_VERSION_GLUE(_, QUICKCPPLIB_PREVIOUS_COMMIT_UNIQUE)
+#define QUICKCPPLIB_NAMESPACE_BEGIN namespace quickcpplib { namespace QUICKCPPLIB_VERSION_GLUE(_, QUICKCPPLIB_PREVIOUS_COMMIT_UNIQUE) {
+#define QUICKCPPLIB_NAMESPACE_END } }
+#endif
+// clang-format on
+#ifdef _MSC_VER
+#define QUICKCPPLIB_BIND_MESSAGE_PRAGMA2(x) __pragma(message(x))
+#define QUICKCPPLIB_BIND_MESSAGE_PRAGMA(x) QUICKCPPLIB_BIND_MESSAGE_PRAGMA2(x)
+#define QUICKCPPLIB_BIND_MESSAGE_PREFIX(type) __FILE__ "(" QUICKCPPLIB_BIND_STRINGIZE2(__LINE__) "): " type ": "
+#define QUICKCPPLIB_BIND_MESSAGE_(type, prefix, msg) QUICKCPPLIB_BIND_MESSAGE_PRAGMA(prefix msg)
+#else
+#define QUICKCPPLIB_BIND_MESSAGE_PRAGMA2(x) _Pragma(#x)
+#define QUICKCPPLIB_BIND_MESSAGE_PRAGMA(type, x) QUICKCPPLIB_BIND_MESSAGE_PRAGMA2(type x)
+#define QUICKCPPLIB_BIND_MESSAGE_(type, prefix, msg) QUICKCPPLIB_BIND_MESSAGE_PRAGMA(type, msg)
+#endif
+//! Have the compiler output a message
+#define QUICKCPPLIB_MESSAGE(msg) QUICKCPPLIB_BIND_MESSAGE_(message, QUICKCPPLIB_BIND_MESSAGE_PREFIX("message"), msg)
+//! Have the compiler output a note
+#define QUICKCPPLIB_NOTE(msg) QUICKCPPLIB_BIND_MESSAGE_(message, QUICKCPPLIB_BIND_MESSAGE_PREFIX("note"), msg)
+//! Have the compiler output a warning
+#define QUICKCPPLIB_WARNING(msg) QUICKCPPLIB_BIND_MESSAGE_(GCC warning, QUICKCPPLIB_BIND_MESSAGE_PREFIX("warning"), msg)
+//! Have the compiler output an error
+#define QUICKCPPLIB_ERROR(msg) QUICKCPPLIB_BIND_MESSAGE_(GCC error, QUICKCPPLIB_BIND_MESSAGE_PREFIX("error"), msg)
+#define QUICKCPPLIB_ANNOTATE_RWLOCK_CREATE(p)
+#define QUICKCPPLIB_ANNOTATE_RWLOCK_DESTROY(p)
+#define QUICKCPPLIB_ANNOTATE_RWLOCK_ACQUIRED(p, s)
+#define QUICKCPPLIB_ANNOTATE_RWLOCK_RELEASED(p, s)
+#define QUICKCPPLIB_ANNOTATE_IGNORE_READS_BEGIN()
+#define QUICKCPPLIB_ANNOTATE_IGNORE_READS_END()
+#define QUICKCPPLIB_ANNOTATE_IGNORE_WRITES_BEGIN()
+#define QUICKCPPLIB_ANNOTATE_IGNORE_WRITES_END()
+#define QUICKCPPLIB_DRD_IGNORE_VAR(x)
+#define QUICKCPPLIB_DRD_STOP_IGNORING_VAR(x)
+#define QUICKCPPLIB_RUNNING_ON_VALGRIND (0)
+#ifndef QUICKCPPLIB_IN_THREAD_SANITIZER
+#if defined(__has_feature)
+#if __has_feature(thread_sanitizer)
+#define QUICKCPPLIB_IN_THREAD_SANITIZER 1
+#endif
+#elif defined(__SANITIZE_THREAD__)
+#define QUICKCPPLIB_IN_THREAD_SANITIZER 1
+#endif
+#endif
+#ifndef QUICKCPPLIB_IN_THREAD_SANITIZER
+#define QUICKCPPLIB_IN_THREAD_SANITIZER 0
+#endif
+#if QUICKCPPLIB_IN_THREAD_SANITIZER
+#define QUICKCPPLIB_DISABLE_THREAD_SANITIZE __attribute__((no_sanitize_thread))
+#else
+#define QUICKCPPLIB_DISABLE_THREAD_SANITIZE
+#endif
+#ifndef QUICKCPPLIB_SMT_PAUSE
+#if !defined(__clang__) && defined(_MSC_VER) && _MSC_VER >= 1310 && (defined(_M_IX86) || defined(_M_X64))
+extern "C" void _mm_pause();
+#pragma intrinsic(_mm_pause)
+#define QUICKCPPLIB_SMT_PAUSE _mm_pause();
+#elif !defined(__c2__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+#define QUICKCPPLIB_SMT_PAUSE __asm__ __volatile__("rep; nop" : : : "memory");
+#endif
+#endif
+#ifndef QUICKCPPLIB_FORCEINLINE
+#if defined(_MSC_VER)
+#define QUICKCPPLIB_FORCEINLINE __forceinline
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_FORCEINLINE __attribute__((always_inline))
+#else
+#define QUICKCPPLIB_FORCEINLINE
+#endif
+#endif
+#ifndef QUICKCPPLIB_NOINLINE
+#if defined(_MSC_VER)
+#define QUICKCPPLIB_NOINLINE __declspec(noinline)
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_NOINLINE __attribute__((noinline))
+#else
+#define QUICKCPPLIB_NOINLINE
+#endif
+#endif
+#ifdef __has_cpp_attribute
+#define QUICKCPPLIB_HAS_CPP_ATTRIBUTE(attr) __has_cpp_attribute(attr)
+#else
+#define QUICKCPPLIB_HAS_CPP_ATTRIBUTE(attr) (0)
+#endif
+#if !defined(QUICKCPPLIB_NORETURN)
+#if QUICKCPPLIB_HAS_CPP_ATTRIBUTE(noreturn)
+#define QUICKCPPLIB_NORETURN [[noreturn]]
+#elif defined(_MSC_VER)
+#define QUICKCPPLIB_NORETURN __declspec(noreturn)
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_NORETURN __attribute__((__noreturn__))
+#else
+#define QUICKCPPLIB_NORETURN
+#endif
+#endif
+#ifndef QUICKCPPLIB_NODISCARD
+#if 0 || (_HAS_CXX17 && _MSC_VER >= 1911 /* VS2017.3 */)
+#define QUICKCPPLIB_NODISCARD [[nodiscard]]
+#endif
+#endif
+#ifndef QUICKCPPLIB_NODISCARD
+#if QUICKCPPLIB_HAS_CPP_ATTRIBUTE(nodiscard)
+#define QUICKCPPLIB_NODISCARD [[nodiscard]]
+#elif defined(__clang__) // deliberately not GCC
+#define QUICKCPPLIB_NODISCARD __attribute__((warn_unused_result))
+#elif defined(_MSC_VER)
+// _Must_inspect_result_ expands into this
+#define QUICKCPPLIB_NODISCARD __declspec("SAL_name" "(" "\"_Must_inspect_result_\"" "," "\"\"" "," "\"2\"" ")") __declspec("SAL_begin") __declspec("SAL_post") __declspec("SAL_mustInspect") __declspec("SAL_post") __declspec("SAL_checkReturn") __declspec("SAL_end")
+#endif
+#endif
+#ifndef QUICKCPPLIB_NODISCARD
+#define QUICKCPPLIB_NODISCARD
+#endif
+#ifndef QUICKCPPLIB_SYMBOL_VISIBLE
+#if defined(_MSC_VER)
+#define QUICKCPPLIB_SYMBOL_VISIBLE
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_SYMBOL_VISIBLE __attribute__((visibility("default")))
+#else
+#define QUICKCPPLIB_SYMBOL_VISIBLE
+#endif
+#endif
+#ifndef QUICKCPPLIB_SYMBOL_EXPORT
+#if defined(_MSC_VER)
+#define QUICKCPPLIB_SYMBOL_EXPORT __declspec(dllexport)
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_SYMBOL_EXPORT __attribute__((visibility("default")))
+#else
+#define QUICKCPPLIB_SYMBOL_EXPORT
+#endif
+#endif
+#ifndef QUICKCPPLIB_SYMBOL_IMPORT
+#if defined(_MSC_VER)
+#define QUICKCPPLIB_SYMBOL_IMPORT __declspec(dllimport)
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_SYMBOL_IMPORT
+#else
+#define QUICKCPPLIB_SYMBOL_IMPORT
+#endif
+#endif
+#ifndef QUICKCPPLIB_THREAD_LOCAL
+#if _MSC_VER >= 1800
+#define QUICKCPPLIB_THREAD_LOCAL_IS_CXX11 1
+#elif __cplusplus >= 201103
+#if __GNUC__ >= 5 && !defined(__clang__)
+#define QUICKCPPLIB_THREAD_LOCAL_IS_CXX11 1
+#elif defined(__has_feature)
+#if __has_feature(cxx_thread_local)
+#define QUICKCPPLIB_THREAD_LOCAL_IS_CXX11 1
+#endif
+#endif
+#endif
+#ifdef QUICKCPPLIB_THREAD_LOCAL_IS_CXX11
+#define QUICKCPPLIB_THREAD_LOCAL thread_local
+#endif
+#ifndef QUICKCPPLIB_THREAD_LOCAL
+#if defined(_MSC_VER)
+#define QUICKCPPLIB_THREAD_LOCAL __declspec(thread)
+#elif defined(__GNUC__)
+#define QUICKCPPLIB_THREAD_LOCAL __thread
+#else
+#error Unknown compiler, cannot set QUICKCPPLIB_THREAD_LOCAL
+#endif
+#endif
+#endif
+/* MSVC capable preprocessor macro overloading
+(C) 2014-2017 Niall Douglas (3 commits)
+File Created: Aug 2014
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef QUICKCPPLIB_PREPROCESSOR_MACRO_OVERLOAD_H
+#define QUICKCPPLIB_PREPROCESSOR_MACRO_OVERLOAD_H
+#define QUICKCPPLIB_GLUE(x, y) x y
+#define QUICKCPPLIB_RETURN_ARG_COUNT(_1_, _2_, _3_, _4_, _5_, _6_, _7_, _8_, count, ...) count
+#define QUICKCPPLIB_EXPAND_ARGS(args) QUICKCPPLIB_RETURN_ARG_COUNT args
+#define QUICKCPPLIB_COUNT_ARGS_MAX8(...) QUICKCPPLIB_EXPAND_ARGS((__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0))
+#define QUICKCPPLIB_OVERLOAD_MACRO2(name, count) name##count
+#define QUICKCPPLIB_OVERLOAD_MACRO1(name, count) QUICKCPPLIB_OVERLOAD_MACRO2(name, count)
+#define QUICKCPPLIB_OVERLOAD_MACRO(name, count) QUICKCPPLIB_OVERLOAD_MACRO1(name, count)
+#define QUICKCPPLIB_CALL_OVERLOAD(name, ...) QUICKCPPLIB_GLUE(QUICKCPPLIB_OVERLOAD_MACRO(name, QUICKCPPLIB_COUNT_ARGS_MAX8(__VA_ARGS__)), (__VA_ARGS__))
+#define QUICKCPPLIB_GLUE_(x, y) x y
+#define QUICKCPPLIB_RETURN_ARG_COUNT_(_1_, _2_, _3_, _4_, _5_, _6_, _7_, _8_, count, ...) count
+#define QUICKCPPLIB_EXPAND_ARGS_(args) QUICKCPPLIB_RETURN_ARG_COUNT_ args
+#define QUICKCPPLIB_COUNT_ARGS_MAX8_(...) QUICKCPPLIB_EXPAND_ARGS_((__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0))
+#define QUICKCPPLIB_OVERLOAD_MACRO2_(name, count) name##count
+#define QUICKCPPLIB_OVERLOAD_MACRO1_(name, count) QUICKCPPLIB_OVERLOAD_MACRO2_(name, count)
+#define QUICKCPPLIB_OVERLOAD_MACRO_(name, count) QUICKCPPLIB_OVERLOAD_MACRO1_(name, count)
+#define QUICKCPPLIB_CALL_OVERLOAD_(name, ...) QUICKCPPLIB_GLUE_(QUICKCPPLIB_OVERLOAD_MACRO_(name, QUICKCPPLIB_COUNT_ARGS_MAX8_(__VA_ARGS__)), (__VA_ARGS__))
+#endif
+#if defined(__cpp_concepts) && !defined(QUICKCPPLIB_DISABLE_CONCEPTS_SUPPORT)
+#define QUICKCPPLIB_TREQUIRES_EXPAND8(a, b, c, d, e, f, g, h) a &&QUICKCPPLIB_TREQUIRES_EXPAND7(b, c, d, e, f, g, h)
+#define QUICKCPPLIB_TREQUIRES_EXPAND7(a, b, c, d, e, f, g) a &&QUICKCPPLIB_TREQUIRES_EXPAND6(b, c, d, e, f, g)
+#define QUICKCPPLIB_TREQUIRES_EXPAND6(a, b, c, d, e, f) a &&QUICKCPPLIB_TREQUIRES_EXPAND5(b, c, d, e, f)
+#define QUICKCPPLIB_TREQUIRES_EXPAND5(a, b, c, d, e) a &&QUICKCPPLIB_TREQUIRES_EXPAND4(b, c, d, e)
+#define QUICKCPPLIB_TREQUIRES_EXPAND4(a, b, c, d) a &&QUICKCPPLIB_TREQUIRES_EXPAND3(b, c, d)
+#define QUICKCPPLIB_TREQUIRES_EXPAND3(a, b, c) a &&QUICKCPPLIB_TREQUIRES_EXPAND2(b, c)
+#define QUICKCPPLIB_TREQUIRES_EXPAND2(a, b) a &&QUICKCPPLIB_TREQUIRES_EXPAND1(b)
+#define QUICKCPPLIB_TREQUIRES_EXPAND1(a) a
+//! Expands into a && b && c && ...
+#define QUICKCPPLIB_TREQUIRES(...) requires QUICKCPPLIB_CALL_OVERLOAD(QUICKCPPLIB_TREQUIRES_EXPAND, __VA_ARGS__)
+#define QUICKCPPLIB_TEMPLATE(...) template <__VA_ARGS__>
+#define QUICKCPPLIB_TEXPR(...) requires { (__VA_ARGS__); }
+#define QUICKCPPLIB_TPRED(...) (__VA_ARGS__)
+#if !defined(_MSC_VER) || _MSC_FULL_VER >= 192400000 // VS 2019 16.3 is broken here
+#define QUICKCPPLIB_REQUIRES(...) requires(__VA_ARGS__)
+#else
+#define QUICKCPPLIB_REQUIRES(...)
+#endif
+#else
+#define QUICKCPPLIB_TEMPLATE(...) template <__VA_ARGS__
+#define QUICKCPPLIB_TREQUIRES(...) , __VA_ARGS__ >
+#define QUICKCPPLIB_TEXPR(...) typename = decltype(__VA_ARGS__)
+#ifdef _MSC_VER
+// MSVC gives an error if every specialisation of a template is always ill-formed, so
+// the more powerful SFINAE form below causes pukeage :(
+#define QUICKCPPLIB_TPRED(...) typename = typename std::enable_if<(__VA_ARGS__)>::type
+#else
+#define QUICKCPPLIB_TPRED(...) typename std::enable_if<(__VA_ARGS__), bool>::type = true
+#endif
+#define QUICKCPPLIB_REQUIRES(...)
+#endif
+#endif
+#ifndef __cpp_variadic_templates
+#error Outcome needs variadic template support in the compiler
+#endif
+#if __cpp_constexpr < 201304 && _MSC_FULL_VER < 191100000
+#error Outcome needs constexpr (C++ 14) support in the compiler
+#endif
+#ifndef __cpp_variable_templates
+#error Outcome needs variable template support in the compiler
+#endif
+#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 6
+#error Due to a bug in nested template variables parsing, Outcome does not work on GCCs earlier than v6.
+#endif
+#ifndef OUTCOME_SYMBOL_VISIBLE
+#define OUTCOME_SYMBOL_VISIBLE QUICKCPPLIB_SYMBOL_VISIBLE
+#endif
+#ifndef OUTCOME_FORCEINLINE
+#define OUTCOME_FORCEINLINE QUICKCPPLIB_FORCEINLINE
+#endif
+#ifndef OUTCOME_NODISCARD
+#define OUTCOME_NODISCARD QUICKCPPLIB_NODISCARD
+#endif
+#ifndef OUTCOME_THREAD_LOCAL
+#define OUTCOME_THREAD_LOCAL QUICKCPPLIB_THREAD_LOCAL
+#endif
+#ifndef OUTCOME_TEMPLATE
+#define OUTCOME_TEMPLATE(...) QUICKCPPLIB_TEMPLATE(__VA_ARGS__)
+#endif
+#ifndef OUTCOME_TREQUIRES
+#define OUTCOME_TREQUIRES(...) QUICKCPPLIB_TREQUIRES(__VA_ARGS__)
+#endif
+#ifndef OUTCOME_TEXPR
+#define OUTCOME_TEXPR(...) QUICKCPPLIB_TEXPR(__VA_ARGS__)
+#endif
+#ifndef OUTCOME_TPRED
+#define OUTCOME_TPRED(...) QUICKCPPLIB_TPRED(__VA_ARGS__)
+#endif
+#ifndef OUTCOME_REQUIRES
+#define OUTCOME_REQUIRES(...) QUICKCPPLIB_REQUIRES(__VA_ARGS__)
+#endif
+/* Convenience macros for importing local namespace binds
+(C) 2014-2017 Niall Douglas (9 commits)
+File Created: Aug 2014
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef QUICKCPPLIB_BIND_IMPORT_HPP
+#define QUICKCPPLIB_BIND_IMPORT_HPP
+/* 2014-10-9 ned: I lost today figuring out the below. I really hate the C preprocessor now.
+ *
+ * Anyway, infinity = 8. It's easy to expand below if needed.
+ */
+#define QUICKCPPLIB_BIND_STRINGIZE(a) #a
+#define QUICKCPPLIB_BIND_STRINGIZE2(a) QUICKCPPLIB_BIND_STRINGIZE(a)
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION8(a, b, c, d, e, f, g, h) a##_##b##_##c##_##d##_##e##_##f##_##g##_##h
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION7(a, b, c, d, e, f, g) a##_##b##_##c##_##d##_##e##_##f##_##g
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION6(a, b, c, d, e, f) a##_##b##_##c##_##d##_##e##_##f
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION5(a, b, c, d, e) a##_##b##_##c##_##d##_##e
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION4(a, b, c, d) a##_##b##_##c##_##d
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION3(a, b, c) a##_##b##_##c
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION2(a, b) a##_##b
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION1(a) a
+//! Concatenates each parameter with _
+#define QUICKCPPLIB_BIND_NAMESPACE_VERSION(...) QUICKCPPLIB_CALL_OVERLOAD(QUICKCPPLIB_BIND_NAMESPACE_VERSION, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_SELECT_2(name, modifier) name
+#define QUICKCPPLIB_BIND_NAMESPACE_SELECT2(name, modifier) ::name
+#define QUICKCPPLIB_BIND_NAMESPACE_SELECT_1(name) name
+#define QUICKCPPLIB_BIND_NAMESPACE_SELECT1(name) ::name
+#define QUICKCPPLIB_BIND_NAMESPACE_SELECT_(...) QUICKCPPLIB_CALL_OVERLOAD_(QUICKCPPLIB_BIND_NAMESPACE_SELECT_, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_SELECT(...) QUICKCPPLIB_CALL_OVERLOAD_(QUICKCPPLIB_BIND_NAMESPACE_SELECT, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND8(a, b, c, d, e, f, g, h) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b QUICKCPPLIB_BIND_NAMESPACE_SELECT c QUICKCPPLIB_BIND_NAMESPACE_SELECT d QUICKCPPLIB_BIND_NAMESPACE_SELECT e QUICKCPPLIB_BIND_NAMESPACE_SELECT f QUICKCPPLIB_BIND_NAMESPACE_SELECT g QUICKCPPLIB_BIND_NAMESPACE_SELECT h
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND7(a, b, c, d, e, f, g) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b QUICKCPPLIB_BIND_NAMESPACE_SELECT c QUICKCPPLIB_BIND_NAMESPACE_SELECT d QUICKCPPLIB_BIND_NAMESPACE_SELECT e QUICKCPPLIB_BIND_NAMESPACE_SELECT f QUICKCPPLIB_BIND_NAMESPACE_SELECT g
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND6(a, b, c, d, e, f) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b QUICKCPPLIB_BIND_NAMESPACE_SELECT c QUICKCPPLIB_BIND_NAMESPACE_SELECT d QUICKCPPLIB_BIND_NAMESPACE_SELECT e QUICKCPPLIB_BIND_NAMESPACE_SELECT f
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND5(a, b, c, d, e) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b QUICKCPPLIB_BIND_NAMESPACE_SELECT c QUICKCPPLIB_BIND_NAMESPACE_SELECT d QUICKCPPLIB_BIND_NAMESPACE_SELECT e
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND4(a, b, c, d) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b QUICKCPPLIB_BIND_NAMESPACE_SELECT c QUICKCPPLIB_BIND_NAMESPACE_SELECT d
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND3(a, b, c) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b QUICKCPPLIB_BIND_NAMESPACE_SELECT c
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND2(a, b) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a QUICKCPPLIB_BIND_NAMESPACE_SELECT b
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPAND1(a) QUICKCPPLIB_BIND_NAMESPACE_SELECT_ a
+//! Expands into a::b::c:: ...
+#define QUICKCPPLIB_BIND_NAMESPACE(...) QUICKCPPLIB_CALL_OVERLOAD(QUICKCPPLIB_BIND_NAMESPACE_EXPAND, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT2(name, modifier) modifier namespace name {
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT1(name) namespace name {
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT(...) QUICKCPPLIB_CALL_OVERLOAD_(QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND8(a, b, c, d, e, f, g, h) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND7(b, c, d, e, f, g, h)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND7(a, b, c, d, e, f, g) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND6(b, c, d, e, f, g)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND6(a, b, c, d, e, f) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND5(b, c, d, e, f)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND5(a, b, c, d, e) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND4(b, c, d, e)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND4(a, b, c, d) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND3(b, c, d)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND3(a, b, c) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND2(b, c)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND2(a, b) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND1(b)
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND1(a) QUICKCPPLIB_BIND_NAMESPACE_BEGIN_NAMESPACE_SELECT a
+//! Expands into namespace a { namespace b { namespace c ...
+#define QUICKCPPLIB_BIND_NAMESPACE_BEGIN(...) QUICKCPPLIB_CALL_OVERLOAD(QUICKCPPLIB_BIND_NAMESPACE_BEGIN_EXPAND, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT2(name, modifier) modifier namespace name {
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT1(name) export namespace name {
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT(...) QUICKCPPLIB_CALL_OVERLOAD_(QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND8(a, b, c, d, e, f, g, h) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND7(b, c, d, e, f, g, h)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND7(a, b, c, d, e, f, g) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND6(b, c, d, e, f, g)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND6(a, b, c, d, e, f) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND5(b, c, d, e, f)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND5(a, b, c, d, e) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND4(b, c, d, e)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND4(a, b, c, d) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND3(b, c, d)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND3(a, b, c) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND2(b, c)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND2(a, b) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND1(b)
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND1(a) QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_NAMESPACE_SELECT a
+//! Expands into export namespace a { namespace b { namespace c ...
+#define QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN(...) QUICKCPPLIB_CALL_OVERLOAD(QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN_EXPAND, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT2(name, modifier) }
+#define QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT1(name) }
+#define QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT(...) QUICKCPPLIB_CALL_OVERLOAD_(QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT, __VA_ARGS__)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND8(a, b, c, d, e, f, g, h) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND7(b, c, d, e, f, g, h)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND7(a, b, c, d, e, f, g) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND6(b, c, d, e, f, g)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND6(a, b, c, d, e, f) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND5(b, c, d, e, f)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND5(a, b, c, d, e) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND4(b, c, d, e)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND4(a, b, c, d) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND3(b, c, d)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND3(a, b, c) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND2(b, c)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND2(a, b) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND1(b)
+#define QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND1(a) QUICKCPPLIB_BIND_NAMESPACE_END_NAMESPACE_SELECT a
+//! Expands into } } ...
+#define QUICKCPPLIB_BIND_NAMESPACE_END(...) QUICKCPPLIB_CALL_OVERLOAD(QUICKCPPLIB_BIND_NAMESPACE_END_EXPAND, __VA_ARGS__)
+//! Expands into a static const char string array used to mark BindLib compatible namespaces
+#define QUICKCPPLIB_BIND_DECLARE(decl, desc) static const char *quickcpplib_out[] = {#decl, desc};
+#endif
+#ifndef OUTCOME_ENABLE_LEGACY_SUPPORT_FOR
+#define OUTCOME_ENABLE_LEGACY_SUPPORT_FOR 220 // the v2.2 Outcome release
+#endif
+#if defined(OUTCOME_UNSTABLE_VERSION)
+/* UPDATED BY SCRIPT
+(C) 2017-2019 Niall Douglas (225 commits)
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License in the accompanying file
+Licence.txt or at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file Licence.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+*/
+// Note the second line of this file must ALWAYS be the git SHA, third line ALWAYS the git SHA update time
+#define OUTCOME_PREVIOUS_COMMIT_REF e261cebddfd2d5d1229dbf66c6dc0091a9f2a6f8
+#define OUTCOME_PREVIOUS_COMMIT_DATE "2021-10-26 10:23:56 +00:00"
+#define OUTCOME_PREVIOUS_COMMIT_UNIQUE e261cebd
+#define OUTCOME_V2 (QUICKCPPLIB_BIND_NAMESPACE_VERSION(outcome_v2, OUTCOME_PREVIOUS_COMMIT_UNIQUE))
+#ifdef _DEBUG
+#define OUTCOME_V2_CXX_MODULE_NAME QUICKCPPLIB_BIND_NAMESPACE((QUICKCPPLIB_BIND_NAMESPACE_VERSION(outcome_v2d, OUTCOME_PREVIOUS_COMMIT_UNIQUE)))
+#else
+#define OUTCOME_V2_CXX_MODULE_NAME QUICKCPPLIB_BIND_NAMESPACE((QUICKCPPLIB_BIND_NAMESPACE_VERSION(outcome_v2, OUTCOME_PREVIOUS_COMMIT_UNIQUE)))
+#endif
+#else
+#define OUTCOME_V2 (QUICKCPPLIB_BIND_NAMESPACE_VERSION(outcome_v2))
+#ifdef _DEBUG
+#define OUTCOME_V2_CXX_MODULE_NAME QUICKCPPLIB_BIND_NAMESPACE((QUICKCPPLIB_BIND_NAMESPACE_VERSION(outcome_v2d)))
+#else
+#define OUTCOME_V2_CXX_MODULE_NAME QUICKCPPLIB_BIND_NAMESPACE((QUICKCPPLIB_BIND_NAMESPACE_VERSION(outcome_v2)))
+#endif
+#endif
+#if defined(GENERATING_OUTCOME_MODULE_INTERFACE)
+#define OUTCOME_V2_NAMESPACE QUICKCPPLIB_BIND_NAMESPACE(OUTCOME_V2)
+#define OUTCOME_V2_NAMESPACE_BEGIN QUICKCPPLIB_BIND_NAMESPACE_BEGIN(OUTCOME_V2)
+#define OUTCOME_V2_NAMESPACE_EXPORT_BEGIN QUICKCPPLIB_BIND_NAMESPACE_EXPORT_BEGIN(OUTCOME_V2)
+#define OUTCOME_V2_NAMESPACE_END QUICKCPPLIB_BIND_NAMESPACE_END(OUTCOME_V2)
+#else
+#define OUTCOME_V2_NAMESPACE QUICKCPPLIB_BIND_NAMESPACE(OUTCOME_V2)
+#define OUTCOME_V2_NAMESPACE_BEGIN QUICKCPPLIB_BIND_NAMESPACE_BEGIN(OUTCOME_V2)
+#define OUTCOME_V2_NAMESPACE_EXPORT_BEGIN QUICKCPPLIB_BIND_NAMESPACE_BEGIN(OUTCOME_V2)
+#define OUTCOME_V2_NAMESPACE_END QUICKCPPLIB_BIND_NAMESPACE_END(OUTCOME_V2)
+#endif
+#include // for uint32_t etc
+#include
+#include // for future serialisation
+#include // for placement in moves etc
+#include
+#ifndef OUTCOME_USE_STD_IN_PLACE_TYPE
+#if defined(_MSC_VER) && _HAS_CXX17
+#define OUTCOME_USE_STD_IN_PLACE_TYPE 1 // MSVC always has std::in_place_type
+#elif __cplusplus >= 201700
+// libstdc++ before GCC 6 doesn't have it, despite claiming C++ 17 support
+#ifdef __has_include
+#if !__has_include()
+#define OUTCOME_USE_STD_IN_PLACE_TYPE 0 // must have it if is present
+#endif
+#endif
+#ifndef OUTCOME_USE_STD_IN_PLACE_TYPE
+#define OUTCOME_USE_STD_IN_PLACE_TYPE 1
+#endif
+#else
+#define OUTCOME_USE_STD_IN_PLACE_TYPE 0
+#endif
+#endif
+#if OUTCOME_USE_STD_IN_PLACE_TYPE
+#include // for in_place_type_t
+OUTCOME_V2_NAMESPACE_BEGIN
+template using in_place_type_t = std::in_place_type_t;
+using std::in_place_type;
+OUTCOME_V2_NAMESPACE_END
+#else
+OUTCOME_V2_NAMESPACE_BEGIN
+/*! AWAITING HUGO JSON CONVERSION TOOL
+type definition template in_place_type_t. Potential doc page: `in_place_type_t`
+*/
+template struct in_place_type_t
+{
+ explicit in_place_type_t() = default;
+};
+/*! AWAITING HUGO JSON CONVERSION TOOL
+SIGNATURE NOT RECOGNISED
+*/
+template constexpr in_place_type_t in_place_type{};
+OUTCOME_V2_NAMESPACE_END
+#endif
+#ifndef OUTCOME_TRIVIAL_ABI
+#if 0 || __clang_major__ >= 7
+//! Defined to be `[[clang::trivial_abi]]` when on a new enough clang compiler. Usually automatic, can be overriden.
+#define OUTCOME_TRIVIAL_ABI [[clang::trivial_abi]]
+#else
+#define OUTCOME_TRIVIAL_ABI
+#endif
+#endif
+OUTCOME_V2_NAMESPACE_BEGIN
+namespace detail
+{
+ // Test if type is an in_place_type_t
+ template struct is_in_place_type_t
+ {
+ static constexpr bool value = false;
+ };
+ template struct is_in_place_type_t>
+ {
+ static constexpr bool value = true;
+ };
+ // Replace void with constructible void_type
+ struct empty_type
+ {
+ };
+ struct void_type
+ {
+ // We always compare true to another instance of me
+ constexpr bool operator==(void_type /*unused*/) const noexcept { return true; }
+ constexpr bool operator!=(void_type /*unused*/) const noexcept { return false; }
+ };
+ template using devoid = std::conditional_t::value, void_type, T>;
+ template using rebind_type5 = Output;
+ template
+ using rebind_type4 = std::conditional_t< //
+ std::is_volatile::value, //
+ std::add_volatile_t>>, //
+ rebind_type5