Author: marshall Date: Tue Jan 23 17:53:24 2018 New Revision: 323296 URL: http://llvm.org/viewvc/llvm-project?rev=323296&view=rev Log: Implement P0463R1: 'Endian just Endian'. Reviewed as https://reviews.llvm.org/D35472
Added: libcxx/trunk/test/std/utilities/meta/meta.type.synop/endian.pass.cpp Modified: libcxx/trunk/include/type_traits Modified: libcxx/trunk/include/type_traits URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=323296&r1=323295&r2=323296&view=diff ============================================================================== --- libcxx/trunk/include/type_traits (original) +++ libcxx/trunk/include/type_traits Tue Jan 23 17:53:24 2018 @@ -4941,6 +4941,21 @@ struct __can_extract_map_key<_ValTy, _Ke #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 Added: libcxx/trunk/test/std/utilities/meta/meta.type.synop/endian.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.type.synop/endian.pass.cpp?rev=323296&view=auto ============================================================================== --- libcxx/trunk/test/std/utilities/meta/meta.type.synop/endian.pass.cpp (added) +++ libcxx/trunk/test/std/utilities/meta/meta.type.synop/endian.pass.cpp Tue Jan 23 17:53:24 2018 @@ -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 <type_traits> +#include <cstring> +#include <cassert> + +#include "test_macros.h" + +int main() { + typedef std::endian E; + static_assert(std::is_enum<std::endian>::value, ""); + +// Check that E is a scoped enum by checking for conversions. + typedef std::underlying_type<std::endian>::type UT; + static_assert(!std::is_convertible<std::endian, UT>::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)); + } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits