The delegating-to-a-member example

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

[Contents] [Previous] [Next]
Click the icon to mail questions or corrections about this material to Taligent personnel.
Copyright©1995 Taligent,Inc. All rights reserved.

Generated with WebMaker