• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "b.h"
16 
17 using namespace libb;
18 
19 #define LIB_SUFFIX B
20 #define STRINGIZE1(value) #value
21 #define STRINGIZE(value) STRINGIZE1(value)
22 #define LIB_STRING STRINGIZE(LIB_SUFFIX)
23 
24 /***
25  * Constructor/destructor test classes
26  ***/
27 
Class(int value)28 Class::Class(int value) : intVar(value + 2) {
29     printf("This is Class" LIB_STRING " C-tor\n");
30 }
31 
~Class()32 Class::~Class() { printf("This is Class" LIB_STRING " D-tor\n"); }
33 
Payload(const char * text)34 int Class::Payload(const char *text) {
35     printf("%s", text);
36     return intVar;
37 }
38 
39 /***
40  * Vtable test classes
41  ***/
42 
GlobalPoly(int value)43 GlobalPoly::GlobalPoly(int value) : intVar(value) {}
VirtualMethod()44 int GlobalPoly::VirtualMethod() {
45     puts("GlobalPoly" LIB_STRING "::VirtualMethod");
46     return intVar;
47 }
48 
New(int value)49 GlobalPoly *GlobalPoly::New(int value) { return new GlobalPoly(value); }
NewDerived(int value)50 GlobalPoly *GlobalPoly::NewDerived(int value) {
51     return new GlobalPolyDerived(value);
52 }
53 GlobalPoly::~GlobalPoly() = default;
54 
GlobalPolyDerived(int value)55 GlobalPolyDerived::GlobalPolyDerived(int value) : GlobalPoly(value) {}
VirtualMethod()56 int GlobalPolyDerived::VirtualMethod() {
57     puts("GlobalPolyDerived" LIB_STRING "::VirtualMethod");
58     return intVar + 10;
59 }
60 
New(int value)61 InlinePoly *InlinePoly::New(int value) { return new InlinePoly(value); }
NewDerived(int value)62 InlinePoly *InlinePoly::NewDerived(int value) {
63     return new InlinePolyDerived(value);
64 }
65 
66 namespace {
67 class LocalPolyDerived : public LocalPoly {
68 public:
LocalPolyDerived(int value)69     explicit LocalPolyDerived(int value) : LocalPoly(value) {}
VirtualMethod()70     int VirtualMethod() override {
71         puts("LocalPolyDerived" LIB_STRING "::VirtualMethod");
72         return intVar + 30;
73     }
74 };
75 } // anonymous namespace
76 
LocalPoly(int value)77 LocalPoly::LocalPoly(int value) : intVar(value) {}
VirtualMethod()78 int LocalPoly::VirtualMethod() {
79     puts("LocalPoly" LIB_STRING "::VirtualMethod");
80     return intVar;
81 }
82 
New(int value)83 LocalPoly *LocalPoly::New(int value) { return new LocalPoly(value); }
NewDerived(int value)84 LocalPoly *LocalPoly::NewDerived(int value) {
85     return new LocalPolyDerived(value);
86 }
87 LocalPoly::~LocalPoly() = default;
88 
89 /***
90  * Virtual inheritance test classes
91  ***/
92 
DiamondRoot(int data)93 DiamondRoot::DiamondRoot(int data) : rootData(data) {}
94 
VirtualMethod()95 int DiamondRoot::VirtualMethod() { return rootData; }
VirtualMethod1()96 int DiamondRoot::VirtualMethod1() { return rootData + 1; }
VirtualMethod2()97 int DiamondRoot::VirtualMethod2() { return rootData - 1; }
VirtualMethod3()98 int DiamondRoot::VirtualMethod3() { return rootData * 2; }
99 
DiamondLeft(int rootData,int data)100 DiamondLeft::DiamondLeft(int rootData, int data)
101         : DiamondRoot(rootData), leftData(data) {}
VirtualMethod1()102 int DiamondLeft::VirtualMethod1() { return leftData; }
103 
DiamondRight(int rootData,int data)104 DiamondRight::DiamondRight(int rootData, int data)
105         : DiamondRoot(rootData), rightData(data) {}
106 
VirtualMethod2()107 int DiamondRight::VirtualMethod2() { return rightData; }
108 
DiamondChild(int rootData,int leftData,int rightData,int data)109 DiamondChild::DiamondChild(int rootData, int leftData, int rightData, int data)
110         : DiamondRoot(rootData), DiamondLeft(rootData, leftData),
111             DiamondRight(rootData, rightData), childData(data) {}
112 
VirtualMethod3()113 int DiamondChild::VirtualMethod3() { return childData; }
114 
115 #undef STRINGIZE1
116 #undef STRINGIZE
117 #undef LIB_STRING
118 #undef LIB_SUFFIX