Geogram  Version 1.9.1-rc
A programming library of geometric algorithms
counted.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000-2022 Inria
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  * * Neither the name of the ALICE Project-Team nor the names of its
14  * contributors may be used to endorse or promote products derived from this
15  * software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * Contact: Bruno Levy
30  *
31  * https://www.inria.fr/fr/bruno-levy
32  *
33  * Inria,
34  * Domaine de Voluceau,
35  * 78150 Le Chesnay - Rocquencourt
36  * FRANCE
37  *
38  */
39 
40 #ifndef GEOGRAM_BASIC_COUNTED
41 #define GEOGRAM_BASIC_COUNTED
42 
43 #include <geogram/basic/common.h>
45 #include <geogram/basic/assert.h>
46 
53 namespace GEO {
54 
71  class GEOGRAM_API Counted {
72  public:
79  void ref() const {
80  ++nb_refs_;
81  }
82 
89  void unref() const {
90  --nb_refs_;
91  geo_debug_assert(nb_refs_ >= 0);
92  if(nb_refs_ == 0) {
93  delete this;
94  }
95  }
96 
103  bool is_shared() const {
104  return nb_refs_ > 1;
105  }
106 
111  int nb_refs() const {
112  return nb_refs_;
113  }
114 
120  static void ref(const Counted* counted) {
121  if(counted != nullptr) {
122  counted->ref();
123  }
124  }
125 
131  static void unref(const Counted* counted) {
132  if(counted != nullptr) {
133  counted->unref();
134  }
135  }
136 
137  protected:
143  nb_refs_(0) {
144  }
145 
152  virtual ~Counted();
153 
154  private:
156  Counted(const Counted&);
158  Counted& operator= (const Counted&);
159 
160  mutable int nb_refs_;
161  };
162 }
163 
164 #endif
Assertion checking mechanism.
#define geo_debug_assert(x)
Verifies that a condition is met.
Definition: assert.h:196
Base class for reference-counted objects.
Definition: counted.h:71
virtual ~Counted()
Destroys a reference counted object.
Counted()
Creates a reference counted object.
Definition: counted.h:142
bool is_shared() const
Check if the object is shared.
Definition: counted.h:103
static void ref(const Counted *counted)
Increments the reference count.
Definition: counted.h:120
void unref() const
Decrements the reference count.
Definition: counted.h:89
static void unref(const Counted *counted)
Decrements the reference count.
Definition: counted.h:131
void ref() const
Increments the reference count.
Definition: counted.h:79
int nb_refs() const
Gets the number of references that point to this object.
Definition: counted.h:111
Common include file, providing basic definitions. Should be included before anything else by all head...
Global Vorpaline namespace.
Definition: basic.h:55
Pointers with automatic reference counting.