// 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;
}