#ifndef FINAL_H
#define FINAL_H


///
/// Make classes Final/NotInheritable/Sealed
///
/// Making a class 'Final' means preventing it from being inherited from. This is useful if the
/// class is unsafe to inherit from or not intended to be inherited. This has some overhead to
/// enforece this, so a macro is provided which will only enforce this in debug builds, but will
/// produce the more optimal code in release builds
///
/// Idea comes from here:  http://www.codeproject.com/Articles/4444/A-non-inheritable-class
///
template <typename T>
class MakeSealed
{
private:
	~MakeSealed() {};
	friend T;
};


#ifndef _NDEBUG
#  define  FINAL_CLASS(ClassName)		class ClassName : virtual public MakeSealed<ClassName>
#else
#  define  FINAL_CLASS(ClassName)		class ClassName
#endif


/*

	Example usage:

	FINAL_CLASS(MyFinalClass)
	{
		public:
			MyFinalClass() {}
	};

	Now it is not possible to do this without a compiler error when compiling in debug:

	class MyDerivedClass : public MyFinalClass
	{
	};

*/


#endif // FINAL_H
