Milán Major

netscape-revival

1 branch
Code

lib/mac/VText/V_PowerPlant_Mods/LSharable.h

// ===========================================================================
//	LSharable.h						©1995 Metrowerks Inc. All rights reserved.
// ===========================================================================

#pragma once

#include <PP_Prefix.h>


class	LSharable {
public:
					LSharable();
	
	virtual void	AddUser(
						void	*inUser);
	virtual void	RemoveUser(
						void	*inUser);

	virtual Int32	GetUseCount();

protected:
	Int32			mUseCount;
	
	virtual			~LSharable();		// protected destructor prevents
										//   stack-based objects
	virtual void	NoMoreUsers();
};


class	StSharer {
public:
					StSharer(
						LSharable	*inSharable);
					~StSharer();
					
	void			SetSharable(
						LSharable	*inSharable);
protected:
	LSharable		*mSharable;
};


#define	ReplaceSharable_(ref,obj,user)			\
	do {										\
		LSharable	*__old = (ref);				\
		(ref) = (obj);							\
		if (ref)								\
			(ref)->AddUser(user);				\
		if (__old)								\
			__old->RemoveUser(user);			\
	} while (false)
	
template	<class Sharable>
void	ReplaceSharable(
	Sharable*	&inReference,
	Sharable*	inNewValue,
	void		*inUser
);

template	<class Sharable>
void	ReplaceSharable(
	Sharable*	&inReference,
	Sharable*	inNewValue,
	void		*inUser)
{
	if (inReference != inNewValue) {
		if (inReference)
			inReference->RemoveUser(inUser);
		inReference = inNewValue;
		if (inReference)
			inReference->AddUser(inUser);
	}
}