1 /*
   2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "utilities/debug.hpp"
  26 #include "utilities/traits/isSame.hpp"
  27 
  28 class IsSameTest {
  29   enum EnumType {};
  30   enum EnumType2 {};
  31   union UnionType {};
  32   union UnionType2 {};
  33   class ClassType {};
  34   class ClassType2 {};
  35   class DerivedClassType: ClassType {};
  36   class DerivedClassType2: ClassType2 {};
  37   struct StructType {};
  38   struct StructType2 {};
  39   typedef int PrimitiveType;
  40   typedef long PrimitiveType2;
  41 
  42   static void test() {
  43     STATIC_ASSERT((IsSame<EnumType, EnumType>::value));
  44     STATIC_ASSERT((IsSame<UnionType, UnionType>::value));
  45     STATIC_ASSERT((IsSame<ClassType, ClassType>::value));
  46     STATIC_ASSERT((IsSame<DerivedClassType, DerivedClassType>::value));
  47     STATIC_ASSERT((IsSame<StructType, StructType>::value));
  48     STATIC_ASSERT((IsSame<PrimitiveType, PrimitiveType>::value));
  49 
  50     STATIC_ASSERT((IsSame<volatile EnumType, volatile EnumType>::value));
  51     STATIC_ASSERT((IsSame<volatile UnionType, volatile UnionType>::value));
  52     STATIC_ASSERT((IsSame<volatile ClassType, volatile ClassType>::value));
  53     STATIC_ASSERT((IsSame<volatile DerivedClassType, volatile DerivedClassType>::value));
  54     STATIC_ASSERT((IsSame<volatile StructType, volatile StructType>::value));
  55     STATIC_ASSERT((IsSame<volatile PrimitiveType, volatile PrimitiveType>::value));
  56 
  57     STATIC_ASSERT((IsSame<const EnumType, const EnumType>::value));
  58     STATIC_ASSERT((IsSame<const UnionType, const UnionType>::value));
  59     STATIC_ASSERT((IsSame<const ClassType, const ClassType>::value));
  60     STATIC_ASSERT((IsSame<const DerivedClassType, const DerivedClassType>::value));
  61     STATIC_ASSERT((IsSame<const StructType, const StructType>::value));
  62     STATIC_ASSERT((IsSame<const PrimitiveType, const PrimitiveType>::value));
  63 
  64     STATIC_ASSERT((!IsSame<const EnumType, EnumType>::value));
  65     STATIC_ASSERT((!IsSame<const UnionType, UnionType>::value));
  66     STATIC_ASSERT((!IsSame<const ClassType, ClassType>::value));
  67     STATIC_ASSERT((!IsSame<const DerivedClassType, DerivedClassType>::value));
  68     STATIC_ASSERT((!IsSame<const StructType, StructType>::value));
  69     STATIC_ASSERT((!IsSame<const PrimitiveType, PrimitiveType>::value));
  70     STATIC_ASSERT((!IsSame<EnumType, const EnumType>::value));
  71     STATIC_ASSERT((!IsSame<UnionType, const UnionType>::value));
  72     STATIC_ASSERT((!IsSame<ClassType, const ClassType>::value));
  73     STATIC_ASSERT((!IsSame<DerivedClassType, const DerivedClassType>::value));
  74     STATIC_ASSERT((!IsSame<StructType, const StructType>::value));
  75     STATIC_ASSERT((!IsSame<PrimitiveType, const PrimitiveType>::value));
  76 
  77     STATIC_ASSERT((!IsSame<volatile EnumType, EnumType>::value));
  78     STATIC_ASSERT((!IsSame<volatile UnionType, UnionType>::value));
  79     STATIC_ASSERT((!IsSame<volatile ClassType, ClassType>::value));
  80     STATIC_ASSERT((!IsSame<volatile DerivedClassType, DerivedClassType>::value));
  81     STATIC_ASSERT((!IsSame<volatile StructType, StructType>::value));
  82     STATIC_ASSERT((!IsSame<volatile PrimitiveType, PrimitiveType>::value));
  83     STATIC_ASSERT((!IsSame<EnumType, volatile EnumType>::value));
  84     STATIC_ASSERT((!IsSame<UnionType, volatile UnionType>::value));
  85     STATIC_ASSERT((!IsSame<ClassType, volatile ClassType>::value));
  86     STATIC_ASSERT((!IsSame<DerivedClassType, volatile DerivedClassType>::value));
  87     STATIC_ASSERT((!IsSame<StructType, volatile StructType>::value));
  88     STATIC_ASSERT((!IsSame<PrimitiveType, volatile PrimitiveType>::value));
  89 
  90     STATIC_ASSERT((!IsSame<EnumType, UnionType>::value));
  91     STATIC_ASSERT((!IsSame<EnumType, ClassType>::value));
  92     STATIC_ASSERT((!IsSame<EnumType, DerivedClassType>::value));
  93     STATIC_ASSERT((!IsSame<EnumType, StructType>::value));
  94     STATIC_ASSERT((!IsSame<EnumType, PrimitiveType>::value));
  95 
  96     STATIC_ASSERT((!IsSame<UnionType, EnumType>::value));
  97     STATIC_ASSERT((!IsSame<UnionType, ClassType>::value));
  98     STATIC_ASSERT((!IsSame<UnionType, DerivedClassType>::value));
  99     STATIC_ASSERT((!IsSame<UnionType, StructType>::value));
 100     STATIC_ASSERT((!IsSame<UnionType, PrimitiveType>::value));
 101 
 102     STATIC_ASSERT((!IsSame<ClassType, EnumType>::value));
 103     STATIC_ASSERT((!IsSame<ClassType, UnionType>::value));
 104     STATIC_ASSERT((!IsSame<ClassType, DerivedClassType>::value));
 105     STATIC_ASSERT((!IsSame<ClassType, StructType>::value));
 106     STATIC_ASSERT((!IsSame<ClassType, PrimitiveType>::value));
 107 
 108     STATIC_ASSERT((!IsSame<DerivedClassType, EnumType>::value));
 109     STATIC_ASSERT((!IsSame<DerivedClassType, UnionType>::value));
 110     STATIC_ASSERT((!IsSame<DerivedClassType, ClassType>::value));
 111     STATIC_ASSERT((!IsSame<DerivedClassType, StructType>::value));
 112     STATIC_ASSERT((!IsSame<DerivedClassType, PrimitiveType>::value));
 113 
 114     STATIC_ASSERT((!IsSame<StructType, EnumType>::value));
 115     STATIC_ASSERT((!IsSame<StructType, UnionType>::value));
 116     STATIC_ASSERT((!IsSame<StructType, ClassType>::value));
 117     STATIC_ASSERT((!IsSame<StructType, DerivedClassType>::value));
 118     STATIC_ASSERT((!IsSame<StructType, PrimitiveType>::value));
 119 
 120     STATIC_ASSERT((!IsSame<PrimitiveType, EnumType>::value));
 121     STATIC_ASSERT((!IsSame<PrimitiveType, UnionType>::value));
 122     STATIC_ASSERT((!IsSame<PrimitiveType, ClassType>::value));
 123     STATIC_ASSERT((!IsSame<PrimitiveType, DerivedClassType>::value));
 124     STATIC_ASSERT((!IsSame<PrimitiveType, StructType>::value));
 125 
 126     STATIC_ASSERT((!IsSame<EnumType, EnumType2>::value));
 127     STATIC_ASSERT((!IsSame<UnionType, UnionType2>::value));
 128     STATIC_ASSERT((!IsSame<ClassType, ClassType2>::value));
 129     STATIC_ASSERT((!IsSame<DerivedClassType, DerivedClassType2>::value));
 130     STATIC_ASSERT((!IsSame<StructType, StructType2>::value));
 131     STATIC_ASSERT((!IsSame<PrimitiveType, PrimitiveType2>::value));
 132 
 133     STATIC_ASSERT((!IsSame<int*, volatile int*>::value));
 134     STATIC_ASSERT((!IsSame<int*, int volatile*>::value));
 135     STATIC_ASSERT((!IsSame<int*, const int*>::value));
 136     STATIC_ASSERT((!IsSame<int*, int const*>::value));
 137 
 138     STATIC_ASSERT((!IsSame<int*, long*>::value));
 139 
 140     STATIC_ASSERT((IsSame<int*, int*>::value));
 141   }
 142 };
 143