new library to replace elements in queue

This commit is contained in:
Vitor Santos Costa 2011-05-11 09:29:07 +01:00
parent 7122c657c0
commit 2064e304ac
2 changed files with 38 additions and 0 deletions

View File

@ -1677,6 +1677,31 @@ p_nb_queue_dequeue( USES_REGS1 )
return Yap_unify(out, ARG2); return Yap_unify(out, ARG2);
} }
/* purge an entry from the queue, replacing it by [] */
static Int
p_nb_queue_replace( USES_REGS1 )
{
CELL *qd = GetQueue(ARG1,"dequeue");
UInt qsz;
Term queue, t = Deref(ARG2);
if (!qd)
return FALSE;
qsz = IntegerOfTerm(qd[QUEUE_SIZE]);
if (qsz == 0)
return FALSE;
queue = qd[QUEUE_HEAD];
for (; qsz > 0; qsz--) {
if (Yap_eq(HeadOfTerm(queue), t)) {
*RepPair(Deref(queue)) = Deref(ARG3);
return TRUE;
}
queue = TailOfTerm(queue);
}
return FALSE;
}
static Int static Int
p_nb_queue_peek( USES_REGS1 ) p_nb_queue_peek( USES_REGS1 )
{ {
@ -1711,6 +1736,16 @@ p_nb_queue_size( USES_REGS1 )
return Yap_unify(ARG2,qd[QUEUE_SIZE]); return Yap_unify(ARG2,qd[QUEUE_SIZE]);
} }
static Int
p_nb_queue_show( USES_REGS1 )
{
CELL *qd = GetQueue(ARG1,"queue_size");
if (!qd)
return FALSE;
return Yap_unify(ARG2,qd[QUEUE_HEAD]);
}
static CELL * static CELL *
GetHeap(Term t, char* caller) GetHeap(Term t, char* caller)
@ -2562,7 +2597,9 @@ void Yap_InitGlobals(void)
Yap_InitCPred("nb_queue_dequeue", 2, p_nb_queue_dequeue, SafePredFlag); Yap_InitCPred("nb_queue_dequeue", 2, p_nb_queue_dequeue, SafePredFlag);
Yap_InitCPred("nb_queue_peek", 2, p_nb_queue_peek, SafePredFlag); Yap_InitCPred("nb_queue_peek", 2, p_nb_queue_peek, SafePredFlag);
Yap_InitCPred("nb_queue_empty", 1, p_nb_queue_empty, SafePredFlag); Yap_InitCPred("nb_queue_empty", 1, p_nb_queue_empty, SafePredFlag);
Yap_InitCPred("nb_queue_replace", 3, p_nb_queue_replace, SafePredFlag);
Yap_InitCPred("nb_queue_size", 2, p_nb_queue_size, SafePredFlag); Yap_InitCPred("nb_queue_size", 2, p_nb_queue_size, SafePredFlag);
Yap_InitCPred("nb_queue_show", 2, p_nb_queue_show, SafePredFlag);
Yap_InitCPred("nb_heap", 2, p_nb_heap, 0L); Yap_InitCPred("nb_heap", 2, p_nb_heap, 0L);
Yap_InitCPred("nb_heap_close", 1, p_nb_heap_close, SafePredFlag); Yap_InitCPred("nb_heap_close", 1, p_nb_heap_close, SafePredFlag);
Yap_InitCPred("nb_heap_add", 3, p_nb_heap_add_to_heap, 0L); Yap_InitCPred("nb_heap_add", 3, p_nb_heap_add_to_heap, 0L);

View File

@ -24,6 +24,7 @@
nb_queue_peek/2, nb_queue_peek/2,
nb_queue_empty/1, nb_queue_empty/1,
nb_queue_size/2, nb_queue_size/2,
nb_queue_replace/3,
nb_heap/2, nb_heap/2,
nb_heap_close/1, nb_heap_close/1,
nb_heap_add/3, nb_heap_add/3,