1 /* 2 * Copyright (C) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef _ADLT_TEST_OOP_A_H_ 16 #define _ADLT_TEST_OOP_A_H_ 17 18 #include <cstdio> 19 20 namespace liba { 21 #define LIB_SUFFIX A 22 #define STRINGIZE1(value) #value 23 #define STRINGIZE(value) STRINGIZE1(value) 24 #define LIB_STRING STRINGIZE(LIB_SUFFIX) 25 26 /*** 27 * Constructor/destructor test classes 28 ***/ 29 30 class Class { 31 public: 32 explicit Class(int); 33 ~Class(); 34 int Payload(const char *); 35 36 private: 37 int intVar = 0; 38 }; 39 40 /*** 41 * Vtable test classes 42 ***/ 43 44 class GlobalPoly { 45 public: 46 explicit GlobalPoly(int); 47 virtual int VirtualMethod(); 48 static GlobalPoly *New(int value); 49 static GlobalPoly *NewDerived(int value); 50 51 virtual ~GlobalPoly(); 52 53 protected: 54 int intVar = 0; 55 }; 56 57 class GlobalPolyDerived : public GlobalPoly { 58 public: 59 explicit GlobalPolyDerived(int); 60 int VirtualMethod() override; 61 }; 62 63 class InlinePoly { 64 public: InlinePoly(int value)65 explicit InlinePoly(int value) : intVar(value) {} VirtualMethod()66 virtual int VirtualMethod() { 67 puts("InlinePoly" LIB_STRING "::VirtualMethod"); 68 return intVar; 69 } 70 static InlinePoly *New(int value); 71 static InlinePoly *NewDerived(int value); 72 73 virtual ~InlinePoly() = default; 74 75 protected: 76 int intVar = 0; 77 }; 78 79 class InlinePolyDerived : public InlinePoly { 80 public: InlinePolyDerived(int value)81 explicit InlinePolyDerived(int value) : InlinePoly(value) {} VirtualMethod()82 int VirtualMethod() override { 83 puts("InlinePolyDerived" LIB_STRING "::VirtualMethod"); 84 return intVar + 20; 85 } 86 }; 87 88 class LocalPoly { 89 public: 90 explicit LocalPoly(int value); 91 virtual int VirtualMethod(); 92 static LocalPoly *New(int value); 93 static LocalPoly *NewDerived(int value); 94 95 virtual ~LocalPoly(); 96 97 protected: 98 int intVar = 0; 99 }; 100 101 /*** 102 * Virtual inheritance test classes 103 ***/ 104 105 class DiamondRoot { 106 public: 107 explicit DiamondRoot(int data); 108 virtual ~DiamondRoot() = default; 109 110 virtual int VirtualMethod(); 111 virtual int VirtualMethod1(); 112 virtual int VirtualMethod2(); 113 virtual int VirtualMethod3(); 114 115 protected: 116 int rootData; 117 }; 118 119 class DiamondLeft : public virtual DiamondRoot { 120 public: 121 explicit DiamondLeft(int rootData, int data); 122 ~DiamondLeft() override = default; 123 124 int VirtualMethod1() override; 125 126 protected: 127 int leftData; 128 }; 129 130 class DiamondRight : public virtual DiamondRoot { 131 public: 132 explicit DiamondRight(int rootData, int data); 133 ~DiamondRight() override = default; 134 135 int VirtualMethod2() override; 136 137 protected: 138 int rightData; 139 }; 140 141 class DiamondChild : public DiamondLeft, public DiamondRight { 142 public: 143 explicit DiamondChild(int rootData, int leftData, int rightData, int data); 144 145 int VirtualMethod3() override; 146 147 protected: 148 int childData; 149 }; 150 151 #undef STRINGIZE1 152 #undef STRINGIZE 153 #undef LIB_STRING 154 #undef LIB_SUFFIX 155 } // namespace liba 156 157 #endif