8183927: Hotspot needs C++ type_traits metaprogramming utilities
authoreosterlund
Tue, 11 Jul 2017 12:00:48 +0200
changeset 46649 439ffb1e05ec
parent 46648 527ce5a7c737
child 46650 642365ee2b92
8183927: Hotspot needs C++ type_traits metaprogramming utilities Summary: This changeset introduces new metaprogramming utilities typically found in <type_traits> in C++11. Reviewed-by: kbarrett, rehn, pliden Contributed-by: erik.osterlund@oracle.com, kim.barrett@oracle.com
hotspot/src/share/vm/metaprogramming/conditional.hpp
hotspot/src/share/vm/metaprogramming/decay.hpp
hotspot/src/share/vm/metaprogramming/enableIf.hpp
hotspot/src/share/vm/metaprogramming/integralConstant.hpp
hotspot/src/share/vm/metaprogramming/isConst.hpp
hotspot/src/share/vm/metaprogramming/isFloatingPoint.hpp
hotspot/src/share/vm/metaprogramming/isIntegral.hpp
hotspot/src/share/vm/metaprogramming/isPointer.hpp
hotspot/src/share/vm/metaprogramming/isSame.hpp
hotspot/src/share/vm/metaprogramming/isSigned.hpp
hotspot/src/share/vm/metaprogramming/isVolatile.hpp
hotspot/src/share/vm/metaprogramming/removeCV.hpp
hotspot/src/share/vm/metaprogramming/removePointer.hpp
hotspot/src/share/vm/metaprogramming/removeReference.hpp
hotspot/test/native/metaprogramming/test_conditional.cpp
hotspot/test/native/metaprogramming/test_decay.cpp
hotspot/test/native/metaprogramming/test_enableIf.cpp
hotspot/test/native/metaprogramming/test_isConst.cpp
hotspot/test/native/metaprogramming/test_isFloatingPoint.cpp
hotspot/test/native/metaprogramming/test_isIntegral.cpp
hotspot/test/native/metaprogramming/test_isPointer.cpp
hotspot/test/native/metaprogramming/test_isSame.cpp
hotspot/test/native/metaprogramming/test_isSigned.cpp
hotspot/test/native/metaprogramming/test_isVolatile.cpp
hotspot/test/native/metaprogramming/test_removeCV.cpp
hotspot/test/native/metaprogramming/test_removePointer.cpp
hotspot/test/native/metaprogramming/test_removeReference.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/conditional.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_CONDITIONAL_HPP
+#define SHARE_VM_METAPROGRAMMING_CONDITIONAL_HPP
+
+#include "memory/allocation.hpp"
+
+// This trait evaluates its typedef called "type" to TrueType iff the condition
+// is true. Otherwise it evaluates to FalseType.
+
+template <bool condition, typename TrueType, typename FalseType>
+struct Conditional: AllStatic {
+  typedef TrueType type;
+};
+
+template <typename TrueType, typename FalseType>
+struct Conditional<false, TrueType, FalseType>: AllStatic {
+  typedef FalseType type;
+};
+
+#endif // SHARE_VM_METAPROGRAMMING_CONDITIONAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/decay.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_DECAY_HPP
+#define SHARE_VM_METAPROGRAMMING_DECAY_HPP
+
+#include "memory/allocation.hpp"
+#include "metaprogramming/removeCV.hpp"
+#include "metaprogramming/removeReference.hpp"
+
+// This trait trims the type from CV qualifiers and references.
+// This trait provides a subset of the functionality of std::decay;
+// array types and function types are not supported here.
+
+template <typename T>
+struct Decay: AllStatic {
+  typedef typename RemoveCV<typename RemoveReference<T>::type>::type type;
+};
+
+#endif // SHARE_VM_METAPROGRAMMING_DECAY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/enableIf.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ENABLEIF_HPP
+#define SHARE_VM_METAPROGRAMMING_ENABLEIF_HPP
+
+#include "memory/allocation.hpp"
+
+// This metaprogramming tool allows explicitly enabling and disabling overloads
+// of member functions depending on whether the condition B holds true.
+// For example typename EnableIf<IsPointer<T>::value>::type func(T ptr) would
+// only become an overload the compiler chooses from if the type T is a pointer.
+// If it is not, then the template definition is not expanded and there will be
+// no compiler error if there is another overload of func that is selected when
+// T is not a pointer. Like for example
+// typename EnableIf<!IsPointer<T>::value>::type func(T not_ptr)
+
+template <bool B, typename T = void>
+struct EnableIf: AllStatic {};
+
+template <typename T>
+struct EnableIf<true, T>: AllStatic {
+  typedef T type;
+};
+
+#endif // SHARE_VM_METAPROGRAMMING_ENABLEIF_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/integralConstant.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_INTEGRALCONSTANT_HPP
+#define SHARE_VM_METAPROGRAMMING_INTEGRALCONSTANT_HPP
+
+#include "memory/allocation.hpp"
+
+// An Integral Constant is a class providing a compile-time value of an
+// integral type.  An Integral Constant is also a nullary metafunction,
+// returning itself.  An integral constant object is implicitly
+// convertible to the associated value.
+//
+// A type n is a model of Integral Constant if it meets the following
+// requirements:
+//
+// n::ValueType                : The integral type of n::value
+// n::value                    : An integral constant expression
+// n::type                     : IsSame<n::type, n>::value is true
+// n::value_type const c = n() : c == n::value
+
+// A model of the Integer Constant concept.
+// T is an integral type, and is the value_type.
+// v is an integral constant, and is the value.
+template<typename T, T v>
+struct IntegralConstant : AllStatic {
+  typedef T value_type;
+  static const value_type value = v;
+  typedef IntegralConstant<T, v> type;
+  operator value_type() { return value; }
+};
+
+// A bool valued IntegralConstant whose value is true.
+typedef IntegralConstant<bool, true> TrueType;
+
+// A bool valued IntegralConstant whose value is false.
+typedef IntegralConstant<bool, false> FalseType;
+
+#endif // SHARE_VM_METAPROGRAMMING_INTEGRALCONSTANT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isConst.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISCONST_HPP
+#define SHARE_VM_METAPROGRAMMING_ISCONST_HPP
+
+#include "metaprogramming/integralConstant.hpp"
+
+template <typename T> struct IsConst: public FalseType {};
+template <typename T> struct IsConst<const T>: public TrueType {};
+
+#endif // SHARE_VM_METAPROGRAMMING_ISCONST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isFloatingPoint.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISFLOATINGPOINT_HPP
+#define SHARE_VM_METAPROGRAMMING_ISFLOATINGPOINT_HPP
+
+#include "metaprogramming/integralConstant.hpp"
+
+// This metafunction returns true iff the type T (irrespective of CV qualifiers)
+// is a floating point type.
+
+template <typename T> struct IsFloatingPoint: public FalseType {};
+
+template <> struct IsFloatingPoint<float>: public TrueType {};
+template <> struct IsFloatingPoint<const float>: public TrueType {};
+template <> struct IsFloatingPoint<volatile float>: public TrueType {};
+template <> struct IsFloatingPoint<const volatile float>: public TrueType {};
+
+template <> struct IsFloatingPoint<double>: public TrueType {};
+template <> struct IsFloatingPoint<const double>: public TrueType {};
+template <> struct IsFloatingPoint<volatile double>: public TrueType {};
+template <> struct IsFloatingPoint<const volatile double>: public TrueType {};
+
+template <> struct IsFloatingPoint<long double>: public TrueType {};
+template <> struct IsFloatingPoint<const long double>: public TrueType {};
+template <> struct IsFloatingPoint<volatile long double>: public TrueType {};
+template <> struct IsFloatingPoint<const volatile long double>: public TrueType {};
+
+#endif // SHARE_VM_METAPROGRAMMING_ISFLOATINGPOINT_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isIntegral.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISINTEGRAL_HPP
+#define SHARE_VM_METAPROGRAMMING_ISINTEGRAL_HPP
+
+#include "memory/allocation.hpp"
+#include "metaprogramming/integralConstant.hpp"
+#include "metaprogramming/isSigned.hpp"
+#include "metaprogramming/removeCV.hpp"
+#include <limits>
+
+// This metafunction returns true iff the type T (irrespective of CV qualifiers)
+// is an integral type. Note that this is false for enums.
+
+template<typename T>
+struct IsIntegral
+  : public IntegralConstant<bool, std::numeric_limits<typename RemoveCV<T>::type>::is_integer>
+{};
+
+// This metafunction returns true iff the type T (irrespective of CV qualifiers)
+// is a signed integral type. Note that this is false for enums.
+
+template<typename T>
+struct IsSignedIntegral
+  : public IntegralConstant<bool, IsIntegral<T>::value && IsSigned<T>::value>
+{};
+
+// This metafunction returns true iff the type T (irrespective of CV qualifiers)
+// is an unsigned integral type. Note that this is false for enums.
+
+template<typename T>
+struct IsUnsignedIntegral
+  : public IntegralConstant<bool, IsIntegral<T>::value && !IsSigned<T>::value>
+{};
+
+#endif // SHARE_VM_METAPROGRAMMING_ISINTEGRAL_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isPointer.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISPOINTER_HPP
+#define SHARE_VM_METAPROGRAMMING_ISPOINTER_HPP
+
+#include "metaprogramming/integralConstant.hpp"
+
+// This metafunction returns true iff the type T is (irrespective of CV qualifiers)
+// a pointer type.
+
+template <typename T> class IsPointer: public FalseType {};
+
+template <typename T> class IsPointer<T*>: public TrueType {};
+template <typename T> class IsPointer<T* const>: public TrueType {};
+template <typename T> class IsPointer<T* volatile>: public TrueType {};
+template <typename T> class IsPointer<T* const volatile>: public TrueType {};
+
+#endif // SHARE_VM_METAPROGRAMMING_ISPOINTER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isSame.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISSAME_HPP
+#define SHARE_VM_METAPROGRAMMING_ISSAME_HPP
+
+#include "metaprogramming/integralConstant.hpp"
+
+// This trait returns true iff the two types X and Y are the same
+
+template <typename X, typename Y>
+struct IsSame: public FalseType {};
+
+template <typename X>
+struct IsSame<X, X>: public TrueType {};
+
+#endif // SHARE_VM_METAPROGRAMMING_ISSAME_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isSigned.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISSIGNED_HPP
+#define SHARE_VM_METAPROGRAMMING_ISSIGNED_HPP
+
+#include "memory/allocation.hpp"
+#include "metaprogramming/integralConstant.hpp"
+#include "metaprogramming/removeCV.hpp"
+#include <limits>
+
+template<typename T>
+struct IsSigned
+  : public IntegralConstant<bool, std::numeric_limits<typename RemoveCV<T>::type>::is_signed>
+{};
+
+#endif //  SHARE_VM_METAPROGRAMMING_ISSIGNED_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/isVolatile.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_ISVOLATILE_HPP
+#define SHARE_VM_METAPROGRAMMING_ISVOLATILE_HPP
+
+#include "metaprogramming/integralConstant.hpp"
+
+template <typename T> struct IsVolatile: public FalseType {};
+template <typename T> struct IsVolatile<volatile T>: public TrueType {};
+
+#endif // SHARE_VM_METAPROGRAMMING_ISVOLATILE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/removeCV.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_REMOVECV_HPP
+#define SHARE_VM_METAPROGRAMMING_REMOVECV_HPP
+
+#include "memory/allocation.hpp"
+
+template <typename T>
+struct RemoveCV: AllStatic {
+  typedef T type;
+};
+
+template <typename T>
+struct RemoveCV<const T>: AllStatic {
+  typedef T type;
+};
+
+template <typename T>
+struct RemoveCV<volatile T>: AllStatic {
+  typedef T type;
+};
+
+template <typename T>
+struct RemoveCV<const volatile T>: AllStatic {
+  typedef T type;
+};
+
+#endif // SHARE_VM_METAPROGRAMMING_REMOVECV_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/removePointer.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_REMOVEPOINTER_HPP
+#define SHARE_VM_METAPROGRAMMING_REMOVEPOINTER_HPP
+
+#include "memory/allocation.hpp"
+
+// This metafunction returns for a type T either the underlying type behind
+// the pointer iff T is a pointer type (irrespective of CV qualifiers),
+// or the same type T if T is not a pointer type.
+
+template <typename T> struct RemovePointer: AllStatic { typedef T type; };
+
+template <typename T> struct RemovePointer<T*>: AllStatic { typedef T type; };
+template <typename T> struct RemovePointer<T* const>: AllStatic { typedef T type; };
+template <typename T> struct RemovePointer<T* volatile>: AllStatic { typedef T type; };
+template <typename T> struct RemovePointer<T* const volatile>: AllStatic { typedef T type; };
+
+#endif // SHARE_VM_METAPROGRAMMING_REMOVEPOINTER_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/metaprogramming/removeReference.hpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_METAPROGRAMMING_REMOVEREFERENCE_HPP
+#define SHARE_VM_METAPROGRAMMING_REMOVEREFERENCE_HPP
+
+#include "memory/allocation.hpp"
+
+// This metafunction returns for a type T either the underlying type behind
+// the reference iff T is a reference type, or the same type T if T is not
+// a reference type.
+
+template <typename T> struct RemoveReference: AllStatic { typedef T type; };
+
+template <typename T> struct RemoveReference<T&>: AllStatic { typedef T type; };
+
+#endif // SHARE_VM_METAPROGRAMMING_REMOVEREFERENCE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_conditional.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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/conditional.hpp"
+#include "metaprogramming/isSame.hpp"
+#include "utilities/debug.hpp"
+
+class ConditionalTest {
+  class A: AllStatic {};
+  class B: AllStatic {};
+
+  typedef Conditional<true, A, B>::type A_B_if_true;
+  static const bool A_B_if_true_is_A = IsSame<A_B_if_true, A>::value;
+  static const bool A_B_if_true_is_B = IsSame<A_B_if_true, B>::value;
+  STATIC_ASSERT(A_B_if_true_is_A);
+  STATIC_ASSERT(!A_B_if_true_is_B);
+
+  typedef Conditional<false, A, B>::type A_B_if_false;
+  static const bool A_B_if_false_is_A = IsSame<A_B_if_false, A>::value;
+  static const bool A_B_if_false_is_B = IsSame<A_B_if_false, B>::value;
+  STATIC_ASSERT(!A_B_if_false_is_A);
+  STATIC_ASSERT(A_B_if_false_is_B);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_decay.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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/decay.hpp"
+#include "metaprogramming/isSame.hpp"
+#include "utilities/debug.hpp"
+
+class TestDecay: AllStatic {
+  class A: AllStatic {};
+
+  typedef const volatile A cvA;
+  typedef const volatile A& cvAref;
+  typedef const volatile A* cvAptr;
+  typedef const volatile A* const volatile cvAptrcv;
+  typedef A& Aref;
+
+  typedef Decay<cvAref>::type rr_cvAref;
+  static const bool decay_cvAref_is_A = IsSame<rr_cvAref, A>::value;
+  STATIC_ASSERT(decay_cvAref_is_A);
+
+  typedef Decay<cvAptrcv>::type rr_cvAptrcv;
+  static const bool decay_cvAptrcv_is_cvAptr = IsSame<rr_cvAptrcv, cvAptr>::value;
+  STATIC_ASSERT(decay_cvAptrcv_is_cvAptr);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_enableIf.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * 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/enableIf.hpp"
+#include "utilities/debug.hpp"
+
+class EnableIfTest {
+  class A: AllStatic {
+  public:
+    template <bool condition>
+    static typename EnableIf<condition, char>::type test();
+    template <bool condition>
+    static typename EnableIf<!condition, long>::type test();
+  };
+
+  static const bool A_test_true_is_char = sizeof(A::test<true>()) == sizeof(char);
+  STATIC_ASSERT(A_test_true_is_char);
+
+  static const bool A_test_false_is_long = sizeof(A::test<false>()) == sizeof(long);
+  STATIC_ASSERT(A_test_false_is_long);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isConst.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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/isConst.hpp"
+#include "utilities/debug.hpp"
+
+class IsConstTest {
+  class A: AllStatic {};
+
+  STATIC_ASSERT(!IsConst<volatile int>::value);
+  STATIC_ASSERT(IsConst<const volatile int>::value);
+  STATIC_ASSERT(IsConst<const int>::value);
+  STATIC_ASSERT(!IsConst<int>::value);
+
+  STATIC_ASSERT(!IsConst<volatile A>::value);
+  STATIC_ASSERT(IsConst<const A>::value);
+  STATIC_ASSERT(!IsConst<A>::value);
+
+  STATIC_ASSERT(!IsConst<const A*>::value);
+  STATIC_ASSERT(IsConst<A* const>::value);
+  STATIC_ASSERT(IsConst<const A* const>::value);
+  STATIC_ASSERT(IsConst<A* const volatile>::value);
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isFloatingPoint.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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/isFloatingPoint.hpp"
+#include "utilities/debug.hpp"
+
+class IsFloatingPointTest: AllStatic {
+  STATIC_ASSERT(IsFloatingPoint<float>::value);
+  STATIC_ASSERT(IsFloatingPoint<double>::value);
+  STATIC_ASSERT(IsFloatingPoint<long double>::value);
+
+  STATIC_ASSERT(IsFloatingPoint<double const>::value);
+  STATIC_ASSERT(!IsFloatingPoint<double&>::value);
+
+  STATIC_ASSERT(!IsFloatingPoint<int>::value);
+  STATIC_ASSERT(!IsFloatingPoint<unsigned int>::value);
+  STATIC_ASSERT(!IsFloatingPoint<signed int>::value);
+
+  class A: AllStatic {};
+  STATIC_ASSERT(!IsFloatingPoint<A>::value);
+  STATIC_ASSERT(!IsFloatingPoint<A*>::value);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isIntegral.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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/isIntegral.hpp"
+#include "utilities/debug.hpp"
+
+class IsIntegralTest: AllStatic {
+  class A: AllStatic {};
+
+  static const bool ii_voidptr = IsIntegral<void*>::value;
+  STATIC_ASSERT(!ii_voidptr);
+
+  static const bool ii_Aptr = IsIntegral<A*>::value;
+  STATIC_ASSERT(!ii_Aptr);
+
+  static const bool ii_cAptr = IsIntegral<const A*>::value;
+  STATIC_ASSERT(!ii_cAptr);
+
+  static const bool ii_vAptr = IsIntegral<volatile A*>::value;
+  STATIC_ASSERT(!ii_vAptr);
+
+  static const bool ii_Avptr = IsIntegral<A* volatile>::value;
+  STATIC_ASSERT(!ii_Avptr);
+
+  static const bool ii_intptrt = IsIntegral<intptr_t>::value;
+  STATIC_ASSERT(ii_intptrt);
+
+  static const bool ii_char = IsIntegral<char>::value;
+  STATIC_ASSERT(ii_char);
+
+  static const bool ii_cintptrt = IsIntegral<const intptr_t>::value;
+  STATIC_ASSERT(ii_cintptrt);
+
+  static const bool ii_vintptrt = IsIntegral<volatile intptr_t>::value;
+  STATIC_ASSERT(ii_vintptrt);
+
+  static const bool ii_cvintptrt = IsIntegral<const volatile intptr_t>::value;
+  STATIC_ASSERT(ii_cvintptrt);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isPointer.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,53 @@
+/*
+ * 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/isPointer.hpp"
+#include "utilities/debug.hpp"
+
+class IsPointerTest: AllStatic {
+  class A: AllStatic {};
+
+  static const bool ip_voidptr = IsPointer<void*>::value;
+  STATIC_ASSERT(ip_voidptr);
+
+  static const bool ip_Aptr = IsPointer<A*>::value;
+  STATIC_ASSERT(ip_Aptr);
+
+  static const bool ip_cAptr = IsPointer<const A*>::value;
+  STATIC_ASSERT(ip_cAptr);
+
+  static const bool ip_vAptr = IsPointer<volatile A*>::value;
+  STATIC_ASSERT(ip_vAptr);
+
+  static const bool ip_Avptr = IsPointer<A* volatile>::value;
+  STATIC_ASSERT(ip_Avptr);
+
+  static const bool ip_intptrt = IsPointer<intptr_t>::value;
+  STATIC_ASSERT(!ip_intptrt);
+
+  static const bool ip_char = IsPointer<char>::value;
+  STATIC_ASSERT(!ip_char);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isSame.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,51 @@
+/*
+ * 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 "utilities/debug.hpp"
+
+class IsSameTest: AllStatic {
+  class A: AllStatic {};
+  class B: AllStatic {};
+
+  static const bool const_A_is_A = IsSame<const A, A>::value;
+  STATIC_ASSERT(!const_A_is_A);
+
+  static const bool volatile_A_is_A = IsSame<volatile A, A>::value;
+  STATIC_ASSERT(!volatile_A_is_A);
+
+  static const bool Aref_is_A = IsSame<A&, A>::value;
+  STATIC_ASSERT(!Aref_is_A);
+
+  static const bool Aptr_is_A = IsSame<A*, A>::value;
+  STATIC_ASSERT(!Aptr_is_A);
+
+  static const bool A_is_B = IsSame<A, B>::value;
+  STATIC_ASSERT(!A_is_B);
+
+  static const bool A_is_A = IsSame<A, A>::value;
+  STATIC_ASSERT(A_is_A);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isSigned.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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/isSigned.hpp"
+#include "utilities/debug.hpp"
+
+class IsSignedTest: AllStatic {
+  template <typename SignedType, typename UnsignedType>
+  class TestIntegers: AllStatic {
+    static const bool _signed_type_is_signed = IsSigned<SignedType>::value;
+    STATIC_ASSERT(_signed_type_is_signed);
+    static const bool _unsigned_type_is_unsigned = !IsSigned<UnsignedType>::value;
+    STATIC_ASSERT(_unsigned_type_is_unsigned);
+
+    static const bool _cvsigned_type_is_signed = IsSigned<const volatile SignedType>::value;
+    STATIC_ASSERT(_signed_type_is_signed);
+    static const bool _cvunsigned_type_is_unsigned = !IsSigned<const volatile UnsignedType>::value;
+    STATIC_ASSERT(_unsigned_type_is_unsigned);
+  };
+
+  const TestIntegers<int8_t,  uint8_t>  TestByte;
+  const TestIntegers<int16_t, uint16_t> TestShort;
+  const TestIntegers<int32_t, uint32_t> TestInt;
+  const TestIntegers<int64_t, uint64_t> TestLong;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_isVolatile.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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/isVolatile.hpp"
+#include "utilities/debug.hpp"
+
+class IsVolatileTest {
+  class A: AllStatic {};
+
+  STATIC_ASSERT(IsVolatile<volatile int>::value);
+  STATIC_ASSERT(IsVolatile<const volatile int>::value);
+  STATIC_ASSERT(!IsVolatile<const int>::value);
+  STATIC_ASSERT(!IsVolatile<int>::value);
+
+  STATIC_ASSERT(IsVolatile<volatile A>::value);
+  STATIC_ASSERT(!IsVolatile<const A>::value);
+  STATIC_ASSERT(!IsVolatile<A>::value);
+
+  STATIC_ASSERT(!IsVolatile<volatile A*>::value);
+  STATIC_ASSERT(IsVolatile<A* volatile>::value);
+  STATIC_ASSERT(IsVolatile<volatile A* volatile>::value);
+  STATIC_ASSERT(IsVolatile<A* const volatile>::value);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_removeCV.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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/removeCV.hpp"
+#include "metaprogramming/isSame.hpp"
+#include "utilities/debug.hpp"
+
+class RemoveCVTest {
+  class A: AllStatic {};
+
+  typedef const A cA;
+  typedef volatile A vA;
+  typedef const volatile A cvA;
+  typedef A* Aptr;
+  typedef const A* cAptr;
+  typedef A* const Aptrc;
+  typedef const A* const cAptrc;
+  typedef A& Aref;
+  typedef const A& cAref;
+
+  typedef RemoveCV<A>::type rcv_A;
+  static const bool rcv_A_is_A = IsSame<rcv_A, A>::value;
+  STATIC_ASSERT(rcv_A_is_A);
+
+  typedef RemoveCV<cA>::type rcv_cA;
+  static const bool rcv_cA_is_A = IsSame<rcv_cA, A>::value;
+  STATIC_ASSERT(rcv_cA_is_A);
+
+  typedef RemoveCV<vA>::type rcv_vA;
+  static const bool rcv_vA_is_A = IsSame<rcv_vA, A>::value;
+  STATIC_ASSERT(rcv_vA_is_A);
+
+  typedef RemoveCV<cvA>::type rcv_cvA;
+  static const bool rcv_cvA_is_A = IsSame<rcv_cvA, A>::value;
+  STATIC_ASSERT(rcv_cvA_is_A);
+
+  typedef RemoveCV<cAptr>::type rcv_cAptr;
+  static const bool rcv_cAptr_is_cAptr = IsSame<rcv_cAptr, cAptr>::value;
+  STATIC_ASSERT(rcv_cAptr_is_cAptr);
+
+  typedef RemoveCV<Aptrc>::type rcv_Aptrc;
+  static const bool rcv_Aptrc_is_Aptr = IsSame<rcv_Aptrc, Aptr>::value;
+  STATIC_ASSERT(rcv_Aptrc_is_Aptr);
+
+  typedef RemoveCV<cAptrc>::type rcv_cAptrc;
+  static const bool rcv_cAptrc_is_cAptr = IsSame<rcv_cAptrc, cAptr>::value;
+  STATIC_ASSERT(rcv_cAptrc_is_cAptr);
+
+  typedef RemoveCV<cAref>::type rcv_cAref;
+  static const bool rcv_cAref_is_cAref = IsSame<rcv_cAref, cAref>::value;
+  STATIC_ASSERT(rcv_cAref_is_cAref);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_removePointer.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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/removePointer.hpp"
+#include "metaprogramming/isSame.hpp"
+#include "utilities/debug.hpp"
+
+class RemovePointerTest {
+  class A: AllStatic {};
+
+  typedef const volatile A cvA;
+  typedef const volatile A& cvAref;
+  typedef const volatile A* const volatile cvAptrcv;
+
+  typedef RemovePointer<cvAref>::type rp_cvAref;
+  static const bool rp_cvAref_is_cvAref = IsSame<rp_cvAref, cvAref>::value;
+  STATIC_ASSERT(rp_cvAref_is_cvAref);
+
+  typedef RemovePointer<cvAptrcv>::type rp_cvAptrcv;
+  static const bool rp_cvAptrcv_is_cvAptrcv = IsSame<rp_cvAptrcv, cvA>::value;
+  STATIC_ASSERT(rp_cvAptrcv_is_cvAptrcv);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/metaprogramming/test_removeReference.cpp	Tue Jul 11 12:00:48 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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/removeReference.hpp"
+#include "metaprogramming/isSame.hpp"
+#include "utilities/debug.hpp"
+
+class RemoveReferenceTest {
+  class A: AllStatic {};
+
+  typedef const volatile A cvA;
+  typedef const volatile A& cvAref;
+  typedef const volatile A* const volatile cvAptrcv;
+
+  typedef RemoveReference<cvAref>::type rr_cvAref;
+  static const bool rr_cvAref_is_cvAref = IsSame<rr_cvAref, cvA>::value;
+  STATIC_ASSERT(rr_cvAref_is_cvAref);
+
+  typedef RemoveReference<cvAptrcv>::type rr_cvAptrcv;
+  static const bool rr_cvAptrcv_is_cvAptrcv = IsSame<rr_cvAptrcv, cvAptrcv>::value;
+  STATIC_ASSERT(rr_cvAptrcv_is_cvAptrcv);
+};