ftp.nice.ch/pub/next/developer/languages/java/guavac.0.2.5.s.tar.gz#/guavac-0.2.5/common/dynamic_cast.h

This is dynamic_cast.h in view mode; [Download] [Up]

// Copyright (c) 1995  David Engberg  All rights reserved
// $Id: dynamic_cast.h,v 1.2 1996/01/08 02:58:17 geppetto Exp $
#ifndef _dynamic_cast_h
#define _dynamic_cast_h

//
// Description : This is an extremely temporary ugly kludgy way of getting
//   dynamic cast functionality in g++ while I wait for real rtti.
//   This implementation isn't nice or portable in any way, but hopefully the
//   basic DYNAMIC_CAST macro can be redefined later to use the real
//   dynamic_cast mechanism, when available.
//   This is really only useful if you're trying to identify the absolute
//   bottom class in a tree:
//      A
//      | 
//      B 
//      | 
//      C
//
//  If I have pointers:      A* a1 = new B;   A* a2 = new C;
//  Then these will work correctly:
//     B* b = DYNAMIC_CAST(B, a1);   // returns (B*)a1
//     C* c = DYNAMIC_CAST(C, a2);   // returns (C*)a2
//     C* c = DYNAMIC_CAST(C, a1);   // returns (C*)0
//  But, this will not do the right thing:
//     B* b = DYNAMIC_CAST(B, a2);
//  This will return (B*)0, but a real rtti implementation should return
//  (B*)a2.  I.e. this only checks for the _most_derived_ type of an
//  instantiated object.
//
//  To use this in a class, the DynamicCastDeclarations macro needs to be
//  somewhere in the class declaration somewhere.
//

#define DYNAMIC_CAST(toclass, pointer) \
         (((pointer) != 0 && \
          ((void*)(pointer)->_dcast == (void*)(toclass::_dcast))) ? \
	  (toclass*)(pointer) : (toclass*)0)

#define DynamicCastDeclarations \
  public: \
    virtual void _dcast() {} \
  private: \
    //

#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.