// Programmed by Anthony Barbachan // Programmed in Turbo C++ 3.0 // Note: This is the header file for the object library (OBJECT??.LIB) // Purpose: To provide components for data structures. // Version 1.00 // Last Modified On 7/9/95 #ifndef __OBJECT_HPP__ #define __OBJECT_HPP__ #include ////////////////////////////////////////////////////////////////////////////// // This class provides a base for many types of data structures class ObjectBase { protected: ObjectBase* next; ObjectBase* prev; public: ObjectBase() { prev = next = NULL; } ObjectBase(ObjectBase* n) { next = n; prev = NULL; } ObjectBase(ObjectBase* n, ObjectBase* p) { next = n; prev = p; } virtual ~ObjectBase() {} ObjectBase* LinkNext(ObjectBase* n); ObjectBase* LinkPrevious(ObjectBase* p); ObjectBase* UnLinkNext() { return LinkNext(NULL); } ObjectBase* UnLinkPrevious() { return LinkPrevious(NULL); } ObjectBase* AccessNext() { return next; } ObjectBase* AccessPrevious() { return prev; } int NoNext() { return next == NULL; } int HasNext() { return next != NULL; } int NoPrevious() { return prev == NULL; } int HasPrevious() { return prev != NULL; } int IsLinked() { return HasNext() || HasPrevious(); } int NotLinked() { return NoNext() || NoPrevious(); } }; ///////////////////////////////////////*************************************** ////////////////////////////////////////////////////////////////////////////// // This class provides a means by which object can be defined in a method // which allows its use in ObjectBase data structures. template class ObjectOf : public ObjectBase, public ObjectType { public: ObjectOf() : ObjectBase(), ObjectType() {} ObjectOf(ObjectOf* n) : ObjectBase(n), ObjectType() {} ObjectOf(ObjectOf* n, ObjectOf* p) : ObjectBase(n,p),ObjectType() {} virtual ~ObjectOf() {} ObjectOf* LinkNext(ObjectOf* n) { return (ObjectOf *) ObjectBase::LinkNext(n); } ObjectOf* LinkPrevious(ObjectOf* p) { return (ObjectOf *) ObjectBase::LinkPrevious(p); } ObjectOf* UnLinkNext() { return (ObjectOf *) ObjectBase::UnLinkNext(); } ObjectOf* UnLinkPrevious() { return (ObjectOf *) ObjectBase::UnLinkPrevious(); } ObjectOf* AccessNext() { return (ObjectOf *) ObjectBase::AccessNext(); } ObjectOf* AccessPrevious() { return (ObjectOf *) ObjectBase::AccessPrevious(); } ObjectType& AccessObject() { return *this; } ObjectType& operator * () { return *this; } }; ///////////////////////////////////////*************************************** ////////////////////////////////////////////////////////////////////////////// // This class provides a means by which defined object can be // used in ObjectBase data structures. template class ObjectHolder : public ObjectBase { protected: ObjectType* obj; public: ObjectHolder() : ObjectBase() { obj = NULL; } ObjectHolder(ObjectType* o) : ObjectBase() { obj = o; } ObjectHolder(ObjectHolder* n) : ObjectBase(n) { obj = NULL; } ObjectHolder(ObjectType* o, ObjectHolder* n):ObjectBase(n){obj = o;} ObjectHolder(ObjectType* o, ObjectHolder* p, ObjectHolder* n) : ObjectBase(n, p) { obj = o; } virtual ~ObjectHolder() { if(obj != NULL) delete obj; } ObjectType* LinkObject(ObjectType* o); ObjectType* UnLinkObject() { return LinkObject(NULL); } ObjectHolder* LinkNext(ObjectHolder* n) { return (ObjectHolder *) ObjectBase::LinkNext(n); } ObjectHolder* LinkPrevious(ObjectHolder* p) { return (ObjectHolder *) ObjectBase::LinkPrevious(p); } ObjectHolder* UnLinkNext() { return (ObjectHolder *) ObjectBase::UnLinkNext(); } ObjectHolder* UnLinkPrevious() { return (ObjectHolder *) ObjectBase::UnLinkPrevious(); } ObjectHolder* AccessNext() { return (ObjectHolder *) ObjectBase::AccessNext(); } ObjectHolder* AccessPrevious() { return (ObjectHolder *) ObjectBase::AccessPrevious(); } int NoObject() { return obj == NULL; } int HasObject() { return obj != NULL; } ObjectType* AccessObject() { return obj; } operator ObjectType * () { return obj; } }; ///////////////////////////////////////*************************************** ////////////////////////////////////////////////////////////////////////////// // This class provides a means by which any data type can be defined in a // method which allows its use in ObjectBase data structures. template class ObjectContainer : public ObjectBase { protected: ObjectType obj; public: ObjectContainer() : ObjectBase() {} ObjectContainer(ObjectContainer* n) : ObjectBase(n) {} ObjectContainer(ObjectContainer* n, ObjectContainer* p) : ObjectBase(n, p) {} virtual ~ObjectContainer() {} ObjectContainer* LinkNext(ObjectContainer* n) { return (ObjectContainer *) ObjectBase::LinkNext(n); } ObjectContainer* LinkPrevious(ObjectContainer* p) { return (ObjectContainer *) ObjectBase::LinkPrevious(p); } ObjectContainer* UnLinkNext() { return (ObjectContainer *) ObjectBase::UnLinkNext(); } ObjectContainer* UnLinkPrevious() { return (ObjectContainer *) ObjectBase::UnLinkPrevious(); } ObjectContainer* AccessNext() { return (ObjectContainer *) ObjectBase::AccessNext(); } ObjectContainer* AccessPrevious() { return (ObjectContainer *) ObjectBase::AccessPrevious(); } ObjectType& AccessObject() { return obj; } ObjectType& operator * () { return obj; } operator ObjectType & () { return obj; } }; ///////////////////////////////////////*************************************** ///////////////////////////////////////*************************************** // This function returns the value of obj and set obj to o template ObjectType* ObjectHolder::LinkObject(ObjectType* o) { ObjectType* old = obj; // Save old value of obj obj = o; // Save value of o in obj return old; // Return old value of obj } ///////////////////////////////////////*************************************** #endif