1/* Base class of intrusively reference-counted objects. 2 Copyright (C) 2017-2023 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 26class refcounted_object 27{ 28public: 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 47private: 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 57struct 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#endif /* COMMON_REFCOUNTED_OBJECT_H */ 71