00001 /* 00002 File: Object.h 00003 00004 Function: Definition of a polymorphic object. 00005 00006 Author(s): Andrew Willmott 00007 00008 Copyright: (c) 1995-2000, Andrew Willmott 00009 */ 00010 00011 #ifndef __Object__ 00012 #define __Object__ 00013 00014 #include <iostream.h> 00015 00016 00017 class Object 00018 { 00019 public: 00020 virtual Void Print(ostream &s) const { s << "unknown"; }; 00021 virtual Void Parse(istream &s) {}; 00022 virtual Object *Clone() const { return new Object; }; 00023 virtual Void Free() { delete this; }; 00024 }; 00025 00026 typedef Object *ObjectPtr; 00027 00028 00029 // --- stream operators ----------------------------------------- 00030 00031 00032 inline ostream &operator << (ostream &s, ObjectPtr objPtr); 00033 inline istream &operator >> (istream &s, ObjectPtr objPtr); 00034 inline ostream &operator << (ostream &s, Object &obj); 00035 inline istream &operator >> (istream &s, Object &obj); 00036 00037 00038 // --- Inlines ---------------------------------------------------------------- 00039 00040 00041 inline ostream &operator << (ostream &s, ObjectPtr objPtr) 00042 { 00043 objPtr->Print(s); 00044 return(s); 00045 } 00046 00047 inline istream &operator >> (istream &s, ObjectPtr objPtr) 00048 { 00049 objPtr->Parse(s); 00050 return(s); 00051 } 00052 00053 inline ostream &operator << (ostream &s, Object &obj) 00054 { 00055 obj.Print(s); 00056 return(s); 00057 } 00058 00059 inline istream &operator >> (istream &s, Object &obj) 00060 { 00061 obj.Parse(s); 00062 return(s); 00063 } 00064 00065 00066 // --- Templates ----------------------------------------------------- 00067 00068 00069 template <class T> T *Clone(T *t) 00070 { 00071 return((T *) t->Clone()); 00072 } 00073 00074 #endif