mirror of
				https://github.com/pocoproject/poco.git
				synced 2025-11-03 19:40:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//
 | 
						|
// RefCountedObject.h
 | 
						|
//
 | 
						|
// Library: Foundation
 | 
						|
// Package: Core
 | 
						|
// Module:  RefCountedObject
 | 
						|
//
 | 
						|
// Definition of the RefCountedObject class.
 | 
						|
//
 | 
						|
// Copyright (c) 2004-2009, Applied Informatics Software Engineering GmbH.
 | 
						|
// and Contributors.
 | 
						|
//
 | 
						|
// SPDX-License-Identifier:	BSL-1.0
 | 
						|
//
 | 
						|
 | 
						|
 | 
						|
#ifndef Foundation_RefCountedObject_INCLUDED
 | 
						|
#define Foundation_RefCountedObject_INCLUDED
 | 
						|
 | 
						|
 | 
						|
#include "Poco/Foundation.h"
 | 
						|
#include "Poco/AtomicCounter.h"
 | 
						|
 | 
						|
 | 
						|
namespace Poco {
 | 
						|
 | 
						|
 | 
						|
class Foundation_API RefCountedObject
 | 
						|
	/// A base class for objects that employ
 | 
						|
	/// reference counting based garbage collection.
 | 
						|
	///
 | 
						|
	/// Reference-counted objects inhibit construction
 | 
						|
	/// by copying and assignment.
 | 
						|
{
 | 
						|
public:
 | 
						|
	RefCountedObject();
 | 
						|
		/// Creates the RefCountedObject.
 | 
						|
		/// The initial reference count is one.
 | 
						|
 | 
						|
	void duplicate() const;
 | 
						|
		/// Increments the object's reference count.
 | 
						|
 | 
						|
	void release() const noexcept;
 | 
						|
		/// Decrements the object's reference count
 | 
						|
		/// and deletes the object if the count
 | 
						|
		/// reaches zero.
 | 
						|
 | 
						|
	int referenceCount() const;
 | 
						|
		/// Returns the reference count.
 | 
						|
 | 
						|
protected:
 | 
						|
	virtual ~RefCountedObject();
 | 
						|
		/// Destroys the RefCountedObject.
 | 
						|
 | 
						|
private:
 | 
						|
	RefCountedObject(const RefCountedObject&);
 | 
						|
	RefCountedObject& operator = (const RefCountedObject&);
 | 
						|
 | 
						|
	mutable AtomicCounter _counter;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// inlines
 | 
						|
//
 | 
						|
inline int RefCountedObject::referenceCount() const
 | 
						|
{
 | 
						|
	return _counter.value();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
inline void RefCountedObject::duplicate() const
 | 
						|
{
 | 
						|
	++_counter;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
inline void RefCountedObject::release() const noexcept
 | 
						|
{
 | 
						|
	try
 | 
						|
	{
 | 
						|
		if (--_counter == 0) delete this;
 | 
						|
	}
 | 
						|
	catch (...)
 | 
						|
	{
 | 
						|
		poco_unexpected();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
} // namespace Poco
 | 
						|
 | 
						|
 | 
						|
#endif // Foundation_RefCountedObject_INCLUDED
 |