VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
MbSmartPtr.h
Go to the documentation of this file.
1//=======================================================================================
2// ____ ____ __ ______ __________ __ __ __ __
3// \ \ | | | | | _ \ |___ ___| | | | | / \ | |
4// \ \ | | | | | |_) | | | | | | | / \ | |
5// \ \ | | | | | _ / | | | | | | / /\ \ | |
6// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____
7// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______|
8// \ \ | | ________________________________________________________________
9// \ \ | | | ______________________________________________________________|
10// \ \| | | | __ __ __ __ ______ _______
11// \ | | |_____ | | | | | | | | | _ \ / _____)
12// \ | | _____| | | | | | | | | | | \ \ \_______
13// \ | | | | |_____ | \_/ | | | | |_/ / _____ |
14// \ _____| |__| |________| \_______/ |__| |______/ (_______/
15//
16// This file is part of VirtualFluids. VirtualFluids is free software: you can
17// redistribute it and/or modify it under the terms of the GNU General Public
18// License as published by the Free Software Foundation, either version 3 of
19// the License, or (at your option) any later version.
20//
21// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
22// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24// for more details.
25//
26// SPDX-License-Identifier: GPL-3.0-or-later
27// SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
28//
33//=======================================================================================
34#ifndef MBSMARTPTR_H
35#define MBSMARTPTR_H
36
38
39#ifdef __clang__
40#pragma clang system_header
41#endif
42
43//=====================================================
44// Globale Funktion, um das Loeschen des referenzierten
45// Objektes flexibler zu gestalten.
46//
47template <class ObjType>
49{
50 delete ptr;
51}
52
53//======================================================
54// Die Reference-Pointer Klasse:
55//
56// Beim Referenzieren eines Objektes ueber einen SmartPointer wird ein Zaehler fuer die referezierte Objekt-
57// adresse inkrementiert. Wird der Pointer wieder einem anderen Objekt zugewiesen, so wird der Zaehler fuer das
58// urspruenglich referenzierte Objekt wieder dekremtiert, ebenfalls beim Destruktor des Reference-Pointers.
59// Tatsaechlich geloescht wird das referenzierte Objekt erst, wenn der zugehoerige Zaehler auf 0 ist. Dies geschieht
60// ueber die globale Template-Funktion deleteRefPtr(), die bei Bedarf ueberschrieben werden kann.
61// Der Reference-Pointer verfuegt also sozusagen ueber eine automatische Garbage Collection
62
63template <class ObjType>
65{
66public:
67 // Konstruktoren //bei explicit geht der implizite cast nicht mehr, aber um keinen stress zu verursachen
68 /*explicit*/ MbSmartPtr(const ObjType *pPtr = NULL) : MbSmartPtrBase(), mpPtr(NULL) { init(pPtr); }
69 template <class ParamType>
71 {
72 init(ptr.get());
73 }
74 // Destruktor
75 ~MbSmartPtr() override { init(NULL); }
76 //---------------------------------------------------
77 // Kopierkonstruktor
78 MbSmartPtr(const MbSmartPtr<ObjType> &ptr) : MbSmartPtrBase(), mpPtr(NULL) { init(ptr.get()); }
79 //---------------------------------------------------
80 // Zuweisungsoperatoren
81 template <class ParamType>
83 {
84 init(ptr.get());
85 return *this;
86 }
88 {
89 init(ptr.get());
90 return *this;
91 }
92
94 {
95 init(pPtr);
96 return *this;
97 }
98 //---------------------------------------------------
99 // Dereferenzierung-Operatoren
100 ObjType &operator*() const { return *mpPtr; }
101 ObjType *operator->() const { return mpPtr; }
102 bool operator!() const { return !mpPtr; }
103 operator ObjType *() const { return mpPtr; }
104 //---------------------------------------------------
105 // Methoden
106 ObjType *get() const { return mpPtr; }
107 //---------------------------------------------------
108 int ref_count() const { return MbSmartPtrBase::ref_count(mpPtr); }
109 //---------------------------------------------------
110 bool release() const { return MbSmartPtrBase::removeFromGC(mpPtr); }
111
112private:
113 void init(const ObjType *pPtr)
114 {
115 // Nur was tun, wenn wirklich noetig
116 if (pPtr == mpPtr)
117 return;
118
119 // Aktuell referenziertes Objekt freigeben, dabei ueberpruefen, ob letztes Release
120 if (mpPtr && releaseRef(mpPtr)) {
121 // referenziertes Objekt loeschen
122 deleteRefPtr(mpPtr);
123 }
124
125 // Wenn pPtr ein neues Objekt ist, Zugriffszaehler auf neues Objekt erhoehen
126 mpPtr = const_cast<ObjType *>(pPtr);
127 if (mpPtr)
128 addRef(mpPtr);
129 }
130
131private:
132 ObjType *mpPtr;
133};
134
135#endif // MBSMARTPTR_H
136
const MbSmartPtr< ObjType > & operator=(const ObjType *pPtr)
Definition MbSmartPtr.h:93
MbSmartPtr(const MbSmartPtr< ParamType > &ptr)
Definition MbSmartPtr.h:70
const MbSmartPtr< ObjType > & operator=(const MbSmartPtr< ObjType > &ptr)
Definition MbSmartPtr.h:87
bool operator!() const
Definition MbSmartPtr.h:102
MbSmartPtr(const MbSmartPtr< ObjType > &ptr)
Definition MbSmartPtr.h:78
bool release() const
Definition MbSmartPtr.h:110
ObjType * get() const
Definition MbSmartPtr.h:106
ObjType * operator->() const
Definition MbSmartPtr.h:101
~MbSmartPtr() override
Definition MbSmartPtr.h:75
int ref_count() const
Definition MbSmartPtr.h:108
MbSmartPtr(const ObjType *pPtr=NULL)
Definition MbSmartPtr.h:68
const MbSmartPtr< ObjType > & operator=(const MbSmartPtr< ParamType > &ptr)
Definition MbSmartPtr.h:82
ObjType & operator*() const
Definition MbSmartPtr.h:100
std::shared_ptr< T > SPtr
bool releaseRef(void *p)
int ref_count(void *ptr) const
void deleteRefPtr(ObjType *ptr)
Definition MbSmartPtr.h:48
bool addRef(void *p)
bool removeFromGC(void *ptr) const