7#include <gtest/gtest.h>
28int global_nb_create = 0;
29int global_nb_destroy = 0;
40 TestBaseType(
int a,
const std::string& b) : m_a(a), m_b(b)
42 std::cout <<
"CREATE ME this=" <<
this <<
"\n";
47 std::cout <<
"CREATE ME (copy) this=" <<
this <<
"\n";
51 std::cout <<
"DELETE ME this=" <<
this <<
"\n";
55 int pa()
const {
return m_a; }
56 const std::string& pb()
const {
return m_b; }
57 void print(
const std::string& x)
const
59 std::cout << x <<
" A=" << pa() <<
" B=" << pb()
60 <<
" this=" <<
this <<
"\n";
75 std::cout <<
"CREATE ME this=" <<
this <<
"\n";
80 std::cout <<
"DELETE ME this=" <<
this <<
"\n";
84 int pa()
const {
return m_a; }
85 const std::string& pb()
const {
return m_b; }
86 void print(
const std::string& x)
const
88 std::cout << x <<
" A=" << pa() <<
" B=" << pb()
89 <<
" this=" <<
this <<
"\n";
108 std::cout <<
"DELETE ME (TestRefOwn) this=" <<
this <<
"\n";
128 ARCCORE_INTERNAL_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
133using namespace MyTest;
138template<
typename ClassType,
int id>
void
141 std::cout <<
"** ** BEGIN_TEST\n";
144 typedef typename ClassType::BaseType BaseType;
146 std::string b =
"XYZ";
149 RefType ref0(
makeRef(
new ClassType(a,b)));
153 RefType ref1(RefType::template createRef<ClassType>(a,b));
161 if constexpr (
id == 1){
162 ClassType* ct = ref1.get();
163 auto z = makeRefFromInstance<TestBaseType>(ct);
166 RefType null_ref_type;
167 ASSERT_EQ(null_ref_type.get(),
nullptr);
168 if constexpr (
id==0){
169 ClassType* ct2 = null_ref_type._release();
170 ASSERT_EQ(ct2,
nullptr);
174 ClassType* ct =
nullptr;
175 RefType null_ref_type(
makeRef(ct));
176 ASSERT_EQ(null_ref_type.get(),
nullptr);
177 if constexpr (
id==0){
178 ClassType* ct2 = null_ref_type._release();
179 ASSERT_EQ(ct2,
nullptr);
182 std::cout <<
"DoTestRelease\n";
184 RefType ref_ct(
makeRef(
new ClassType(a,b)));
185 ASSERT_NE(ref_ct.get(),
nullptr);
186 ASSERT_EQ(ref_ct->pa(),a);
187 ASSERT_EQ(ref_ct->pb(),b);
188 if constexpr (
id==0){
189 ClassType* ct2 = ref_ct._release();
190 ASSERT_NE(ct2,
nullptr);
191 ASSERT_EQ(ct2->pa(),a);
192 ASSERT_EQ(ct2->pb(),b);
196 std::cout <<
"** ** END_TEST\n";
199template<
typename ClassType,
int id>
void
202 global_nb_create = global_nb_destroy = 0;
203 _doTest1Helper<ClassType,id>();
204 ASSERT_EQ(global_nb_create,3);
205 ASSERT_EQ(global_nb_create,global_nb_destroy);
223 auto myx3 = createRef<TestRefOwn>(23,
"abc");
230 ASSERT_EQ(t0->pa(), 23);
231 ASSERT_EQ(t0->pb(),
"abc");
254 _doTest1<TestRefOwn,1>();
255 _doTest1<TestRefSharedPtr,0>();
#define ASSERT_FALSE(condition)
Vérifie que condition est faux.
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour déclarer qu'une classe utilise un compteur de référence.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour définir les méthodes et types une classe qui utilise un compteur de référence.
Gestion des références à une classe C++.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
Classe de test utilisant un shared_ptr.
Espace de nom de Arccore.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Structure servant à tagger les interfaces/classes qui utilisent un compteur de référence interne.