// Copyright (C)1994 Taligent, Inc. All rights reserved. // $Revision: $ #ifndef Taligent_EXAMPLE4 #define Taligent_EXAMPLE4 #ifndef Taligent_PRIMITIVECLASSES #include <PrimitiveClasses.h> #endif class TOwningStackOf4TypeSpecificOperationsBase; class TOwningStackOf4Implementation { public: TOwningStackOf4Implementation( TOwningStackOf4TypeSpecificOperationsBase* adopt); TOwningStackOf4Implementation( TOwningStackOf4TypeSpecificOperationsBase* adopt, const TOwningStackOf4Implementation& other); virtual ~TOwningStackOf4Implementation(); virtual void Adopt(void* item); virtual unsigned int Count() const; private: TOwningStackOf4TypeSpecificOperationsBase* fTypeSpecificOperations; unsigned int fCount; void* fStack[10]; }; template <class AType> class TOwningStackOf4 { public: TOwningStackOf4(); TOwningStackOf4( const TOwningStackOf4<AType>& other ); virtual ~TOwningStackOf4(); virtual void Adopt(AType* graphic); virtual unsigned int Count() const; private: TOwningStackOf4ImplementationfImplementation; }; #ifndef Taligent_EXAMPLE4TEMPLATEIMPLEMENTATION #include <Example4TemplateImplementation.h> #endif // Inlines go here
template<class AType> inline TOwningStackOf4<AType>::TOwningStackOf4() : fImplementation(new TOwningStackOf4TypeSpecificOperations<AType>) { } template<class AType> inline TOwningStackOf4<AType>::TOwningStackOf4( const TOwningStackOf4<AType>& other ) : fImplementation(new TOwningStackOf4TypeSpecificOperations<AType>, other.fImplementation) { } template<class AType> inline TOwningStackOf4<AType>::~TOwningStackOf4() { } template<class AType> inline void TOwningStackOf4<AType>::Adopt(AType* item) { fImplementation.Adopt(item); } template<class AType> inline unsigned int TOwningStackOf4<AType>::Count() const { return fImplementation.Count(); } template<class AType> inline TOwningStackOf4TypeSpecificOperations<AType>::TOwningStackOf4TypeSpecificOperations() { } #endif
// Copyright (C) 1994 Taligent, Inc. All rights reserved. // $Revision: $ #ifndef Taligent_EXAMPLE4TEMPLATEIMPLEMENTATION #define Taligent_EXAMPLE4TEMPLATEIMPLEMENTATION #ifndef Taligent_EXAMPLE4 #include <Example4.h> #endif class TOwningStackOf4TypeSpecificOperationsBase { public: TOwningStackOf4TypeSpecificOperationsBase() {}; virtual ~TOwningStackOf4TypeSpecificOperationsBase() {}; virtual void * Copy(const void* item) = 0; virtual void Delete(void* item) = 0; }; template<class AType> class TOwningStackOf4TypeSpecificOperations : public TOwningStackOf4TypeSpecificOperationsBase { public: TOwningStackOf4TypeSpecificOperations(); virtual void * Copy(const void* item); virtual void Delete(void* item); }; template<class AType> void* TOwningStackOf4TypeSpecificOperations<AType>::Copy(const void* item) { return new AType(* (const AType*) item); } template<class AType> void TOwningStackOf4TypeSpecificOperations<AType>::Delete(void* item) { delete (AType*) item; } #endif
// Copyright (C) 1994 Taligent, Inc. All rights reserved. // $Revision: $ #ifndef Taligent_EXAMPLE4 #include <Example4.h> #endif // Methods of TOwningStackOf4Implementation TOwningStackOf4Implementation::TOwningStackOf4Implementation( TOwningStackOf4TypeSpecificOperationsBase* adopt ) : fTypeSpecificOperations(adopt), fCount(0) { } TOwningStackOf4Implementation::TOwningStackOf4Implementation( TOwningStackOf4TypeSpecificOperationsBase* adopt, const TOwningStackOf4Implementation& other) : fTypeSpecificOperations(adopt), fCount(other.fCount) { for ( unsigned int i = 0; i < fCount; i++ ) { fStack[i] = fTypeSpecificOperations->Copy(other.fStack[i]); } } TOwningStackOf4Implementation::~TOwningStackOf4Implementation() { for ( unsigned int i = 0; i < fCount; i++ ) { fTypeSpecificOperations->Delete(fStack[i]); } delete fTypeSpecificOperations; } void TOwningStackOf4Implementation::Adopt(void* item) { fStack[fCount++] = item; } unsigned int TOwningStackOf4Implementation::Count() const { return fCount; }