# include #include #include #include #include using namespace std; //double log5(double ); // lets define log base 5 struct listobject{ // the vlaue stored is a memory address void* address; listobject* next; listobject* prev; }; class myqueue{ private: static int number_objects_allq; listobject* builder; listobject* consumer; char name[30]; public: myqueue(); myqueue(char* gname); ~myqueue(); static int get_no_objects(){return number_objects_allq;} myqueue(const myqueue &q2); void enqueue(void* n); void* dequeue(); void operator=(myqueue); myqueue operator+(myqueue); void operator+=(myqueue) ; void* operator[](int); bool operator < (myqueue); //some compilers require prototype defined outside the class friend ostream &operator << (ostream &strm, myqueue); }; int myqueue::number_objects_allq=0; myqueue::myqueue(){ cout<< "\n --- myqueue constructor called for q="<name<<")"<address=n; x->prev=builder; x->next=NULL; // sizet++; if (builder!=NULL) {builder->next=x;} builder=x; if (consumer==NULL){consumer=x;} cout<< "\n ---enqueue called q="<name<<")"<<" n="<address; listobject* old_consumer =consumer; consumer=consumer->next; if(consumer) consumer->prev=NULL; delete old_consumer; cout<< "\n ---dequeue called q="<name<<")"<<" returning n="<name<<")"<<"\n"; builder=NULL; consumer=NULL; // int r = rand(); strcpy(name, "copy_"); strcpy(name+5, qx.name); listobject* e = qx.consumer; while (e!=NULL){ enqueue(e->address); e=e->next; } } void myqueue::operator=(myqueue q2){ cout<<"\n operator = called\n"; builder=NULL; consumer=NULL; listobject* e = q2.consumer; while (e!=NULL){ enqueue(e->address); e=e->next; } } bool myqueue::operator < (myqueue q2){ listobject *e1 = consumer; listobject *e2 = q2.consumer; while(1){ if(e1==NULL && e2!=NULL) return true; if(e2==NULL) return false; e1=e1->next; e2=e2->next; } } myqueue myqueue::operator+(myqueue qn){ cout<<"\n operator + called\n"; //create a new queue myqueue ret; //copy elements from first queue listobject *e = consumer; while (e!=NULL){ ret.enqueue(e->address); e=e->next; } //copy elements from second queue e = qn.consumer; while (e!=NULL){ ret.enqueue(e->address); e=e->next; } return ret; } void myqueue::operator+=(myqueue q2){ //copy elements from second queue listobject* e = q2.consumer; while (e!=NULL){ enqueue(e->address); e=e->next; } } void* myqueue::operator[](int n){ cout<<"\n ---operator [] called\n"; int i=0; listobject* e=consumer; while(e!=NULL){ if (i==n) {return e->address;} i++; e=e->next; } return NULL; } ostream &operator << (ostream &strm, myqueue q){ listobject* e=q.consumer; cout<<"name="<address<<" "; e=e->next; } return strm; }