From d0cfd73fab6707763682059eb862908e9f8dc847 Mon Sep 17 00:00:00 2001 From: Alexander Shaduri Date: Thu, 7 Mar 2024 14:39:08 +0400 Subject: [PATCH] Removed leaf, porting to std::expected. --- dependencies/CMakeLists.txt | 1 - dependencies/leaf/CMakeLists.txt | 20 - dependencies/leaf/LICENSE_1_0.txt | 23 - dependencies/leaf/convenience/leaf_ns.h | 18 - dependencies/leaf/standalone/leaf.hpp | 5545 --------------------- dependencies/leaf/version.txt | 4 - src/CMakeLists.txt | 1 - src/applib/CMakeLists.txt | 1 - src/applib/smartctl_parser.cpp | 6 +- src/applib/smartctl_parser.h | 4 +- src/applib/storage_device.cpp | 28 +- src/applib/tests/test_smartctl_parser.cpp | 9 +- src/test_helpers/CMakeLists.txt | 21 - src/test_helpers/test_helpers.h | 50 - 14 files changed, 20 insertions(+), 5711 deletions(-) delete mode 100644 dependencies/leaf/CMakeLists.txt delete mode 100644 dependencies/leaf/LICENSE_1_0.txt delete mode 100644 dependencies/leaf/convenience/leaf_ns.h delete mode 100644 dependencies/leaf/standalone/leaf.hpp delete mode 100644 dependencies/leaf/version.txt delete mode 100644 src/test_helpers/CMakeLists.txt delete mode 100644 src/test_helpers/test_helpers.h diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt index cabb4558..93c1fc32 100644 --- a/dependencies/CMakeLists.txt +++ b/dependencies/CMakeLists.txt @@ -77,6 +77,5 @@ find_package(Gettext REQUIRED) add_subdirectory(catch2) -add_subdirectory(leaf) add_subdirectory(nlohmann_json) add_subdirectory(whereami) diff --git a/dependencies/leaf/CMakeLists.txt b/dependencies/leaf/CMakeLists.txt deleted file mode 100644 index 703a9e57..00000000 --- a/dependencies/leaf/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################### -# License: BSD Zero Clause License file -# Copyright: -# (C) 2022 Alexander Shaduri -############################################################################### - -add_library(boost_leaf INTERFACE) - -# Relative sources are allowed only since cmake 3.13. -target_sources(boost_leaf INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR}/standalone/leaf.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/convenience/leaf_ns.h -) - -target_include_directories(boost_leaf - SYSTEM INTERFACE - "${CMAKE_SOURCE_DIR}/dependencies/leaf/standalone" - "${CMAKE_SOURCE_DIR}/dependencies/leaf/convenience" -) - diff --git a/dependencies/leaf/LICENSE_1_0.txt b/dependencies/leaf/LICENSE_1_0.txt deleted file mode 100644 index 36b7cd93..00000000 --- a/dependencies/leaf/LICENSE_1_0.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/dependencies/leaf/convenience/leaf_ns.h b/dependencies/leaf/convenience/leaf_ns.h deleted file mode 100644 index 80771cad..00000000 --- a/dependencies/leaf/convenience/leaf_ns.h +++ /dev/null @@ -1,18 +0,0 @@ -/****************************************************************************** -License: GNU General Public License v3.0 only -Copyright: - (C) 2022 Alexander Shaduri -******************************************************************************/ -#ifndef APP_LEAF_NS_H -#define APP_LEAF_NS_H - -#include "../standalone/leaf.hpp" - - -/// Use leaf:: instead of boost::leaf for convenience -namespace leaf = boost::leaf; - - -#endif - -/// @} diff --git a/dependencies/leaf/standalone/leaf.hpp b/dependencies/leaf/standalone/leaf.hpp deleted file mode 100644 index 67ade3fc..00000000 --- a/dependencies/leaf/standalone/leaf.hpp +++ /dev/null @@ -1,5545 +0,0 @@ -#ifndef BOOST_LEAF_HPP_INCLUDED -#define BOOST_LEAF_HPP_INCLUDED - -// LEAF single header distribution. Do not edit. - -// Generated on 02/01/2022 from https://github.com/boostorg/leaf/tree/e9eb512. -// Latest version of this file: https://raw.githubusercontent.com/boostorg/leaf/gh-pages/leaf.hpp. - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// >>> #include -#line 1 "boost/leaf/config.hpp" -#ifndef BOOST_LEAF_CONFIG_HPP_INCLUDED -#define BOOST_LEAF_CONFIG_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// The following is based in part on Boost Config. - -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Martin Wille 2003. -// (C) Copyright Guillaume Melquiond 2003. - -#ifndef BOOST_LEAF_ASSERT -# include -# define BOOST_LEAF_ASSERT assert -#endif - -//////////////////////////////////////// - -#ifdef BOOST_LEAF_DIAGNOSTICS -# warning BOOST_LEAF_DIAGNOSTICS has been renamed to BOOST_LEAF_CFG_DIAGNOSTICS. -# define BOOST_LEAF_CFG_DIAGNOSTICS BOOST_LEAF_DIAGNOSTICS -#endif - -//////////////////////////////////////// - -#ifdef BOOST_LEAF_TLS_FREERTOS - -# ifndef BOOST_LEAF_EMBEDDED -# define BOOST_LEAF_EMBEDDED -# endif - -#endif - -//////////////////////////////////////// - -#ifdef BOOST_LEAF_EMBEDDED - -# ifndef BOOST_LEAF_CFG_DIAGNOSTICS -# define BOOST_LEAF_CFG_DIAGNOSTICS 0 -# endif - -# ifndef BOOST_LEAF_CFG_STD_SYSTEM_ERROR -# define BOOST_LEAF_CFG_STD_SYSTEM_ERROR 0 -# endif - -# ifndef BOOST_LEAF_CFG_STD_STRING -# define BOOST_LEAF_CFG_STD_STRING 0 -# endif - -# ifndef BOOST_LEAF_CFG_CAPTURE -# define BOOST_LEAF_CFG_CAPTURE 0 -# endif - -#endif - -//////////////////////////////////////// - -#ifndef BOOST_LEAF_CFG_DIAGNOSTICS -# define BOOST_LEAF_CFG_DIAGNOSTICS 1 -#endif - -#ifndef BOOST_LEAF_CFG_STD_SYSTEM_ERROR -# define BOOST_LEAF_CFG_STD_SYSTEM_ERROR 1 -#endif - -#ifndef BOOST_LEAF_CFG_STD_STRING -# define BOOST_LEAF_CFG_STD_STRING 1 -#endif - -#ifndef BOOST_LEAF_CFG_CAPTURE -# define BOOST_LEAF_CFG_CAPTURE 1 -#endif - -#ifndef BOOST_LEAF_CFG_WIN32 -# define BOOST_LEAF_CFG_WIN32 0 -#endif - -#ifndef BOOST_LEAF_CFG_GNUC_STMTEXPR -# ifdef __GNUC__ -# define BOOST_LEAF_CFG_GNUC_STMTEXPR 1 -# else -# define BOOST_LEAF_CFG_GNUC_STMTEXPR 0 -# endif -#endif - -#if BOOST_LEAF_CFG_DIAGNOSTICS!=0 && BOOST_LEAF_CFG_DIAGNOSTICS!=1 -# error BOOST_LEAF_CFG_DIAGNOSTICS must be 0 or 1. -#endif - -#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR!=0 && BOOST_LEAF_CFG_STD_SYSTEM_ERROR!=1 -# error BOOST_LEAF_CFG_STD_SYSTEM_ERROR must be 0 or 1. -#endif - -#if BOOST_LEAF_CFG_STD_STRING!=0 && BOOST_LEAF_CFG_STD_STRING!=1 -# error BOOST_LEAF_CFG_STD_STRING must be 0 or 1. -#endif - -#if BOOST_LEAF_CFG_CAPTURE!=0 && BOOST_LEAF_CFG_CAPTURE!=1 -# error BOOST_LEAF_CFG_CAPTURE must be 0 or 1. -#endif - -#if BOOST_LEAF_CFG_DIAGNOSTICS && !BOOST_LEAF_CFG_STD_STRING -# error BOOST_LEAF_CFG_DIAGNOSTICS requires the use of std::string -#endif - -#if BOOST_LEAF_CFG_WIN32!=0 && BOOST_LEAF_CFG_WIN32!=1 -# error BOOST_LEAF_CFG_WIN32 must be 0 or 1. -#endif - -#if BOOST_LEAF_CFG_GNUC_STMTEXPR!=0 && BOOST_LEAF_CFG_GNUC_STMTEXPR!=1 -# error BOOST_LEAF_CFG_GNUC_STMTEXPR must be 0 or 1. -#endif - -//////////////////////////////////////// - -// Configure BOOST_LEAF_NO_EXCEPTIONS, unless already #defined -#ifndef BOOST_LEAF_NO_EXCEPTIONS - -# if defined(__clang__) && !defined(__ibmxl__) -// Clang C++ emulates GCC, so it has to appear early. - -# if !__has_feature(cxx_exceptions) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__DMC__) -// Digital Mars C++ - -# if !defined(_CPPUNWIND) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__GNUC__) && !defined(__ibmxl__) -// GNU C++: - -# if !defined(__EXCEPTIONS) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__KCC) -// Kai C++ - -# if !defined(_EXCEPTIONS) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__CODEGEARC__) -// CodeGear - must be checked for before Borland - -# if !defined(_CPPUNWIND) && !defined(__EXCEPTIONS) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__BORLANDC__) -// Borland - -# if !defined(_CPPUNWIND) && !defined(__EXCEPTIONS) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__MWERKS__) -// Metrowerks CodeWarrior - -# if !__option(exceptions) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__IBMCPP__) && defined(__COMPILER_VER__) && defined(__MVS__) -// IBM z/OS XL C/C++ - -# if !defined(_CPPUNWIND) && !defined(__EXCEPTIONS) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(__ibmxl__) -// IBM XL C/C++ for Linux (Little Endian) - -# if !__has_feature(cxx_exceptions) -# define BOOST_LEAF_NO_EXCEPTIONS -# endif - -# elif defined(_MSC_VER) -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for -// example) also #define _MSC_VER - -# if !_CPPUNWIND -# define BOOST_LEAF_NO_EXCEPTIONS -# endif -# endif - -#endif - -#ifdef BOOST_NORETURN -# define BOOST_LEAF_NORETURN BOOST_NORETURN -#else -# if defined(_MSC_VER) -# define BOOST_LEAF_NORETURN __declspec(noreturn) -# elif defined(__GNUC__) -# define BOOST_LEAF_NORETURN __attribute__ ((__noreturn__)) -# elif defined(__has_attribute) && defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x5130) -# if __has_attribute(noreturn) -# define BOOST_LEAF_NORETURN [[noreturn]] -# endif -# elif defined(__has_cpp_attribute) -# if __has_cpp_attribute(noreturn) -# define BOOST_LEAF_NORETURN [[noreturn]] -# endif -# endif -#endif -#if !defined(BOOST_LEAF_NORETURN) -# define BOOST_LEAF_NORETURN -#endif - -//////////////////////////////////////// - -#ifdef _MSC_VER -# define BOOST_LEAF_ALWAYS_INLINE __forceinline -#else -# define BOOST_LEAF_ALWAYS_INLINE __attribute__((always_inline)) inline -#endif - -//////////////////////////////////////// - -#ifndef BOOST_LEAF_NODISCARD -# if __cplusplus >= 201703L -# define BOOST_LEAF_NODISCARD [[nodiscard]] -# else -# define BOOST_LEAF_NODISCARD -# endif -#endif - -//////////////////////////////////////// - -#ifndef BOOST_LEAF_CONSTEXPR -# if __cplusplus > 201402L -# define BOOST_LEAF_CONSTEXPR constexpr -# else -# define BOOST_LEAF_CONSTEXPR -# endif -#endif - -//////////////////////////////////////// - -#ifndef BOOST_LEAF_NO_EXCEPTIONS -# include -# if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L) || (defined(_MSC_VER) && _MSC_VER >= 1900) -# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 1 -# else -# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 0 -# endif -#endif - -//////////////////////////////////////// - -#ifdef __GNUC__ -# define BOOST_LEAF_SYMBOL_VISIBLE __attribute__((__visibility__("default"))) -#else -# define BOOST_LEAF_SYMBOL_VISIBLE -#endif - -//////////////////////////////////////// - -#if defined(__GNUC__) && !(defined(__clang__) || defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) && (__GNUC__ * 100 + __GNUC_MINOR__) < 409 -# ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS -# define BOOST_LEAF_NO_CXX11_REF_QUALIFIERS -# endif -#endif - -//////////////////////////////////////// - -// Configure TLS access -// >>> #include -#line 1 "boost/leaf/config/tls.hpp" -#ifndef BOOST_LEAF_CONFIG_TLS_HPP_INCLUDED -#define BOOST_LEAF_CONFIG_TLS_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#if defined(BOOST_LEAF_TLS_FREERTOS) -// >>> # include -#line 1 "boost/leaf/config/tls_freertos.hpp" -#ifndef BOOST_LEAF_CONFIG_TLS_FREERTOS_HPP_INCLUDED -#define BOOST_LEAF_CONFIG_TLS_FREERTOS_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. -// Copyright (c) 2022 Khalil Estell - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#include - -#ifndef BOOST_LEAF_TLS_ARRAY -# define BOOST_LEAF_TLS_ARRAY -#endif - -#ifndef BOOST_LEAF_TLS_INDEX_TYPE -# define BOOST_LEAF_TLS_INDEX_TYPE BaseType_t -#endif - -#ifndef BOOST_LEAF_TLS_ARRAY_SIZE -# define BOOST_LEAF_TLS_ARRAY_SIZE configNUM_THREAD_LOCAL_STORAGE_POINTERS -#endif - -static_assert(BOOST_LEAF_TLS_ARRAY_SIZE <= configNUM_THREAD_LOCAL_STORAGE_POINTERS, "Invalid BOOST_LEAF_TLS_ARRAY_SIZE"); - -namespace boost { namespace leaf { - -namespace tls -{ - // See https://www.freertos.org/thread-local-storage-pointers.html. - - inline void * read_void_ptr( int tls_index ) noexcept - { - return pvTaskGetThreadLocalStoragePointer(0, tls_index); - } - - inline void write_void_ptr( int tls_index, void * p ) noexcept - { - vTaskSetThreadLocalStoragePointer(0, tls_index, p); - } -} - -} } - -#endif -// <<< # include -#line 11 "boost/leaf/config/tls.hpp" -#endif - -#if defined BOOST_LEAF_TLS_ARRAY -// >>> # include -#line 1 "boost/leaf/config/tls_array.hpp" -#ifndef BOOST_LEAF_CONFIG_TLS_ARRAY_HPP_INCLUDED -#define BOOST_LEAF_CONFIG_TLS_ARRAY_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. -// Copyright (c) 2022 Khalil Estell - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// LEAF requires thread local storage support for pointers and for uin32_t values. - -// This header implements thread local storage for pointers and for uint32_t -// values for platforms that support thread local pointers by index. - -//////////////////////////////////////// - -#ifndef BOOST_LEAF_TLS_INDEX_TYPE -# define BOOST_LEAF_TLS_INDEX_TYPE int -#endif - -#ifndef BOOST_LEAF_TLS_ARRAY_START_INDEX -# define BOOST_LEAF_TLS_ARRAY_START_INDEX 0 -#endif - -static_assert(BOOST_LEAF_TLS_ARRAY_START_INDEX >= 0, - "Bad BOOST_LEAF_TLS_ARRAY_START_INDEX"); - -#ifdef BOOST_LEAF_TLS_ARRAY_SIZE -static_assert(BOOST_LEAF_TLS_ARRAY_SIZE > 0, - "Bad BOOST_LEAF_TLS_ARRAY_SIZE"); -static_assert(BOOST_LEAF_TLS_ARRAY_START_INDEX < BOOST_LEAF_TLS_ARRAY_SIZE, - "Bad BOOST_LEAF_TLS_ARRAY_START_INDEX"); -#endif - -#include -#include - -//////////////////////////////////////// - -namespace boost { namespace leaf { - -namespace tls -{ - // The TLS support defined in this header requires the following two - // functions to be defined elsewhere: - void * read_void_ptr( int tls_index ) noexcept; - void write_void_ptr( int tls_index, void * ) noexcept; -} - -} } - -//////////////////////////////////////// - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - using atomic_unsigned_int = std::atomic; -} - -namespace tls -{ - template - class BOOST_LEAF_SYMBOL_VISIBLE index_counter - { - static BOOST_LEAF_TLS_INDEX_TYPE c; - - public: - - template - static BOOST_LEAF_TLS_INDEX_TYPE get_index() noexcept - { - BOOST_LEAF_TLS_INDEX_TYPE idx = c++; -#ifdef BOOST_LEAF_TLS_ARRAY_SIZE - BOOST_LEAF_ASSERT(idx < BOOST_LEAF_TLS_ARRAY_SIZE); -#endif - // Set breakpoint here to inspect TLS index assignment. - return idx; - } - }; - - template - BOOST_LEAF_TLS_INDEX_TYPE index_counter::c = BOOST_LEAF_TLS_ARRAY_START_INDEX; - - template - struct BOOST_LEAF_SYMBOL_VISIBLE index - { - static BOOST_LEAF_TLS_INDEX_TYPE const idx; - }; - - template - BOOST_LEAF_TLS_INDEX_TYPE const index::idx = index_counter<>::get_index(); - - //////////////////////////////////////// - - template - T * read_ptr() noexcept - { - int const tls_index = index::idx; - BOOST_LEAF_ASSERT(tls_index >= BOOST_LEAF_TLS_ARRAY_START_INDEX); -#ifdef BOOST_LEAF_TLS_ARRAY_SIZE - BOOST_LEAF_ASSERT(tls_index < BOOST_LEAF_TLS_ARRAY_SIZE); -#endif - return reinterpret_cast(read_void_ptr(tls_index)); - } - - template - void write_ptr( T * p ) noexcept - { - int const tls_index = index::idx; - BOOST_LEAF_ASSERT(tls_index >= BOOST_LEAF_TLS_ARRAY_START_INDEX); -#ifdef BOOST_LEAF_TLS_ARRAY_SIZE - BOOST_LEAF_ASSERT(tls_index < BOOST_LEAF_TLS_ARRAY_SIZE); -#endif - write_void_ptr(tls_index, p); - BOOST_LEAF_ASSERT(read_void_ptr(tls_index) == p); - } - - //////////////////////////////////////// - - template - std::uint32_t read_uint32() noexcept - { - static_assert(sizeof(std::intptr_t) >= sizeof(std::uint32_t), "Incompatible tls_array implementation"); - return (std::uint32_t) (std::intptr_t) (void *) read_ptr(); - } - - template - void write_uint32( std::uint32_t x ) noexcept - { - static_assert(sizeof(std::intptr_t) >= sizeof(std::uint32_t), "Incompatible tls_array implementation"); - write_ptr((Tag *) (void *) (std::intptr_t) x); - } - - template - void uint32_increment() noexcept - { - write_uint32(read_uint32() + 1); - } - - template - void uint32_decrement() noexcept - { - write_uint32(read_uint32() - 1); - } -} - -} } - -#endif -// <<< # include -#line 15 "boost/leaf/config/tls.hpp" -#elif defined(BOOST_LEAF_NO_THREADS) -// >>> # include -#line 1 "boost/leaf/config/tls_globals.hpp" -#ifndef BOOST_LEAF_CONFIG_TLS_GLOBALS_HPP_INCLUDED -#define BOOST_LEAF_CONFIG_TLS_GLOBALS_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// LEAF requires thread local storage support for pointers and for uin32_t values. - -// This header implements "thread local" storage for pointers and for uint32_t -// values using globals, which is suitable for single thread environments. - -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - using atomic_unsigned_int = unsigned int; -} - -namespace tls -{ - template - struct BOOST_LEAF_SYMBOL_VISIBLE ptr - { - static T * p; - }; - - template - T * ptr::p; - - template - T * read_ptr() noexcept - { - return ptr::p; - } - - template - void write_ptr( T * p ) noexcept - { - ptr::p = p; - } - - //////////////////////////////////////// - - template - struct BOOST_LEAF_SYMBOL_VISIBLE tagged_uint32 - { - static std::uint32_t x; - }; - - template - std::uint32_t tagged_uint32::x; - - template - std::uint32_t read_uint32() noexcept - { - return tagged_uint32::x; - } - - template - void write_uint32( std::uint32_t x ) noexcept - { - tagged_uint32::x = x; - } - - template - void uint32_increment() noexcept - { - ++tagged_uint32::x; - } - - template - void uint32_decrement() noexcept - { - --tagged_uint32::x; - } -} - -} } - -#endif -// <<< # include -#line 17 "boost/leaf/config/tls.hpp" -#else -// >>> # include -#line 1 "boost/leaf/config/tls_cpp11.hpp" -#ifndef BOOST_LEAF_CONFIG_TLS_CPP11_HPP_INCLUDED -#define BOOST_LEAF_CONFIG_TLS_CPP11_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// LEAF requires thread local storage support for pointers and for uin32_t values. - -// This header implements thread local storage for pointers and for uint32_t -// values using the C++11 built-in thread_local storage class specifier. - -#include -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - using atomic_unsigned_int = std::atomic; -} - -namespace tls -{ - template - struct BOOST_LEAF_SYMBOL_VISIBLE ptr - { - static thread_local T * p; - }; - - template - thread_local T * ptr::p; - - template - T * read_ptr() noexcept - { - return ptr::p; - } - - template - void write_ptr( T * p ) noexcept - { - ptr::p = p; - } - - //////////////////////////////////////// - - template - struct BOOST_LEAF_SYMBOL_VISIBLE tagged_uint32 - { - static thread_local std::uint32_t x; - }; - - template - thread_local std::uint32_t tagged_uint32::x; - - template - std::uint32_t read_uint32() noexcept - { - return tagged_uint32::x; - } - - template - void write_uint32( std::uint32_t x ) noexcept - { - tagged_uint32::x = x; - } - - template - void uint32_increment() noexcept - { - ++tagged_uint32::x; - } - - template - void uint32_decrement() noexcept - { - --tagged_uint32::x; - } -} - -} } - -#endif -// <<< # include -#line 19 "boost/leaf/config/tls.hpp" -#endif - -#endif -// <<< #include -#line 278 "boost/leaf/config.hpp" - -//////////////////////////////////////// - -#endif -// >>> #include -#line 1 "boost/leaf/capture.hpp" -#ifndef BOOST_LEAF_CAPTURE_HPP_INCLUDED -#define BOOST_LEAF_CAPTURE_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// >>> #include -#line 1 "boost/leaf/exception.hpp" -#ifndef BOOST_LEAF_EXCEPTION_HPP_INCLUDED -#define BOOST_LEAF_EXCEPTION_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// >>> #include -#line 1 "boost/leaf/error.hpp" -#ifndef BOOST_LEAF_ERROR_HPP_INCLUDED -#define BOOST_LEAF_ERROR_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// >>> #include -#line 1 "boost/leaf/detail/optional.hpp" -#ifndef BOOST_LEAF_DETAIL_OPTIONAL_HPP_INCLUDED -#define BOOST_LEAF_DETAIL_OPTIONAL_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include - -#include -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - template - class optional - { - int key_; - union { T value_; }; - - public: - - typedef T value_type; - - BOOST_LEAF_CONSTEXPR optional() noexcept: - key_(0) - { - } - - BOOST_LEAF_CONSTEXPR optional( optional const & x ): - key_(x.key_) - { - if( x.key_ ) - (void) new (&value_) T( x.value_ ); - } - - BOOST_LEAF_CONSTEXPR optional( optional && x ) noexcept: - key_(x.key_) - { - if( x.key_ ) - { - (void) new (&value_) T( std::move(x.value_) ); - x.reset(); - } - } - - BOOST_LEAF_CONSTEXPR optional( int key, T const & v ): - key_(key), - value_(v) - { - BOOST_LEAF_ASSERT(!empty()); - } - - BOOST_LEAF_CONSTEXPR optional( int key, T && v ) noexcept: - key_(key), - value_(std::move(v)) - { - BOOST_LEAF_ASSERT(!empty()); - } - - BOOST_LEAF_CONSTEXPR optional & operator=( optional const & x ) - { - reset(); - if( int key = x.key() ) - { - put(key, x.value_); - key_ = key; - } - return *this; - } - - BOOST_LEAF_CONSTEXPR optional & operator=( optional && x ) noexcept - { - reset(); - if( int key = x.key() ) - { - put(key, std::move(x.value_)); - x.reset(); - } - return *this; - } - - ~optional() noexcept - { - reset(); - } - - BOOST_LEAF_CONSTEXPR bool empty() const noexcept - { - return key_==0; - } - - BOOST_LEAF_CONSTEXPR int key() const noexcept - { - return key_; - } - - BOOST_LEAF_CONSTEXPR void reset() noexcept - { - if( key_ ) - { - value_.~T(); - key_=0; - } - } - - BOOST_LEAF_CONSTEXPR T & put( int key, T const & v ) - { - BOOST_LEAF_ASSERT(key); - reset(); - (void) new(&value_) T(v); - key_=key; - return value_; - } - - BOOST_LEAF_CONSTEXPR T & put( int key, T && v ) noexcept - { - BOOST_LEAF_ASSERT(key); - reset(); - (void) new(&value_) T(std::move(v)); - key_=key; - return value_; - } - - BOOST_LEAF_CONSTEXPR T const * has_value(int key) const noexcept - { - BOOST_LEAF_ASSERT(key); - return key_==key ? &value_ : 0; - } - - BOOST_LEAF_CONSTEXPR T * has_value(int key) noexcept - { - BOOST_LEAF_ASSERT(key); - return key_==key ? &value_ : 0; - } - - BOOST_LEAF_CONSTEXPR T const & value(int key) const & noexcept - { - BOOST_LEAF_ASSERT(has_value(key) != 0); - return value_; - } - - BOOST_LEAF_CONSTEXPR T & value(int key) & noexcept - { - BOOST_LEAF_ASSERT(has_value(key) != 0); - return value_; - } - - BOOST_LEAF_CONSTEXPR T const && value(int key) const && noexcept - { - BOOST_LEAF_ASSERT(has_value(key) != 0); - return value_; - } - - BOOST_LEAF_CONSTEXPR T value(int key) && noexcept - { - BOOST_LEAF_ASSERT(has_value(key) != 0); - T tmp(std::move(value_)); - reset(); - return tmp; - } - }; - -} - -} } - -#endif -// <<< #include -#line 11 "boost/leaf/error.hpp" -// >>> #include -#line 1 "boost/leaf/detail/demangle.hpp" -#ifndef BOOST_LEAF_DETAIL_DEMANGLE_HPP_INCLUDED -#define BOOST_LEAF_DETAIL_DEMANGLE_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// This file is based on boost::core::demangle -// -// Copyright 2014 Peter Dimov -// Copyright 2014 Andrey Semashev -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt - -// Expanded at line 16: #include - -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - template - BOOST_LEAF_CONSTEXPR inline char const * check_prefix( char const * t, char const (&prefix)[N] ) - { - return std::strncmp(t,prefix,sizeof(prefix)-1)==0 ? t+sizeof(prefix)-1 : t; - } -} - -template -inline char const * type() -{ - using leaf_detail::check_prefix; -char const * t = -#ifdef __FUNCSIG__ - __FUNCSIG__; -#else - __PRETTY_FUNCTION__; -#endif -#if defined(__clang__) - BOOST_LEAF_ASSERT(check_prefix(t,"const char *boost::leaf::type() ")==t+32); - return t+32; -#elif defined(__GNUC__) - BOOST_LEAF_ASSERT(check_prefix(t,"const char* boost::leaf::type() ")==t+32); - return t+32; -#else - char const * clang_style = check_prefix(t,"const char *boost::leaf::type() "); - if( clang_style!=t ) - return clang_style; - char const * gcc_style = check_prefix(t,"const char* boost::leaf::type() "); - if( gcc_style!=t ) - return gcc_style; -#endif - return t; -} - -} } - -//////////////////////////////////////// - -// __has_include is currently supported by GCC and Clang. However GCC 4.9 may have issues and -// returns 1 for 'defined( __has_include )', while '__has_include' is actually not supported: -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63662 -#if defined(__has_include) && (!defined(__GNUC__) || defined(__clang__) || (__GNUC__ + 0) >= 5) -# if __has_include() -# define BOOST_LEAF_HAS_CXXABI_H -# endif -#elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ ) -# define BOOST_LEAF_HAS_CXXABI_H -#endif - -#if defined( BOOST_LEAF_HAS_CXXABI_H ) -# include -// For some archtectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library -// (https://android.googlesource.com/platform/ndk/+/master/sources/cxx-stl/gabi++/), which does not implement -// abi::__cxa_demangle(). We detect this implementation by checking the include guard here. -# if defined( __GABIXX_CXXABI_H__ ) -# undef BOOST_LEAF_HAS_CXXABI_H -# else -# include -# include -# endif -#endif - -#if BOOST_LEAF_CFG_STD_STRING - -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - inline char const * demangle_alloc( char const * name ) noexcept; - inline void demangle_free( char const * name ) noexcept; - - class scoped_demangled_name - { - private: - - char const * m_p; - - public: - - explicit scoped_demangled_name( char const * name ) noexcept : - m_p( demangle_alloc( name ) ) - { - } - - ~scoped_demangled_name() noexcept - { - demangle_free( m_p ); - } - - char const * get() const noexcept - { - return m_p; - } - - scoped_demangled_name( scoped_demangled_name const& ) = delete; - scoped_demangled_name& operator= ( scoped_demangled_name const& ) = delete; - }; - -#ifdef BOOST_LEAF_HAS_CXXABI_H - - inline char const * demangle_alloc( char const * name ) noexcept - { - int status = 0; - std::size_t size = 0; - return abi::__cxa_demangle( name, NULL, &size, &status ); - } - - inline void demangle_free( char const * name ) noexcept - { - std::free( const_cast< char* >( name ) ); - } - - inline std::string demangle( char const * name ) - { - scoped_demangled_name demangled_name( name ); - char const * p = demangled_name.get(); - if( !p ) - p = name; - return p; - } - -#else - - inline char const * demangle_alloc( char const * name ) noexcept - { - return name; - } - - inline void demangle_free( char const * ) noexcept - { - } - - inline char const * demangle( char const * name ) - { - return name; - } - -#endif -} - -} } - -#else - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - inline char const * demangle( char const * name ) - { - return name; - } -} - -} } - -#endif - -#ifdef BOOST_LEAF_HAS_CXXABI_H -# undef BOOST_LEAF_HAS_CXXABI_H -#endif - -#endif -// <<< #include -#line 12 "boost/leaf/error.hpp" -// >>> #include -#line 1 "boost/leaf/detail/function_traits.hpp" -#ifndef BOOST_LEAF_DETAIL_FUNCTION_TRAITS_HPP_INCLUDED -#define BOOST_LEAF_DETAIL_FUNCTION_TRAITS_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// >>> #include -#line 1 "boost/leaf/detail/mp11.hpp" -#ifndef BOOST_LEAF_DETAIL_MP11_HPP_INCLUDED -#define BOOST_LEAF_DETAIL_MP11_HPP_INCLUDED - -// Copyright 2015-2017 Peter Dimov. -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. -// -// Distributed under the Boost Software License, Version 1.0. -// -// See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt - -#include -#include - -namespace boost { namespace leaf { namespace leaf_detail_mp11 { - -// mp_list -template struct mp_list -{ -}; - -// mp_identity -template struct mp_identity -{ - using type = T; -}; - -// mp_inherit -template struct mp_inherit: T... {}; - -// mp_if, mp_if_c -namespace detail -{ - -template struct mp_if_c_impl -{ -}; - -template struct mp_if_c_impl -{ - using type = T; -}; - -template struct mp_if_c_impl -{ - using type = E; -}; - -} // namespace detail - -template using mp_if_c = typename detail::mp_if_c_impl::type; -template using mp_if = typename detail::mp_if_c_impl(C::value), T, E...>::type; - -// mp_bool -template using mp_bool = std::integral_constant; - -using mp_true = mp_bool; -using mp_false = mp_bool; - -// mp_to_bool -template using mp_to_bool = mp_bool( T::value )>; - -// mp_not -template using mp_not = mp_bool< !T::value >; - -// mp_int -template using mp_int = std::integral_constant; - -// mp_size_t -template using mp_size_t = std::integral_constant; - -// mp_set_contains -namespace detail -{ - -template struct mp_set_contains_impl; - -template class L, class... T, class V> struct mp_set_contains_impl, V> -{ - using type = mp_to_bool, mp_inherit...> > >; -}; - -} // namespace detail - -template using mp_set_contains = typename detail::mp_set_contains_impl::type; - -// mp_set_push_back -namespace detail -{ - -template struct mp_set_push_back_impl; - -template class L, class... U> struct mp_set_push_back_impl> -{ - using type = L; -}; - -template class L, class... U, class T1, class... T> struct mp_set_push_back_impl, T1, T...> -{ - using S = mp_if, T1>, L, L>; - using type = typename mp_set_push_back_impl::type; -}; - -} // namespace detail - -template using mp_set_push_back = typename detail::mp_set_push_back_impl::type; - -// mp_unique -namespace detail -{ - -template struct mp_unique_impl; - -template class L, class... T> struct mp_unique_impl> -{ - using type = mp_set_push_back, T...>; -}; - -} // namespace detail - -template using mp_unique = typename detail::mp_unique_impl::type; - -// mp_append - -namespace detail -{ - -template struct mp_append_impl; - -template<> struct mp_append_impl<> -{ - using type = mp_list<>; -}; - -template class L, class... T> struct mp_append_impl> -{ - using type = L; -}; - -template class L1, class... T1, template class L2, class... T2, class... Lr> struct mp_append_impl, L2, Lr...> -{ - using type = typename mp_append_impl, Lr...>::type; -}; - -} - -template using mp_append = typename detail::mp_append_impl::type; - -// mp_front -namespace detail -{ - -template struct mp_front_impl -{ -// An error "no type named 'type'" here means that the argument to mp_front -// is either not a list, or is an empty list -}; - -template class L, class T1, class... T> struct mp_front_impl> -{ - using type = T1; -}; - -} // namespace detail - -template using mp_front = typename detail::mp_front_impl::type; - -// mp_pop_front -namespace detail -{ - -template struct mp_pop_front_impl -{ -// An error "no type named 'type'" here means that the argument to mp_pop_front -// is either not a list, or is an empty list -}; - -template class L, class T1, class... T> struct mp_pop_front_impl> -{ - using type = L; -}; - -} // namespace detail - -template using mp_pop_front = typename detail::mp_pop_front_impl::type; - -// mp_first -template using mp_first = mp_front; - -// mp_rest -template using mp_rest = mp_pop_front; - -// mp_remove_if -namespace detail -{ - -template class P> struct mp_remove_if_impl; - -template class L, class... T, template class P> struct mp_remove_if_impl, P> -{ - template using _f = mp_if, mp_list<>, mp_list>; - using type = mp_append, _f...>; -}; - -} // namespace detail - -template class P> using mp_remove_if = typename detail::mp_remove_if_impl::type; - -// integer_sequence -template struct integer_sequence -{ -}; - -// detail::make_integer_sequence_impl -namespace detail -{ - -// iseq_if_c -template struct iseq_if_c_impl; - -template struct iseq_if_c_impl -{ - using type = T; -}; - -template struct iseq_if_c_impl -{ - using type = E; -}; - -template using iseq_if_c = typename iseq_if_c_impl::type; - -// iseq_identity -template struct iseq_identity -{ - using type = T; -}; - -template struct append_integer_sequence; - -template struct append_integer_sequence, integer_sequence> -{ - using type = integer_sequence< T, I..., ( J + sizeof...(I) )... >; -}; - -template struct make_integer_sequence_impl; - -template struct make_integer_sequence_impl_ -{ -private: - - static_assert( N >= 0, "make_integer_sequence: N must not be negative" ); - - static T const M = N / 2; - static T const R = N % 2; - - using S1 = typename make_integer_sequence_impl::type; - using S2 = typename append_integer_sequence::type; - using S3 = typename make_integer_sequence_impl::type; - using S4 = typename append_integer_sequence::type; - -public: - - using type = S4; -}; - -template struct make_integer_sequence_impl: iseq_if_c>, iseq_if_c>, make_integer_sequence_impl_ > > -{ -}; - -} // namespace detail - -// make_integer_sequence -template using make_integer_sequence = typename detail::make_integer_sequence_impl::type; - -// index_sequence -template using index_sequence = integer_sequence; - -// make_index_sequence -template using make_index_sequence = make_integer_sequence; - -// index_sequence_for -template using index_sequence_for = make_integer_sequence; - -// implementation by Bruno Dutra (by the name is_evaluable) -namespace detail -{ - -template class F, class... T> struct mp_valid_impl -{ - template class G, class = G> static mp_true check(int); - template class> static mp_false check(...); - - using type = decltype(check(0)); -}; - -} // namespace detail - -template class F, class... T> using mp_valid = typename detail::mp_valid_impl::type; - -} } } - -#endif -// <<< #include -#line 10 "boost/leaf/detail/function_traits.hpp" - -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - template struct remove_noexcept { using type = T; }; - template struct remove_noexcept { using type = R(*)(A...); }; - template struct remove_noexcept { using type = R(C::*)(A...); }; - template struct remove_noexcept { using type = R(C::*)(A...) const; }; - - template - struct gcc49_workaround //Thanks Glen Fernandes - { - using type = void; - }; - - template - using void_t = typename gcc49_workaround::type; - - template - struct function_traits_impl - { - constexpr static int arity = -1; - }; - - template - struct function_traits_impl> - { - private: - - using tr = function_traits_impl::type>; - - public: - - using return_type = typename tr::return_type; - static constexpr int arity = tr::arity - 1; - - using mp_args = typename leaf_detail_mp11::mp_rest; - - template - struct arg: - tr::template arg - { - }; - }; - - template - struct function_traits_impl - { - using return_type = R; - static constexpr int arity = sizeof...(A); - - using mp_args = leaf_detail_mp11::mp_list; - - template - struct arg - { - static_assert(I < arity, "I out of range"); - using type = typename std::tuple_element>::type; - }; - }; - - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - template struct function_traits_impl : function_traits_impl { }; - - template - struct function_traits: function_traits_impl::type> - { - }; - - template - using fn_return_type = typename function_traits::return_type; - - template - using fn_arg_type = typename function_traits::template arg::type; - - template - using fn_mp_args = typename function_traits::mp_args; -} - -} } - -#endif -// <<< #include -#line 13 "boost/leaf/error.hpp" -// >>> #include -#line 1 "boost/leaf/detail/print.hpp" -#ifndef BOOST_LEAF_DETAIL_PRINT_HPP_INCLUDED -#define BOOST_LEAF_DETAIL_PRINT_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// Expanded at line 907: #include - -#if BOOST_LEAF_CFG_DIAGNOSTICS - -#include -#include -#include -#include - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - template - struct is_printable: std::false_type - { - }; - - template - struct is_printable()<(), void())>: std::true_type - { - }; - - //////////////////////////////////////// - - template - struct has_printable_member_value: std::false_type - { - }; - - template - struct has_printable_member_value()<().value, void())>: std::true_type - { - }; - - //////////////////////////////////////// - - template < - class Wrapper, - bool WrapperPrintable = is_printable::value, - bool ValuePrintable = has_printable_member_value::value, - bool IsException = std::is_base_of::value, - bool IsEnum = std::is_enum::value> - struct diagnostic; - - template - struct diagnostic - { - static constexpr bool is_invisible = false; - - template - static void print( std::basic_ostream & os, Wrapper const & x ) - { - os << x; - } - }; - - template - struct diagnostic - { - static constexpr bool is_invisible = false; - - template - static void print( std::basic_ostream & os, Wrapper const & x ) - { - os << type() << ": " << x.value; - } - }; - - template - struct diagnostic - { - static constexpr bool is_invisible = false; - - template - static void print( std::basic_ostream & os, Wrapper const & ex ) - { - os << type() << ": std::exception::what(): " << ex.what(); - } - }; - - template - struct diagnostic - { - static constexpr bool is_invisible = false; - - template - static void print( std::basic_ostream & os, Wrapper const & ) - { - os << type() << ": {Non-Printable}"; - } - }; - - template - struct diagnostic - { - static constexpr bool is_invisible = false; - - template - static void print( std::basic_ostream & os, Wrapper const & w ) - { - os << type() << ": " << static_cast::type>(w); - } - }; - - template <> - struct diagnostic - { - static constexpr bool is_invisible = true; - - template - BOOST_LEAF_CONSTEXPR static void print( std::basic_ostream &, std::exception_ptr const & ) - { - } - }; -} - -} } - -#endif - -#endif -// <<< #include -#line 14 "boost/leaf/error.hpp" - -#include -#include - -#if BOOST_LEAF_CFG_DIAGNOSTICS -# include -# include -# include -#endif - -#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR -# include -#endif - -#if BOOST_LEAF_CFG_CAPTURE -# include -#endif - -#define BOOST_LEAF_TOKEN_PASTE(x, y) x ## y -#define BOOST_LEAF_TOKEN_PASTE2(x, y) BOOST_LEAF_TOKEN_PASTE(x, y) -#define BOOST_LEAF_TMP BOOST_LEAF_TOKEN_PASTE2(boost_leaf_tmp_, __LINE__) - -#define BOOST_LEAF_ASSIGN(v,r)\ - auto && BOOST_LEAF_TMP = r;\ - static_assert(::boost::leaf::is_result_type::type>::value,\ - "BOOST_LEAF_ASSIGN/BOOST_LEAF_AUTO requires a result object as the second argument (see is_result_type)");\ - if( !BOOST_LEAF_TMP )\ - return BOOST_LEAF_TMP.error();\ - v = std::forward(BOOST_LEAF_TMP).value() - -#define BOOST_LEAF_AUTO(v, r)\ - BOOST_LEAF_ASSIGN(auto v, r) - -#if BOOST_LEAF_CFG_GNUC_STMTEXPR - -#define BOOST_LEAF_CHECK(r)\ - ({\ - auto && BOOST_LEAF_TMP = (r);\ - static_assert(::boost::leaf::is_result_type::type>::value,\ - "BOOST_LEAF_CHECK requires a result object (see is_result_type)");\ - if( !BOOST_LEAF_TMP )\ - return BOOST_LEAF_TMP.error();\ - std::move(BOOST_LEAF_TMP);\ - }).value() - -#else - -#define BOOST_LEAF_CHECK(r)\ - {\ - auto && BOOST_LEAF_TMP = (r);\ - static_assert(::boost::leaf::is_result_type::type>::value,\ - "BOOST_LEAF_CHECK requires a result object (see is_result_type)");\ - if( !BOOST_LEAF_TMP )\ - return BOOST_LEAF_TMP.error();\ - } - -#endif - -#define BOOST_LEAF_NEW_ERROR ::boost::leaf::leaf_detail::inject_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::new_error - -namespace boost { namespace leaf { - -class error_id; - -namespace leaf_detail -{ - struct BOOST_LEAF_SYMBOL_VISIBLE tls_tag_unexpected_enabled_counter; - struct BOOST_LEAF_SYMBOL_VISIBLE tls_tag_id_factory_current_id; - - struct inject_loc - { - char const * const file; - int const line; - char const * const fn; - - template - friend T operator+( inject_loc loc, T && x ) noexcept - { - x.load_source_location_(loc.file, loc.line, loc.fn); - return std::move(x); - } - }; -} - -} } - -//////////////////////////////////////// - -#ifdef BOOST_LEAF_NO_EXCEPTIONS - -namespace boost -{ -BOOST_LEAF_NORETURN void throw_exception( std::exception const & ); // user defined -} - -namespace boost { namespace leaf { - -template -BOOST_LEAF_NORETURN void throw_exception( T const & e ) -{ - ::boost::throw_exception(e); -} - -} } - -#else - -namespace boost { namespace leaf { - -template -BOOST_LEAF_NORETURN void throw_exception( T const & e ) -{ - throw e; -} - -} } - -#endif - -//////////////////////////////////////// - -namespace boost { namespace leaf { - -#if BOOST_LEAF_CFG_DIAGNOSTICS - -namespace leaf_detail -{ - class BOOST_LEAF_SYMBOL_VISIBLE e_unexpected_count - { - public: - - char const * (*first_type)(); - int count; - - BOOST_LEAF_CONSTEXPR explicit e_unexpected_count(char const * (*first_type)()) noexcept: - first_type(first_type), - count(1) - { - } - - template - void print( std::basic_ostream & os ) const - { - BOOST_LEAF_ASSERT(first_type != 0); - BOOST_LEAF_ASSERT(count>0); - os << "Detected "; - if( count==1 ) - os << "1 attempt to communicate an unexpected error object"; - else - os << count << " attempts to communicate unexpected error objects, the first one"; - (os << " of type " << first_type() << '\n').flush(); - } - }; - - template <> - struct diagnostic - { - static constexpr bool is_invisible = true; - - template - BOOST_LEAF_CONSTEXPR static void print( std::basic_ostream &, e_unexpected_count const &) noexcept { } - }; - - class BOOST_LEAF_SYMBOL_VISIBLE e_unexpected_info - { - std::string s_; - std::set already_; - - public: - - e_unexpected_info() noexcept - { - } - - template - void add(E && e) - { - if( !diagnostic::is_invisible && already_.insert(&type).second ) - { - std::stringstream s; - diagnostic::print(s,e); - (s << '\n').flush(); - s_ += s.str(); - } - } - - template - void print( std::basic_ostream & os ) const - { - os << "Unhandled error objects:\n" << s_; - } - }; - - template <> - struct diagnostic - { - static constexpr bool is_invisible = true; - - template - BOOST_LEAF_CONSTEXPR static void print( std::basic_ostream &, e_unexpected_info const &) noexcept { } - }; - -} - -#endif - -} } - -//////////////////////////////////////// - -namespace boost { namespace leaf { - -struct BOOST_LEAF_SYMBOL_VISIBLE e_source_location -{ - char const * file; - int line; - char const * function; - - template - friend std::basic_ostream & operator<<( std::basic_ostream & os, e_source_location const & x ) - { - return os << leaf::type() << ": " << x.file << '(' << x.line << ") in function " << x.function; - } -}; - -//////////////////////////////////////// - -namespace leaf_detail -{ - template - class BOOST_LEAF_SYMBOL_VISIBLE slot: - optional - { - slot( slot const & ) = delete; - slot & operator=( slot const & ) = delete; - - using impl = optional; - slot * prev_; - - public: - - BOOST_LEAF_CONSTEXPR slot() noexcept: - prev_(0) - { - } - - BOOST_LEAF_CONSTEXPR slot( slot && x ) noexcept: - optional(std::move(x)), - prev_(0) - { - BOOST_LEAF_ASSERT(x.prev_==0); - } - - BOOST_LEAF_CONSTEXPR void activate() noexcept - { - prev_ = tls::read_ptr>(); - tls::write_ptr>(this); - } - - BOOST_LEAF_CONSTEXPR void deactivate() noexcept - { - tls::write_ptr>(prev_); - } - - BOOST_LEAF_CONSTEXPR void propagate( int err_id ) noexcept; - - template - void print( std::basic_ostream & os, int key_to_print ) const - { -#if BOOST_LEAF_CFG_DIAGNOSTICS - if( !diagnostic::is_invisible ) - if( int k = this->key() ) - { - if( key_to_print ) - { - if( key_to_print!=k ) - return; - } - else - os << '[' << k << ']'; - diagnostic::print(os, value(k)); - (os << '\n').flush(); - } -#endif - } - - using impl::put; - using impl::has_value; - using impl::value; - }; - -#if BOOST_LEAF_CFG_DIAGNOSTICS - - template - BOOST_LEAF_CONSTEXPR inline void load_unexpected_count( int err_id ) noexcept - { - if( slot * sl = tls::read_ptr>() ) - if( e_unexpected_count * unx = sl->has_value(err_id) ) - ++unx->count; - else - sl->put(err_id, e_unexpected_count(&type)); - } - - template - BOOST_LEAF_CONSTEXPR inline void load_unexpected_info( int err_id, E && e ) noexcept - { - if( slot * sl = tls::read_ptr>() ) - if( e_unexpected_info * unx = sl->has_value(err_id) ) - unx->add(std::forward(e)); - else - sl->put(err_id, e_unexpected_info()).add(std::forward(e)); - } - - template - BOOST_LEAF_CONSTEXPR inline void load_unexpected( int err_id, E && e ) noexcept - { - load_unexpected_count(err_id); - load_unexpected_info(err_id, std::forward(e)); - } - -#endif - - template - BOOST_LEAF_CONSTEXPR inline void slot::propagate( int err_id ) noexcept - { - if( this->key()!=err_id && err_id!=0 ) - return; - if( impl * p = tls::read_ptr>() ) - *p = std::move(*this); -#if BOOST_LEAF_CFG_DIAGNOSTICS - else - { - int c = tls::read_uint32(); - BOOST_LEAF_ASSERT(c>=0); - if( c ) - load_unexpected(err_id, std::move(*this).value(err_id)); - } -#endif - } - - template - BOOST_LEAF_CONSTEXPR inline int load_slot( int err_id, E && e ) noexcept - { - static_assert(!std::is_pointer::value, "Error objects of pointer types are not allowed"); - static_assert(!std::is_same::type, error_id>::value, "Error objects of type error_id are not allowed"); - using T = typename std::decay::type; - BOOST_LEAF_ASSERT((err_id&3)==1); - if( slot * p = tls::read_ptr>() ) - (void) p->put(err_id, std::forward(e)); -#if BOOST_LEAF_CFG_DIAGNOSTICS - else - { - int c = tls::read_uint32(); - BOOST_LEAF_ASSERT(c>=0); - if( c ) - load_unexpected(err_id, std::forward(e)); - } -#endif - return 0; - } - - template - BOOST_LEAF_CONSTEXPR inline int accumulate_slot( int err_id, F && f ) noexcept - { - static_assert(function_traits::arity==1, "Lambdas passed to accumulate must take a single e-type argument by reference"); - using E = typename std::decay>::type; - static_assert(!std::is_pointer::value, "Error objects of pointer types are not allowed"); - BOOST_LEAF_ASSERT((err_id&3)==1); - if( auto sl = tls::read_ptr>() ) - if( auto v = sl->has_value(err_id) ) - (void) std::forward(f)(*v); - else - (void) std::forward(f)(sl->put(err_id,E())); - return 0; - } -} - -//////////////////////////////////////// - -namespace leaf_detail -{ - template - struct BOOST_LEAF_SYMBOL_VISIBLE id_factory - { - static atomic_unsigned_int counter; - - BOOST_LEAF_CONSTEXPR static unsigned generate_next_id() noexcept - { - auto id = (counter+=4); - BOOST_LEAF_ASSERT((id&3)==1); - return id; - } - }; - - template - atomic_unsigned_int id_factory::counter(-3); - - inline int current_id() noexcept - { - auto id = tls::read_uint32(); - BOOST_LEAF_ASSERT(id==0 || (id&3)==1); - return id; - } - - inline int new_id() noexcept - { - auto id = id_factory<>::generate_next_id(); - tls::write_uint32(id); - return id; - } -} - -//////////////////////////////////////// - -namespace leaf_detail -{ - template ::arity> - struct load_item - { - static_assert(Arity==0 || Arity==1, "If a functions is passed to new_error or load, it must take zero or one argument"); - }; - - template - struct load_item - { - BOOST_LEAF_CONSTEXPR static int load( int err_id, E && e ) noexcept - { - return load_slot(err_id, std::forward(e)); - } - }; - - template - struct load_item - { - BOOST_LEAF_CONSTEXPR static int load( int err_id, F && f ) noexcept - { - return load_slot(err_id, std::forward(f)()); - } - }; - - template - struct load_item - { - BOOST_LEAF_CONSTEXPR static int load( int err_id, F && f ) noexcept - { - return accumulate_slot(err_id, std::forward(f)); - } - }; -} - -//////////////////////////////////////// - -#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR -namespace leaf_detail -{ - class leaf_category final: public std::error_category - { - bool equivalent( int, std::error_condition const & ) const noexcept final override { return false; } - bool equivalent( std::error_code const &, int ) const noexcept final override { return false; } - char const * name() const noexcept final override { return "LEAF error"; } - std::string message( int condition ) const final override { return name(); } - public: - ~leaf_category() noexcept final override { } - }; - - template - struct get_error_category - { - static leaf_category cat; - }; - - template - leaf_category get_error_category::cat; - - inline int import_error_code( std::error_code const & ec ) noexcept - { - if( int err_id = ec.value() ) - { - std::error_category const & cat = get_error_category<>::cat; - if( &ec.category()==&cat ) - { - BOOST_LEAF_ASSERT((err_id&3)==1); - return (err_id&~3)|1; - } - else - { - err_id = new_id(); - (void) load_slot(err_id, ec); - return (err_id&~3)|1; - } - } - else - return 0; - } -} - -inline bool is_error_id( std::error_code const & ec ) noexcept -{ - bool res = (&ec.category() == &leaf_detail::get_error_category<>::cat); - BOOST_LEAF_ASSERT(!res || !ec.value() || ((ec.value()&3)==1)); - return res; -} -#endif - -//////////////////////////////////////// - -namespace leaf_detail -{ - BOOST_LEAF_CONSTEXPR error_id make_error_id(int) noexcept; -} - -class BOOST_LEAF_SYMBOL_VISIBLE error_id -{ - friend error_id BOOST_LEAF_CONSTEXPR leaf_detail::make_error_id(int) noexcept; - - int value_; - - BOOST_LEAF_CONSTEXPR explicit error_id( int value ) noexcept: - value_(value) - { - BOOST_LEAF_ASSERT(value_==0 || ((value_&3)==1)); - } - -public: - - BOOST_LEAF_CONSTEXPR error_id() noexcept: - value_(0) - { - } - -#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR - error_id( std::error_code const & ec ) noexcept: - value_(leaf_detail::import_error_code(ec)) - { - BOOST_LEAF_ASSERT(!value_ || ((value_&3)==1)); - } - - template - error_id( Enum e, typename std::enable_if::value, Enum>::type * = 0 ) noexcept: - value_(leaf_detail::import_error_code(e)) - { - } - - std::error_code to_error_code() const noexcept - { - return std::error_code(value_, leaf_detail::get_error_category<>::cat); - } -#endif - - BOOST_LEAF_CONSTEXPR error_id load() const noexcept - { - return *this; - } - - template - BOOST_LEAF_CONSTEXPR error_id load( Item && ... item ) const noexcept - { - if( int err_id = value() ) - { - int const unused[ ] = { 42, leaf_detail::load_item::load(err_id, std::forward(item))... }; - (void) unused; - } - return *this; - } - - BOOST_LEAF_CONSTEXPR int value() const noexcept - { - if( int v = value_ ) - { - BOOST_LEAF_ASSERT((v&3)==1); - return (v&~3)|1; - } - else - return 0; - } - - BOOST_LEAF_CONSTEXPR explicit operator bool() const noexcept - { - return value_ != 0; - } - - BOOST_LEAF_CONSTEXPR friend bool operator==( error_id a, error_id b ) noexcept - { - return a.value_ == b.value_; - } - - BOOST_LEAF_CONSTEXPR friend bool operator!=( error_id a, error_id b ) noexcept - { - return !(a == b); - } - - BOOST_LEAF_CONSTEXPR friend bool operator<( error_id a, error_id b ) noexcept - { - return a.value_ < b.value_; - } - - template - friend std::basic_ostream & operator<<( std::basic_ostream & os, error_id x ) - { - return os << x.value_; - } - - BOOST_LEAF_CONSTEXPR void load_source_location_( char const * file, int line, char const * function ) const noexcept - { - BOOST_LEAF_ASSERT(file&&*file); - BOOST_LEAF_ASSERT(line>0); - BOOST_LEAF_ASSERT(function&&*function); - BOOST_LEAF_ASSERT(value_); - (void) load(e_source_location {file,line,function}); - } -}; - -namespace leaf_detail -{ - BOOST_LEAF_CONSTEXPR inline error_id make_error_id( int err_id ) noexcept - { - BOOST_LEAF_ASSERT(err_id==0 || (err_id&3)==1); - return error_id((err_id&~3)|1); - } -} - -inline error_id new_error() noexcept -{ - return leaf_detail::make_error_id(leaf_detail::new_id()); -} - -template -inline error_id new_error( Item && ... item ) noexcept -{ - return leaf_detail::make_error_id(leaf_detail::new_id()).load(std::forward(item)...); -} - -inline error_id current_error() noexcept -{ - return leaf_detail::make_error_id(leaf_detail::current_id()); -} - -//////////////////////////////////////////// - -class polymorphic_context -{ -protected: - - polymorphic_context() noexcept = default; - ~polymorphic_context() noexcept = default; - -public: - - virtual error_id propagate_captured_errors() noexcept = 0; - virtual void activate() noexcept = 0; - virtual void deactivate() noexcept = 0; - virtual void propagate( error_id ) noexcept = 0; - virtual bool is_active() const noexcept = 0; - inline virtual void print( std::ostream & ) const { }; - error_id captured_id_; -}; - -#if BOOST_LEAF_CFG_CAPTURE -using context_ptr = std::shared_ptr; -#endif - -//////////////////////////////////////////// - -template -class context_activator -{ - context_activator( context_activator const & ) = delete; - context_activator & operator=( context_activator const & ) = delete; - -#if !defined(BOOST_LEAF_NO_EXCEPTIONS) && BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS - int const uncaught_exceptions_; -#endif - Ctx * ctx_; - -public: - - explicit BOOST_LEAF_CONSTEXPR BOOST_LEAF_ALWAYS_INLINE context_activator(Ctx & ctx) noexcept: -#if !defined(BOOST_LEAF_NO_EXCEPTIONS) && BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS - uncaught_exceptions_(std::uncaught_exceptions()), -#endif - ctx_(ctx.is_active() ? 0 : &ctx) - { - if( ctx_ ) - ctx_->activate(); - } - - BOOST_LEAF_CONSTEXPR BOOST_LEAF_ALWAYS_INLINE context_activator( context_activator && x ) noexcept: -#if !defined(BOOST_LEAF_NO_EXCEPTIONS) && BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS - uncaught_exceptions_(x.uncaught_exceptions_), -#endif - ctx_(x.ctx_) - { - x.ctx_ = 0; - } - - BOOST_LEAF_ALWAYS_INLINE ~context_activator() noexcept - { - if( ctx_ && ctx_->is_active() ) - ctx_->deactivate(); - } -}; - -template -BOOST_LEAF_CONSTEXPR BOOST_LEAF_ALWAYS_INLINE context_activator activate_context(Ctx & ctx) noexcept -{ - return context_activator(ctx); -} - -//////////////////////////////////////////// - -template -struct is_result_type: std::false_type -{ -}; - -template -struct is_result_type: is_result_type -{ -}; - -} } - -#endif -// <<< #include -#line 11 "boost/leaf/exception.hpp" - -#ifndef BOOST_LEAF_NO_EXCEPTIONS - -#include - -#define BOOST_LEAF_EXCEPTION ::boost::leaf::leaf_detail::inject_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::exception -#define BOOST_LEAF_THROW_EXCEPTION ::boost::leaf::leaf_detail::throw_with_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::exception - -//////////////////////////////////////// - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - struct throw_with_loc - { - char const * const file; - int const line; - char const * const fn; - - template - [[noreturn]] friend void operator+( throw_with_loc loc, Ex const & ex ) - { - ex.load_source_location_(loc.file, loc.line, loc.fn); - ::boost::leaf::throw_exception(ex); - } - }; -} - -} } - -//////////////////////////////////////// - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - inline void enforce_std_exception( std::exception const & ) noexcept { } - - class BOOST_LEAF_SYMBOL_VISIBLE exception_base - { - std::shared_ptr auto_id_bump_; - public: - - virtual error_id get_error_id() const noexcept = 0; - - protected: - - exception_base(): - auto_id_bump_(0, [](void const *) { (void) new_id(); }) - { - } - - ~exception_base() noexcept { } - }; - - template - class BOOST_LEAF_SYMBOL_VISIBLE exception: - public Ex, - public exception_base, - public error_id - { - error_id get_error_id() const noexcept final override - { - return *this; - } - - public: - - exception( exception const & ) = default; - exception( exception && ) = default; - - BOOST_LEAF_CONSTEXPR exception( error_id id, Ex const & ex ) noexcept: - Ex(ex), - error_id(id) - { - enforce_std_exception(*this); - } - - BOOST_LEAF_CONSTEXPR exception( error_id id, Ex && ex ) noexcept: - Ex(std::move(ex)), - error_id(id) - { - enforce_std_exception(*this); - } - - explicit BOOST_LEAF_CONSTEXPR exception( error_id id ) noexcept: - error_id(id) - { - enforce_std_exception(*this); - } - }; - - template - struct at_least_one_derives_from_std_exception; - - template <> - struct at_least_one_derives_from_std_exception<>: std::false_type { }; - - template - struct at_least_one_derives_from_std_exception - { - constexpr static const bool value = std::is_base_of::type>::value || at_least_one_derives_from_std_exception::value; - }; -} - -template -inline -typename std::enable_if::type>::value, leaf_detail::exception::type>>::type -exception( error_id err, Ex && ex, E && ... e ) noexcept -{ - static_assert(!leaf_detail::at_least_one_derives_from_std_exception::value, "Error objects passed to leaf::exception may not derive from std::exception"); - return leaf_detail::exception::type>( err.load(std::forward(e)...), std::forward(ex) ); -} - -template -inline -typename std::enable_if::type>::value, leaf_detail::exception>::type -exception( error_id err, E1 && car, E && ... cdr ) noexcept -{ - static_assert(!leaf_detail::at_least_one_derives_from_std_exception::value, "Error objects passed to leaf::exception may not derive from std::exception"); - return leaf_detail::exception( err.load(std::forward(car), std::forward(cdr)...) ); -} - -inline leaf_detail::exception exception( error_id err ) noexcept -{ - return leaf_detail::exception(err); -} - -template -inline -typename std::enable_if::type>::value, leaf_detail::exception::type>>::type -exception( Ex && ex, E && ... e ) noexcept -{ - static_assert(!leaf_detail::at_least_one_derives_from_std_exception::value, "Error objects passed to leaf::exception may not derive from std::exception"); - return leaf_detail::exception::type>( new_error().load(std::forward(e)...), std::forward(ex) ); -} - -template -inline -typename std::enable_if::type>::value, leaf_detail::exception>::type -exception( E1 && car, E && ... cdr ) noexcept -{ - static_assert(!leaf_detail::at_least_one_derives_from_std_exception::value, "Error objects passed to leaf::exception may not derive from std::exception"); - return leaf_detail::exception( new_error().load(std::forward(car), std::forward(cdr)...) ); -} - -inline leaf_detail::exception exception() noexcept -{ - return leaf_detail::exception(leaf::new_error()); -} - -//////////////////////////////////////// - -#ifndef BOOST_LEAF_NO_EXCEPTIONS - -template -class result; - -namespace leaf_detail -{ - inline error_id catch_exceptions_helper( std::exception const & ex, leaf_detail_mp11::mp_list<> ) - { - return leaf::new_error(std::current_exception()); - } - - template - inline error_id catch_exceptions_helper( std::exception const & ex, leaf_detail_mp11::mp_list ) - { - if( Ex1 const * p = dynamic_cast(&ex) ) - return catch_exceptions_helper(ex, leaf_detail_mp11::mp_list{ }).load(*p); - else - return catch_exceptions_helper(ex, leaf_detail_mp11::mp_list{ }); - } - - template - struct deduce_exception_to_result_return_type_impl - { - using type = result; - }; - - template - struct deduce_exception_to_result_return_type_impl> - { - using type = result; - }; - - template - using deduce_exception_to_result_return_type = typename deduce_exception_to_result_return_type_impl::type; -} - -template -inline -leaf_detail::deduce_exception_to_result_return_type> -exception_to_result( F && f ) noexcept -{ - try - { - return std::forward(f)(); - } - catch( std::exception const & ex ) - { - return leaf_detail::catch_exceptions_helper(ex, leaf_detail_mp11::mp_list()); - } - catch(...) - { - return leaf::new_error(std::current_exception()); - } -} - -#endif - -} } - -#endif - -#endif -// <<< #include -#line 11 "boost/leaf/capture.hpp" -// >>> #include -#line 1 "boost/leaf/on_error.hpp" -#ifndef BOOST_LEAF_ON_ERROR_HPP_INCLUDED -#define BOOST_LEAF_ON_ERROR_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// Expanded at line 721: #include - -namespace boost { namespace leaf { - -class error_monitor -{ -#if !defined(BOOST_LEAF_NO_EXCEPTIONS) && BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS - int const uncaught_exceptions_; -#endif - int const err_id_; - -public: - - error_monitor() noexcept: -#if !defined(BOOST_LEAF_NO_EXCEPTIONS) && BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS - uncaught_exceptions_(std::uncaught_exceptions()), -#endif - err_id_(leaf_detail::current_id()) - { - } - - int check_id() const noexcept - { - int err_id = leaf_detail::current_id(); - if( err_id != err_id_ ) - return err_id; - else - { -#ifndef BOOST_LEAF_NO_EXCEPTIONS -# if BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS - if( std::uncaught_exceptions() > uncaught_exceptions_ ) -# else - if( std::uncaught_exception() ) -# endif - return leaf_detail::new_id(); -#endif - return 0; - } - } - - int get_id() const noexcept - { - int err_id = leaf_detail::current_id(); - if( err_id != err_id_ ) - return err_id; - else - return leaf_detail::new_id(); - } - - error_id check() const noexcept - { - return leaf_detail::make_error_id(check_id()); - } - - error_id assigned_error_id() const noexcept - { - return leaf_detail::make_error_id(get_id()); - } -}; - -//////////////////////////////////////////// - -namespace leaf_detail -{ - template - struct tuple_for_each_preload - { - BOOST_LEAF_CONSTEXPR static void trigger( Tuple & tup, int err_id ) noexcept - { - BOOST_LEAF_ASSERT((err_id&3)==1); - tuple_for_each_preload::trigger(tup,err_id); - std::get(tup).trigger(err_id); - } - }; - - template - struct tuple_for_each_preload<0, Tuple> - { - BOOST_LEAF_CONSTEXPR static void trigger( Tuple const &, int ) noexcept { } - }; - - template - class preloaded_item - { - using decay_E = typename std::decay::type; - slot * s_; - decay_E e_; - - public: - - BOOST_LEAF_CONSTEXPR preloaded_item( E && e ): - s_(tls::read_ptr>()), - e_(std::forward(e)) - { - } - - BOOST_LEAF_CONSTEXPR void trigger( int err_id ) noexcept - { - BOOST_LEAF_ASSERT((err_id&3)==1); - if( s_ ) - { - if( !s_->has_value(err_id) ) - s_->put(err_id, std::move(e_)); - } -#if BOOST_LEAF_CFG_DIAGNOSTICS - else - { - int c = tls::read_uint32(); - BOOST_LEAF_ASSERT(c>=0); - if( c ) - load_unexpected(err_id, std::move(e_)); - } -#endif - } - }; - - template - class deferred_item - { - using E = decltype(std::declval()()); - slot * s_; - F f_; - - public: - - BOOST_LEAF_CONSTEXPR deferred_item( F && f ) noexcept: - s_(tls::read_ptr>()), - f_(std::forward(f)) - { - } - - BOOST_LEAF_CONSTEXPR void trigger( int err_id ) noexcept - { - BOOST_LEAF_ASSERT((err_id&3)==1); - if( s_ ) - { - if( !s_->has_value(err_id) ) - s_->put(err_id, f_()); - } -#if BOOST_LEAF_CFG_DIAGNOSTICS - else - { - int c = tls::read_uint32(); - BOOST_LEAF_ASSERT(c>=0); - if( c ) - load_unexpected(err_id, std::forward(f_())); - } -#endif - } - }; - - template , int arity = function_traits::arity> - class accumulating_item; - - template - class accumulating_item - { - using E = A0; - slot * s_; - F f_; - - public: - - BOOST_LEAF_CONSTEXPR accumulating_item( F && f ) noexcept: - s_(tls::read_ptr>()), - f_(std::forward(f)) - { - } - - BOOST_LEAF_CONSTEXPR void trigger( int err_id ) noexcept - { - BOOST_LEAF_ASSERT((err_id&3)==1); - if( s_ ) - if( E * e = s_->has_value(err_id) ) - (void) f_(*e); - else - (void) f_(s_->put(err_id, E())); - } - }; - - template - class preloaded - { - preloaded & operator=( preloaded const & ) = delete; - - std::tuple p_; - bool moved_; - error_monitor id_; - - public: - - BOOST_LEAF_CONSTEXPR explicit preloaded( Item && ... i ): - p_(std::forward(i)...), - moved_(false) - { - } - - BOOST_LEAF_CONSTEXPR preloaded( preloaded && x ) noexcept: - p_(std::move(x.p_)), - moved_(false), - id_(std::move(x.id_)) - { - x.moved_ = true; - } - - ~preloaded() noexcept - { - if( moved_ ) - return; - if( auto id = id_.check_id() ) - tuple_for_each_preload::trigger(p_,id); - } - }; - - template ::arity> - struct deduce_item_type; - - template - struct deduce_item_type - { - using type = preloaded_item; - }; - - template - struct deduce_item_type - { - using type = deferred_item; - }; - - template - struct deduce_item_type - { - using type = accumulating_item; - }; -} - -template -BOOST_LEAF_NODISCARD BOOST_LEAF_CONSTEXPR inline -leaf_detail::preloaded::type...> -on_error( Item && ... i ) -{ - return leaf_detail::preloaded::type...>(std::forward(i)...); -} - -} } - -#endif -// <<< #include -#line 12 "boost/leaf/capture.hpp" - -#if BOOST_LEAF_CFG_CAPTURE - -namespace boost { namespace leaf { - -namespace leaf_detail -{ - template ::value> - struct is_result_tag; - - template - struct is_result_tag - { - }; - - template - struct is_result_tag - { - }; -} - -#ifdef BOOST_LEAF_NO_EXCEPTIONS - -namespace leaf_detail -{ - template - inline - decltype(std::declval()(std::forward(std::declval())...)) - capture_impl(is_result_tag, context_ptr && ctx, F && f, A... a) noexcept - { - auto active_context = activate_context(*ctx); - return std::forward(f)(std::forward(a)...); - } - - template - inline - decltype(std::declval()(std::forward(std::declval())...)) - capture_impl(is_result_tag, context_ptr && ctx, F && f, A... a) noexcept - { - auto active_context = activate_context(*ctx); - if( auto r = std::forward(f)(std::forward(a)...) ) - return r; - else - { - ctx->captured_id_ = r.error(); - return std::move(ctx); - } - } - - template - inline - decltype(std::declval().get()) - future_get_impl(is_result_tag, Future & fut) noexcept - { - return fut.get(); - } - - template - inline - decltype(std::declval().get()) - future_get_impl(is_result_tag, Future & fut) noexcept - { - if( auto r = fut.get() ) - return r; - else - return error_id(r.error()); // unloads - } -} - -#else - -namespace leaf_detail -{ - class capturing_exception: - public std::exception - { - std::exception_ptr ex_; - context_ptr ctx_; - - public: - - capturing_exception(std::exception_ptr && ex, context_ptr && ctx) noexcept: - ex_(std::move(ex)), - ctx_(std::move(ctx)) - { - BOOST_LEAF_ASSERT(ex_); - BOOST_LEAF_ASSERT(ctx_); - BOOST_LEAF_ASSERT(ctx_->captured_id_); - } - - [[noreturn]] void unload_and_rethrow_original_exception() const - { - BOOST_LEAF_ASSERT(ctx_->captured_id_); - tls::write_uint32(ctx_->captured_id_.value()); - ctx_->propagate(ctx_->captured_id_); - std::rethrow_exception(ex_); - } - - template - void print( std::basic_ostream & os ) const - { - ctx_->print(os); - } - }; - - template - inline - decltype(std::declval()(std::forward(std::declval())...)) - capture_impl(is_result_tag, context_ptr && ctx, F && f, A... a) - { - auto active_context = activate_context(*ctx); - error_monitor cur_err; - try - { - return std::forward(f)(std::forward(a)...); - } - catch( capturing_exception const & ) - { - throw; - } - catch( exception_base const & e ) - { - ctx->captured_id_ = e.get_error_id(); - throw_exception( capturing_exception(std::current_exception(), std::move(ctx)) ); - } - catch(...) - { - ctx->captured_id_ = cur_err.assigned_error_id(); - throw_exception( capturing_exception(std::current_exception(), std::move(ctx)) ); - } - } - - template - inline - decltype(std::declval()(std::forward(std::declval())...)) - capture_impl(is_result_tag, context_ptr && ctx, F && f, A... a) - { - auto active_context = activate_context(*ctx); - error_monitor cur_err; - try - { - if( auto && r = std::forward(f)(std::forward(a)...) ) - return std::move(r); - else - { - ctx->captured_id_ = r.error(); - return std::move(ctx); - } - } - catch( capturing_exception const & ) - { - throw; - } - catch( exception_base const & e ) - { - ctx->captured_id_ = e.get_error_id(); - throw_exception( capturing_exception(std::current_exception(), std::move(ctx)) ); - } - catch(...) - { - ctx->captured_id_ = cur_err.assigned_error_id(); - throw_exception( capturing_exception(std::current_exception(), std::move(ctx)) ); - } - } - - template - inline - decltype(std::declval().get()) - future_get_impl(is_result_tag, Future & fut ) - { - try - { - return fut.get(); - } - catch( capturing_exception const & cap ) - { - cap.unload_and_rethrow_original_exception(); - } - } - - template - inline - decltype(std::declval().get()) - future_get_impl(is_result_tag, Future & fut ) - { - try - { - if( auto r = fut.get() ) - return r; - else - return error_id(r.error()); // unloads - } - catch( capturing_exception const & cap ) - { - cap.unload_and_rethrow_original_exception(); - } - } -} - -#endif - -template -inline -decltype(std::declval()(std::forward(std::declval())...)) -capture(context_ptr && ctx, F && f, A... a) -{ - using namespace leaf_detail; - return capture_impl(is_result_tag()(std::forward(std::declval())...))>(), std::move(ctx), std::forward(f), std::forward(a)...); -} - -template -inline -decltype(std::declval().get()) -future_get( Future & fut ) -{ - using namespace leaf_detail; - return future_get_impl(is_result_tag().get())>(), fut); -} - -} } - -#endif - -#endif -// >>> #include -#line 1 "boost/leaf/common.hpp" -#ifndef BOOST_LEAF_COMMON_HPP_INCLUDED -#define BOOST_LEAF_COMMON_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// Expanded at line 907: #include - -#include -#if BOOST_LEAF_CFG_STD_STRING -# include -#endif -#include -#if BOOST_LEAF_CFG_WIN32 -# include -# include -# ifdef min -# undef min -# endif -# ifdef max -# undef max -# endif -#endif - -namespace boost { namespace leaf { - -struct BOOST_LEAF_SYMBOL_VISIBLE e_api_function { char const * value; }; - -#if BOOST_LEAF_CFG_STD_STRING - -struct BOOST_LEAF_SYMBOL_VISIBLE e_file_name -{ - std::string value; -}; - -#else - -struct BOOST_LEAF_SYMBOL_VISIBLE e_file_name -{ - constexpr static char const * const value = ""; - BOOST_LEAF_CONSTEXPR explicit e_file_name( char const * ) { } -}; - -#endif - -struct BOOST_LEAF_SYMBOL_VISIBLE e_errno -{ - int value; - - explicit e_errno(int value=errno): value(value) { } - - template - friend std::basic_ostream & operator<<(std::basic_ostream & os, e_errno const & err) - { - return os << type() << ": " << err.value << ", \"" << std::strerror(err.value) << '"'; - } -}; - -struct BOOST_LEAF_SYMBOL_VISIBLE e_type_info_name { char const * value; }; - -struct BOOST_LEAF_SYMBOL_VISIBLE e_at_line { int value; }; - -namespace windows -{ - struct e_LastError - { - unsigned value; - - explicit e_LastError(unsigned value): value(value) { } - -#if BOOST_LEAF_CFG_WIN32 - e_LastError(): value(GetLastError()) { } - - template - friend std::basic_ostream & operator<<(std::basic_ostream & os, e_LastError const & err) - { - struct msg_buf - { - LPVOID * p; - msg_buf(): p(0) { } - ~msg_buf() noexcept { if(p) LocalFree(p); } - }; - msg_buf mb; - if( FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - 0, - err.value, - MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), - (LPSTR)&mb.p, - 0, - 0) ) - { - BOOST_LEAF_ASSERT(mb.p != 0); - char * z = std::strchr((LPSTR)mb.p,0); - if( z[-1] == '\n' ) - *--z = 0; - if( z[-1] == '\r' ) - *--z = 0; - return os << type() << ": " << err.value << ", \"" << (LPCSTR)mb.p << '"'; - } - return os; - } -#endif - }; -} - -} } - -#endif -// >>> #include -#line 1 "boost/leaf/context.hpp" -#ifndef BOOST_LEAF_CONTEXT_HPP_INCLUDED -#define BOOST_LEAF_CONTEXT_HPP_INCLUDED - -// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc. - -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// Expanded at line 16: #include -// Expanded at line 721: #include - -#if !defined(BOOST_LEAF_NO_THREADS) && !defined(NDEBUG) -# include -#endif - -namespace boost { namespace leaf { - -class error_info; -class diagnostic_info; -class verbose_diagnostic_info; - -template -struct is_predicate: std::false_type -{ -}; - -namespace leaf_detail -{ - template - struct is_exception: std::is_base_of::type> - { - }; - - template - struct handler_argument_traits; - - template ::value> - struct handler_argument_traits_defaults; - - template - struct handler_argument_traits_defaults - { - using error_type = typename std::decay::type; - constexpr static bool always_available = false; - - template - BOOST_LEAF_CONSTEXPR static error_type const * check( Tup const &, error_info const & ) noexcept; - - template - BOOST_LEAF_CONSTEXPR static error_type * check( Tup &, error_info const & ) noexcept; - - template - BOOST_LEAF_CONSTEXPR static E get( Tup & tup, error_info const & ei ) noexcept - { - return *check(tup, ei); - } - - static_assert(!is_predicate::value, "Handlers must take predicate arguments by value"); - static_assert(!std::is_same::value, "Handlers must take leaf::error_info arguments by const &"); - static_assert(!std::is_same::value, "Handlers must take leaf::diagnostic_info arguments by const &"); - static_assert(!std::is_same::value, "Handlers must take leaf::verbose_diagnostic_info arguments by const &"); - }; - - template - struct handler_argument_traits_defaults: handler_argument_traits - { - using base = handler_argument_traits; - static_assert(!base::always_available, "Predicates can't use types that are always_available"); - - template - BOOST_LEAF_CONSTEXPR static bool check( Tup const & tup, error_info const & ei ) noexcept - { - auto e = base::check(tup, ei); - return e && Pred::evaluate(*e); - }; - - template - BOOST_LEAF_CONSTEXPR static Pred get( Tup const & tup, error_info const & ei ) noexcept - { - return Pred{*base::check(tup, ei)}; - } - }; - - template - struct handler_argument_always_available - { - using error_type = E; - constexpr static bool always_available = true; - - template - BOOST_LEAF_CONSTEXPR static bool check( Tup &, error_info const & ) noexcept - { - return true; - }; - }; - - template - struct handler_argument_traits: handler_argument_traits_defaults - { - }; - - template <> - struct handler_argument_traits - { - using error_type = void; - constexpr static bool always_available = false; - - template - BOOST_LEAF_CONSTEXPR static std::exception const * check( Tup const &, error_info const & ) noexcept; - }; - - template - struct handler_argument_traits - { - static_assert(sizeof(E) == 0, "Error handlers may not take rvalue ref arguments"); - }; - - template - struct handler_argument_traits: handler_argument_always_available::type> - { - template - BOOST_LEAF_CONSTEXPR static E * get( Tup & tup, error_info const & ei) noexcept - { - return handler_argument_traits_defaults::check(tup, ei); - } - }; - - template <> - struct handler_argument_traits: handler_argument_always_available - { - template - BOOST_LEAF_CONSTEXPR static error_info const & get( Tup const &, error_info const & ei ) noexcept - { - return ei; - } - }; - - template - struct handler_argument_traits_require_by_value - { - static_assert(sizeof(E) == 0, "Error handlers must take this type by value"); - }; -} - -//////////////////////////////////////// - -namespace leaf_detail -{ - template - struct tuple_for_each - { - BOOST_LEAF_CONSTEXPR static void activate( Tuple & tup ) noexcept - { - static_assert(!std::is_same(tup))>::type>::value, "Bug in LEAF: context type deduction"); - tuple_for_each::activate(tup); - std::get(tup).activate(); - } - - BOOST_LEAF_CONSTEXPR static void deactivate( Tuple & tup ) noexcept - { - static_assert(!std::is_same(tup))>::type>::value, "Bug in LEAF: context type deduction"); - std::get(tup).deactivate(); - tuple_for_each::deactivate(tup); - } - - BOOST_LEAF_CONSTEXPR static void propagate( Tuple & tup, int err_id ) noexcept - { - static_assert(!std::is_same(tup))>::type>::value, "Bug in LEAF: context type deduction"); - auto & sl = std::get(tup); - sl.propagate(err_id); - tuple_for_each::propagate(tup, err_id); - } - - BOOST_LEAF_CONSTEXPR static void propagate_captured( Tuple & tup, int err_id ) noexcept - { - static_assert(!std::is_same(tup))>::type>::value, "Bug in LEAF: context type deduction"); - BOOST_LEAF_ASSERT(err_id != 0); - auto & sl = std::get(tup); - if( sl.has_value(err_id) ) - load_slot(err_id, std::move(sl).value(err_id)); - tuple_for_each::propagate_captured(tup, err_id); - } - - template - static void print( std::basic_ostream & os, void const * tup, int key_to_print ) - { - BOOST_LEAF_ASSERT(tup != 0); - tuple_for_each::print(os, tup, key_to_print); - std::get(*static_cast(tup)).print(os, key_to_print); - } - }; - - template - struct tuple_for_each<0, Tuple> - { - BOOST_LEAF_CONSTEXPR static void activate( Tuple & ) noexcept { } - BOOST_LEAF_CONSTEXPR static void deactivate( Tuple & ) noexcept { } - BOOST_LEAF_CONSTEXPR static void propagate( Tuple &, int ) noexcept { } - BOOST_LEAF_CONSTEXPR static void propagate_captured( Tuple &, int ) noexcept { } - template - BOOST_LEAF_CONSTEXPR static void print( std::basic_ostream &, void const *, int ) { } - }; -} - -//////////////////////////////////////////// - -#if BOOST_LEAF_CFG_DIAGNOSTICS - -namespace leaf_detail -{ - template struct requires_unexpected { constexpr static bool value = false; }; - template struct requires_unexpected { constexpr static bool value = requires_unexpected::value; }; - template struct requires_unexpected { constexpr static bool value = requires_unexpected::value; }; - template struct requires_unexpected { constexpr static bool value = requires_unexpected::value; }; - template <> struct requires_unexpected { constexpr static bool value = true; }; - template <> struct requires_unexpected { constexpr static bool value = true; }; - - template - struct unexpected_requested; - - template