From a11e68f83babcb3effdb4e6144ad8a675e9ea7b4 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Wed, 24 Jan 2018 01:53:24 +0000 Subject: [PATCH] Implement P0463R1: 'Endian just Endian'. Reviewed as https://reviews.llvm.org/D35472 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@323296 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/type_traits | 15 ++++++ .../meta/meta.type.synop/endian.pass.cpp | 47 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 test/std/utilities/meta/meta.type.synop/endian.pass.cpp diff --git a/include/type_traits b/include/type_traits index 8012203b4..13a771264 100644 --- a/include/type_traits +++ b/include/type_traits @@ -4941,6 +4941,21 @@ struct __can_extract_map_key<_ValTy, _Key, _Key, _RawValTy> #endif +#if _LIBCPP_STD_VER > 17 +enum class endian +{ + little = 0xDEAD, + big = 0xFACE, +#if defined(_LIBCPP_LITTLE_ENDIAN) + native = little +#elif defined(_LIBCPP_BIG_ENDIAN) + native = big +#else + native = 0xCAFE +#endif +}; +#endif + _LIBCPP_END_NAMESPACE_STD #if _LIBCPP_STD_VER > 14 diff --git a/test/std/utilities/meta/meta.type.synop/endian.pass.cpp b/test/std/utilities/meta/meta.type.synop/endian.pass.cpp new file mode 100644 index 000000000..19a919842 --- /dev/null +++ b/test/std/utilities/meta/meta.type.synop/endian.pass.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +// enum class endian; + +#include +#include +#include + +#include "test_macros.h" + +int main() { + typedef std::endian E; + static_assert(std::is_enum::value, ""); + +// Check that E is a scoped enum by checking for conversions. + typedef std::underlying_type::type UT; + static_assert(!std::is_convertible::value, ""); + +// test that the enumeration values exist + static_assert( std::endian::little == std::endian::little ); + static_assert( std::endian::big == std::endian::big ); + static_assert( std::endian::native == std::endian::native ); + static_assert( std::endian::little != std::endian::big ); + +// Technically not required, but true on all existing machines + static_assert( std::endian::native == std::endian::little || + std::endian::native == std::endian::big ); + +// Try to check at runtime + { + uint32_t i = 0x01020304; + char c[4]; + static_assert(sizeof(i) == sizeof(c)); + std::memcpy(c, &i, sizeof(c)); + + assert ((c[0] == 1) == (std::endian::native == std::endian::big)); + } +}