--- /dev/null 2017-08-13 17:24:39.427578209 -0400 +++ new/test/native/metaprogramming/test_integerTypes.cpp 2017-08-17 19:25:52.813722611 -0400 @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "memory/allocation.hpp" +#include "metaprogramming/isSame.hpp" +#include "metaprogramming/primitiveConversions.hpp" +#include "unittest.hpp" +#include "utilities/debug.hpp" + +struct PrimitiveConversionsTestSupport: AllStatic { + + template struct SignedTypeOfSize; + template struct UnsignedTypeOfSize; + + template struct Signed; + template struct Unsigned; +}; + +#define DEFINE_CANONICAL_SIGNED_TYPE(T) \ + template<> \ + struct PrimitiveConversionsTestSupport::SignedTypeOfSize \ + : public AllStatic \ + { \ + typedef T type; \ + }; + +#define DEFINE_CANONICAL_UNSIGNED_TYPE(T) \ + template<> \ + struct PrimitiveConversionsTestSupport::UnsignedTypeOfSize \ + : public AllStatic \ + { \ + typedef T type; \ + }; + +#define DEFINE_INTEGER_TYPES_OF_SIZE(NBITS) \ + DEFINE_CANONICAL_SIGNED_TYPE(int ## NBITS ## _t) \ + DEFINE_CANONICAL_UNSIGNED_TYPE(uint ## NBITS ## _t) + +DEFINE_INTEGER_TYPES_OF_SIZE(8) +DEFINE_INTEGER_TYPES_OF_SIZE(16) +DEFINE_INTEGER_TYPES_OF_SIZE(32) +DEFINE_INTEGER_TYPES_OF_SIZE(64) + +#undef DEFINE_INTEGER_TYPES_OF_SIZE +#undef DEFINE_CANONICAL_SIGNED_TYPE +#undef DEFINE_CANONICAL_UNSIGNED_TYPE + +template +struct PrimitiveConversionsTestSupport::Signed + : public SignedTypeOfSize +{}; + +template +struct PrimitiveConversionsTestSupport::Unsigned + : public UnsignedTypeOfSize +{}; + +TEST(PrimitiveConversionsTest, round_trip_int) { + int sfive = 5; + int mfive = -5; + uint ufive = 5u; + + typedef PrimitiveConversionsTestSupport::Signed::type SI; + typedef PrimitiveConversionsTestSupport::Unsigned::type UI; + + EXPECT_EQ(sfive, PrimitiveConversions::cast(PrimitiveConversions::cast(sfive))); + EXPECT_EQ(sfive, PrimitiveConversions::cast(PrimitiveConversions::cast(sfive))); + + EXPECT_EQ(mfive, PrimitiveConversions::cast(PrimitiveConversions::cast(mfive))); + EXPECT_EQ(mfive, PrimitiveConversions::cast(PrimitiveConversions::cast(mfive))); + + EXPECT_EQ(ufive, PrimitiveConversions::cast(PrimitiveConversions::cast(ufive))); + EXPECT_EQ(ufive, PrimitiveConversions::cast(PrimitiveConversions::cast(ufive))); +} + +TEST(PrimitiveConversionsTest, round_trip_float) { + float ffive = 5.0f; + double dfive = 5.0; + + typedef PrimitiveConversionsTestSupport::Signed::type SF; + typedef PrimitiveConversionsTestSupport::Unsigned::type UF; + + typedef PrimitiveConversionsTestSupport::Signed::type SD; + typedef PrimitiveConversionsTestSupport::Unsigned::type UD; + + EXPECT_EQ(ffive, PrimitiveConversions::cast(PrimitiveConversions::cast(ffive))); + EXPECT_EQ(ffive, PrimitiveConversions::cast(PrimitiveConversions::cast(ffive))); + + EXPECT_EQ(dfive, PrimitiveConversions::cast(PrimitiveConversions::cast(dfive))); + EXPECT_EQ(dfive, PrimitiveConversions::cast(PrimitiveConversions::cast(dfive))); +} + +TEST(PrimitiveConversionsTest, round_trip_ptr) { + int five = 5; + int* pfive = &five; + const int* cpfive = &five; + + typedef PrimitiveConversionsTestSupport::Signed::type SIP; + typedef PrimitiveConversionsTestSupport::Unsigned::type UIP; + + EXPECT_EQ(pfive, PrimitiveConversions::cast(PrimitiveConversions::cast(pfive))); + EXPECT_EQ(pfive, PrimitiveConversions::cast(PrimitiveConversions::cast(pfive))); + + EXPECT_EQ(cpfive, PrimitiveConversions::cast(PrimitiveConversions::cast(cpfive))); + EXPECT_EQ(cpfive, PrimitiveConversions::cast(PrimitiveConversions::cast(cpfive))); +}