/* WebDownloader for X-Window
* Copyright (C) 1999-2002 Koshelev Maxim
* This Program is free but not GPL!!! You can't modify it
* without agreement with author. You can't distribute modified
* program but you can distribute unmodified program.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include "queue.h"
#include <stdio.h>
#include "var.h"
tNode::tNode() {
next=prev=NULL;
};
tNode::~tNode() {
//do nothing
};
//************************************/
tQueue::tQueue() {
Curent=First=Last=NULL;
MaxNum=0;
Num=0;
};
void tQueue::free_to_limit(){
if (MaxNum && Num>=MaxNum) {
while (Num>=MaxNum)
dispose();
};
};
void tQueue::init(int n) {
MaxNum=n;
tNode *tmp=First;
Num=0;
while (tmp){
Num+=1;
tmp=tmp->prev;
};
free_to_limit();
};
void tQueue::insert(tNode *what) {
DBC_RETURN_IF_FAIL(what!=NULL);
free_to_limit();
Num+=1;
what->prev=NULL;
if ((what->next=Last)) {
Last->prev=what;
} else {
First=what;
};
Curent=Last=what;
};
void tQueue::insert_before(tNode *what,tNode *where) {
DBC_RETURN_IF_FAIL(what!=NULL);
DBC_RETURN_IF_FAIL(where!=NULL);
// if (what==NULL || where==NULL) return;
/* what and where != NULL
* if First than .next==NULL
* if Last than .prev==NULL
*/
free_to_limit();
Num+=1;
if ((what->next=where->next))
what->next->prev=what;
else
First=what;
what->prev=where;
where->next=what;
};
tNode *tQueue::last() {
return Curent=Last;
};
tNode *tQueue::first() {
return Curent=First;
};
tNode *tQueue::next() {
if (Curent) Curent=Curent->next;
return Curent;
};
tNode *tQueue::prev() {
if (Curent) Curent=Curent->prev;
return Curent;
};
void tQueue::del(tNode *what) {
DBC_RETURN_IF_FAIL(what!=NULL);
// if (what==NULL) return;
Num-=1;
if (what->prev)
what->prev->next=what->next;
else
Last=what->next;
if (what->next)
what->next->prev=what->prev;
else
First=what->prev;
};
void tQueue::dispose() {
if (First){
tNode *prom = First;
First = First->prev;
delete prom;
if (First) First->next = NULL;
else Last = NULL;
Num -= 1;
};
};
int tQueue::count() {
return Num;
};
void tQueue::done() {
while (First)
dispose();
};
void tQueue::sort(d4xNodeCmpFunc cmpfunc){
tNode *a=First;
while (a && a->prev){
tNode *prev=a->prev;
if (cmpfunc(a,prev)>0){
del(a);
insert(a);
a=First;
}else{
a=prev;
};
};
};
tQueue::~tQueue() {
done();
};
//************************************/
syntax highlighted by Code2HTML, v. 0.9.1