Disk ARchive  2.7.15
Full featured and portable backup and archiving tool
smart_pointer.hpp
Go to the documentation of this file.
1 /*********************************************************************/
2 // dar - disk archive - a backup/restoration program
3 // Copyright (C) 2002-2024 Denis Corbin
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 //
19 // to contact the author, see the AUTHOR file
20 /*********************************************************************/
21 
27 
28 #ifndef SMART_POINTER_HPP
29 #define SMART_POINTER_HPP
30 
31 #include "../my_config.h"
32 
33 #include "infinint.hpp"
34 #include "erreurs.hpp"
35 
36 namespace libdar
37 {
38 
39 
42 
44 
46  template <class T> class smart_node
47  {
48  public:
50  smart_node(T *arg): ptr(arg), count_ref(0) { if(arg == nullptr) throw SRC_BUG; };
51  smart_node(const smart_node & ref) = delete;
52  smart_node(smart_node && ref) noexcept = delete;
53  smart_node & operator = (const smart_node & ref) = delete;
54  smart_node & operator = (smart_node && ref) = delete;
55  ~smart_node() noexcept(false) { if(ptr != nullptr) delete ptr; if(!count_ref.is_zero()) throw SRC_BUG; };
56 
57  void add_ref() { ++count_ref; };
58  void del_ref() { if(count_ref.is_zero()) throw SRC_BUG; --count_ref; if(count_ref.is_zero()) delete this; };
59  T & get_val() { return *ptr; };
60 
61  private:
62  T *ptr;
63  infinint count_ref;
64 
65  };
66 
67 
69 
78  template <class T> class smart_pointer
79  {
80  public:
82  smart_pointer() { ptr = nullptr; };
83 
85 
90  smart_pointer(T *arg)
91  {
92  if(arg != nullptr)
93  {
94  ptr = new (std::nothrow) smart_node<T>(arg);
95  if(ptr == nullptr)
96  throw Ememory("smart_pointer::smart_pointer");
97  ptr->add_ref();
98  }
99  else
100  ptr = nullptr;
101  };
102 
104  smart_pointer(const smart_pointer & ref) { ptr = ref.ptr; if(ptr != nullptr) ptr->add_ref(); };
105 
107  smart_pointer(smart_pointer && ref) noexcept { ptr = ref.ptr; ref.ptr = nullptr; };
108 
110  ~smart_pointer() { if(ptr != nullptr) ptr->del_ref(); };
111 
114  {
115  if(ref.ptr != ptr)
116  {
117  if(ref.ptr != nullptr)
118  {
119  if(ptr != nullptr)
120  ptr->del_ref();
121  ptr = ref.ptr;
122  ptr->add_ref();
123  }
124  else
125  {
126  ptr->del_ref(); // ptr is no nullptr because ref.ptr != ptr
127  ptr = nullptr;
128  }
129  }
130  return *this;
131  };
132 
135  {
136  if(ptr != ref.ptr)
137  {
138  if(ptr != nullptr)
139  ptr->del_ref();
140  ptr = ref.ptr;
141  ref.ptr = nullptr;
142  }
143 
144  return *this;
145  };
146 
148 
151  const smart_pointer & assign(T *arg)
152  {
153  smart_pointer<T> tmp(arg);
154  *this = tmp;
155  return *this;
156  }
157 
159  T & operator *() const { if(ptr == nullptr) throw SRC_BUG; return ptr->get_val(); };
160 
162  T* operator ->() const { if(ptr == nullptr) throw SRC_BUG; return &(ptr->get_val()); };
163 
165  bool is_null() const { return ptr == nullptr; };
166 
167  private:
168  smart_node<T> *ptr;
169  };
170 
172 
173 } // end of namespace
174 
175 #endif
exception used when memory has been exhausted
Definition: erreurs.hpp:127
class which holds the address of the allocated memory for many smart_pointers
smart pointer class to be used to automagically manage multiple time pointed to address
smart_pointer & operator=(const smart_pointer &ref)
assignment operator
bool is_null() const
return whether the smart_pointer is pointing to nullptr
smart_pointer(T *arg)
creates a smart_pointer pointing to an allocated memory
T * operator->() const
content-of field operator (when the pointed to object is a struct or class
smart_pointer(smart_pointer &&ref) noexcept
move constructor
smart_pointer(const smart_pointer &ref)
copy constructor
smart_pointer()
creates a smart_pointer equivalent to a pointer to NULL
T & operator*() const
content-of operator
const smart_pointer & assign(T *arg)
assignment operator from a base type pointer (not from a smart_pointer)
contains all the excetion class thrown by libdar
bool is_zero() const
switch module to limitint (32 ou 64 bits integers) or infinint
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47