Home | History | Annotate | Line # | Download | only in gdbsupport
      1 /* Base class of intrusively reference-counted objects.
      2    Copyright (C) 2017-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of GDB.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18 
     19 #ifndef COMMON_REFCOUNTED_OBJECT_H
     20 #define COMMON_REFCOUNTED_OBJECT_H
     21 
     22 /* Base class of intrusively reference-countable objects.
     23    Incrementing and decrementing the reference count is an external
     24    responsibility.  */
     25 
     26 class refcounted_object
     27 {
     28 public:
     29   refcounted_object () = default;
     30 
     31   /* Increase the refcount.  */
     32   void incref ()
     33   {
     34     gdb_assert (m_refcount >= 0);
     35     m_refcount++;
     36   }
     37 
     38   /* Decrease the refcount.  */
     39   void decref ()
     40   {
     41     m_refcount--;
     42     gdb_assert (m_refcount >= 0);
     43   }
     44 
     45   int refcount () const { return m_refcount; }
     46 
     47 private:
     48   DISABLE_COPY_AND_ASSIGN (refcounted_object);
     49 
     50   /* The reference count.  */
     51   int m_refcount = 0;
     52 };
     53 
     54 /* A policy class to interface gdb::ref_ptr with a
     55    refcounted_object.  */
     56 
     57 struct refcounted_object_ref_policy
     58 {
     59   static void incref (refcounted_object *ptr)
     60   {
     61     ptr->incref ();
     62   }
     63 
     64   static void decref (refcounted_object *ptr)
     65   {
     66     ptr->decref ();
     67   }
     68 };
     69 
     70 /* A policy class to interface gdb::ref_ptr with a refcounted_object, that
     71    deletes the object once the refcount reaches 0..  */
     72 
     73 template<typename T>
     74 struct refcounted_object_delete_ref_policy
     75 {
     76   static void incref (T *obj)
     77   { obj->incref (); }
     78 
     79   static void decref (T *obj)
     80   {
     81     obj->decref ();
     82     if (obj->refcount () == 0)
     83       delete obj;
     84   }
     85 };
     86 
     87 #endif /* COMMON_REFCOUNTED_OBJECT_H */
     88