add boost on mac
This commit is contained in:
261
macx64/include/boost/outcome/experimental/status-code/config.hpp
Normal file
261
macx64/include/boost/outcome/experimental/status-code/config.hpp
Normal file
@@ -0,0 +1,261 @@
|
||||
/* Proposed SG14 status_code
|
||||
(C) 2018-2019 Niall Douglas <http://www.nedproductions.biz/> (5 commits)
|
||||
File Created: Feb 2018
|
||||
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_CONFIG_HPP
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_CONFIG_HPP
|
||||
|
||||
// < 0.1 each
|
||||
#include <cassert>
|
||||
#include <cstddef> // for size_t
|
||||
#include <cstdlib> // for free
|
||||
|
||||
// 0.22
|
||||
#include <type_traits>
|
||||
|
||||
// 0.29
|
||||
#include <atomic>
|
||||
|
||||
// 0.28 (0.15 of which is exception_ptr)
|
||||
#include <exception> // for std::exception
|
||||
// <new> includes <exception>, <exception> includes <new>
|
||||
#include <new>
|
||||
|
||||
// 0.01
|
||||
#include <initializer_list>
|
||||
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_CONSTEXPR14
|
||||
#if defined(BOOST_OUTCOME_STANDARDESE_IS_IN_THE_HOUSE) || __cplusplus >= 201400 || _MSC_VER >= 1910 /* VS2017 */
|
||||
//! Defined to be `constexpr` when on C++ 14 or better compilers. Usually automatic, can be overriden.
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_CONSTEXPR14 constexpr
|
||||
#else
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_CONSTEXPR14
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN
|
||||
#if defined(BOOST_OUTCOME_STANDARDESE_IS_IN_THE_HOUSE) || (_HAS_CXX17 && _MSC_VER >= 1911 /* VS2017.3 */)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN [[noreturn]]
|
||||
#endif
|
||||
#endif
|
||||
#if !defined(BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN)
|
||||
#ifdef __has_cpp_attribute
|
||||
#if __has_cpp_attribute(noreturn)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN [[noreturn]]
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#if !defined(BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN)
|
||||
#if defined(_MSC_VER)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN __declspec(noreturn)
|
||||
#elif defined(__GNUC__)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN __attribute__((__noreturn__))
|
||||
#else
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN
|
||||
#endif
|
||||
#endif
|
||||
// GCCs before 7 don't grok [[noreturn]] virtual functions, and warn annoyingly
|
||||
#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 7
|
||||
#undef BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NORETURN
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD
|
||||
#if defined(BOOST_OUTCOME_STANDARDESE_IS_IN_THE_HOUSE) || (_HAS_CXX17 && _MSC_VER >= 1911 /* VS2017.3 */)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD [[nodiscard]]
|
||||
#endif
|
||||
#endif
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD
|
||||
#ifdef __has_cpp_attribute
|
||||
#if __has_cpp_attribute(nodiscard)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD [[nodiscard]]
|
||||
#endif
|
||||
#elif defined(__clang__)
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD __attribute__((warn_unused_result))
|
||||
#elif defined(_MSC_VER)
|
||||
// _Must_inspect_result_ expands into this
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_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 BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NODISCARD
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE
|
||||
//! The system_error2 namespace name.
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE system_error2
|
||||
//! Begins the system_error2 namespace.
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_BEGIN \
|
||||
namespace system_error2 \
|
||||
{
|
||||
//! Ends the system_error2 namespace.
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_END }
|
||||
#endif
|
||||
|
||||
//! Namespace for the library
|
||||
BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_BEGIN
|
||||
|
||||
//! Namespace for user specialised traits
|
||||
namespace traits
|
||||
{
|
||||
/*! Specialise to true if you guarantee that a type is move relocating (i.e.
|
||||
its move constructor equals copying bits from old to new, old is left in a
|
||||
default constructed state, and calling the destructor on a default constructed
|
||||
instance is trivial). All trivially copyable types are move relocating by
|
||||
definition, and that is the unspecialised implementation.
|
||||
*/
|
||||
template <class T> struct is_move_relocating
|
||||
{
|
||||
static constexpr bool value = std::is_trivially_copyable<T>::value;
|
||||
};
|
||||
} // namespace traits
|
||||
|
||||
namespace detail
|
||||
{
|
||||
inline BOOST_OUTCOME_SYSTEM_ERROR2_CONSTEXPR14 size_t cstrlen(const char *str)
|
||||
{
|
||||
const char *end = nullptr;
|
||||
for(end = str; *end != 0; ++end) // NOLINT
|
||||
;
|
||||
return end - str;
|
||||
}
|
||||
|
||||
/* A partially compliant implementation of C++20's std::bit_cast function contributed
|
||||
by Jesse Towner. TODO FIXME Replace with C++ 20 bit_cast when available.
|
||||
|
||||
Our bit_cast is only guaranteed to be constexpr when both the input and output
|
||||
arguments are either integrals or enums. However, this covers most use cases
|
||||
since the vast majority of status_codes have an underlying type that is either
|
||||
an integral or enum.
|
||||
*/
|
||||
|
||||
template <class T> using is_integral_or_enum = std::integral_constant<bool, std::is_integral<T>::value || std::is_enum<T>::value>;
|
||||
|
||||
template <class To, class From> using is_static_castable = std::integral_constant<bool, is_integral_or_enum<To>::value && is_integral_or_enum<From>::value>;
|
||||
|
||||
template <class To, class From> using is_bit_castable = std::integral_constant<bool, sizeof(To) == sizeof(From) && traits::is_move_relocating<To>::value && traits::is_move_relocating<From>::value>;
|
||||
|
||||
template <class To, class From> union bit_cast_union {
|
||||
From source;
|
||||
To target;
|
||||
};
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_bit_castable<To, From>::value && is_static_castable<To, From>::value, bool>::type = true> constexpr To bit_cast(const From &from) noexcept { return static_cast<To>(from); }
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_bit_castable<To, From>::value && !is_static_castable<To, From>::value, bool>::type = true> constexpr To bit_cast(const From &from) noexcept { return bit_cast_union<To, From>{from}.target; }
|
||||
|
||||
/* erasure_cast performs a bit_cast with additional rules to handle types
|
||||
of differing sizes. For integral & enum types, it may perform a narrowing
|
||||
or widing conversion with static_cast if necessary, before doing the final
|
||||
conversion with bit_cast. When casting to or from non-integral, non-enum
|
||||
types it may insert the value into another object with extra padding bytes
|
||||
to satisfy bit_cast's preconditions that both types have the same size. */
|
||||
|
||||
template <class To, class From> using is_erasure_castable = std::integral_constant<bool, traits::is_move_relocating<To>::value && traits::is_move_relocating<From>::value>;
|
||||
|
||||
template <class T, bool = std::is_enum<T>::value> struct identity_or_underlying_type
|
||||
{
|
||||
using type = T;
|
||||
};
|
||||
template <class T> struct identity_or_underlying_type<T, true>
|
||||
{
|
||||
using type = typename std::underlying_type<T>::type;
|
||||
};
|
||||
|
||||
template <class OfSize, class OfSign>
|
||||
using erasure_integer_type = typename std::conditional<std::is_signed<typename identity_or_underlying_type<OfSign>::type>::value, typename std::make_signed<typename identity_or_underlying_type<OfSize>::type>::type, typename std::make_unsigned<typename identity_or_underlying_type<OfSize>::type>::type>::type;
|
||||
|
||||
template <class ErasedType, std::size_t N> struct padded_erasure_object
|
||||
{
|
||||
static_assert(traits::is_move_relocating<ErasedType>::value, "ErasedType must be TriviallyCopyable or MoveRelocating");
|
||||
static_assert(alignof(ErasedType) <= sizeof(ErasedType), "ErasedType must not be over-aligned");
|
||||
ErasedType value;
|
||||
char padding[N];
|
||||
constexpr explicit padded_erasure_object(const ErasedType &v) noexcept
|
||||
: value(v)
|
||||
, padding{}
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_erasure_castable<To, From>::value && (sizeof(To) == sizeof(From)), bool>::type = true> constexpr To erasure_cast(const From &from) noexcept { return bit_cast<To>(from); }
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_erasure_castable<To, From>::value && is_static_castable<To, From>::value && (sizeof(To) < sizeof(From)), bool>::type = true> constexpr To erasure_cast(const From &from) noexcept { return static_cast<To>(bit_cast<erasure_integer_type<From, To>>(from)); }
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_erasure_castable<To, From>::value && is_static_castable<To, From>::value && (sizeof(To) > sizeof(From)), bool>::type = true> constexpr To erasure_cast(const From &from) noexcept { return bit_cast<To>(static_cast<erasure_integer_type<To, From>>(from)); }
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_erasure_castable<To, From>::value && !is_static_castable<To, From>::value && (sizeof(To) < sizeof(From)), bool>::type = true> constexpr To erasure_cast(const From &from) noexcept
|
||||
{
|
||||
return bit_cast<padded_erasure_object<To, sizeof(From) - sizeof(To)>>(from).value;
|
||||
}
|
||||
|
||||
template <class To, class From, typename std::enable_if<is_erasure_castable<To, From>::value && !is_static_castable<To, From>::value && (sizeof(To) > sizeof(From)), bool>::type = true> constexpr To erasure_cast(const From &from) noexcept
|
||||
{
|
||||
return bit_cast<To>(padded_erasure_object<From, sizeof(To) - sizeof(From)>{from});
|
||||
}
|
||||
} // namespace detail
|
||||
BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_END
|
||||
|
||||
#ifndef BOOST_OUTCOME_SYSTEM_ERROR2_FATAL
|
||||
#include <cstdlib> // for abort
|
||||
#ifdef __APPLE__
|
||||
#include <unistd.h> // for write
|
||||
#endif
|
||||
|
||||
BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_BEGIN
|
||||
namespace detail
|
||||
{
|
||||
namespace avoid_stdio_include
|
||||
{
|
||||
#ifndef __APPLE__
|
||||
extern "C" ptrdiff_t write(int, const void *, size_t);
|
||||
#endif
|
||||
}
|
||||
inline void do_fatal_exit(const char *msg)
|
||||
{
|
||||
using namespace avoid_stdio_include;
|
||||
write(2 /*stderr*/, msg, cstrlen(msg));
|
||||
write(2 /*stderr*/, "\n", 1);
|
||||
abort();
|
||||
}
|
||||
} // namespace detail
|
||||
BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE_END
|
||||
//! Prints msg to stderr, and calls `std::terminate()`. Can be overriden via predefinition.
|
||||
#define BOOST_OUTCOME_SYSTEM_ERROR2_FATAL(msg) ::BOOST_OUTCOME_SYSTEM_ERROR2_NAMESPACE::detail::do_fatal_exit(msg)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user