1 //////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (C) 2012-2021 The Octave Project Developers 4 // 5 // See the file COPYRIGHT.md in the top-level directory of this 6 // distribution or <https://octave.org/copyright/>. 7 // 8 // This file is part of Octave. 9 // 10 // Octave is free software: you can redistribute it and/or modify it 11 // under the terms of the GNU General Public License as published by 12 // the Free Software Foundation, either version 3 of the License, or 13 // (at your option) any later version. 14 // 15 // Octave is distributed in the hope that it will be useful, but 16 // WITHOUT ANY WARRANTY; without even the implied warranty of 17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 // GNU General Public License for more details. 19 // 20 // You should have received a copy of the GNU General Public License 21 // along with Octave; see the file COPYING. If not, see 22 // <https://www.gnu.org/licenses/>. 23 // 24 //////////////////////////////////////////////////////////////////////// 25 26 #if ! defined (octave_oct_refcount_h) 27 #define octave_oct_refcount_h 1 28 29 #include "octave-config.h" 30 31 #include <atomic> 32 33 namespace octave 34 { 35 // Encapsulates a reference counter. 36 37 template <typename T> 38 class refcount 39 { 40 public: 41 42 typedef T count_type; 43 refcount(count_type initial_count)44 refcount (count_type initial_count) 45 : m_count (initial_count) 46 { } 47 48 refcount (const refcount&) = delete; 49 50 refcount& operator = (const refcount&) = delete; 51 52 ~refcount (void) = default; 53 54 // Increment/Decrement. int is postfix. 55 count_type operator++ (void) 56 { 57 return ++m_count; 58 } 59 60 count_type operator++ (int) 61 { 62 return m_count++; 63 } 64 65 count_type operator-- (void) 66 { 67 return --m_count; 68 } 69 70 count_type operator-- (int) 71 { 72 return m_count--; 73 } 74 value(void)75 count_type value (void) const 76 { 77 return m_count.load (); 78 } 79 count_type(void)80 operator count_type (void) const 81 { 82 return value (); 83 } 84 85 private: 86 87 std::atomic<T> m_count; 88 }; 89 } 90 91 #endif 92