mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-30 06:50:31 +02:00
scm_mem[qv] optimization
* libguile/list.c (scm_memq, scm_memv): Inline the tortoise/hare check that scm_ilength does, via SCM_VALIDATE_LIST, into the memq/memv bodies. Avoids traversing these lists twice.
This commit is contained in:
parent
3009b93e9b
commit
3b7f4ba37b
1 changed files with 51 additions and 8 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1995,1996,1997,2000,2001,2003,2004,2008,2009,2010
|
/* Copyright (C) 1995,1996,1997,2000,2001,2003,2004,2008,2009,2010,2011
|
||||||
* Free Software Foundation, Inc.
|
* Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -617,8 +617,32 @@ SCM_DEFINE (scm_memq, "memq", 2, 0, 0,
|
||||||
"returned.")
|
"returned.")
|
||||||
#define FUNC_NAME s_scm_memq
|
#define FUNC_NAME s_scm_memq
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_LIST (2, lst);
|
SCM hare = lst, tortoise = lst;
|
||||||
return scm_c_memq (x, lst);
|
|
||||||
|
while (scm_is_pair (hare))
|
||||||
|
{
|
||||||
|
if (scm_is_eq (SCM_CAR (hare), x))
|
||||||
|
return hare;
|
||||||
|
else
|
||||||
|
hare = SCM_CDR (hare);
|
||||||
|
|
||||||
|
if (!scm_is_pair (hare))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (scm_is_eq (SCM_CAR (hare), x))
|
||||||
|
return hare;
|
||||||
|
else
|
||||||
|
hare = SCM_CDR (hare);
|
||||||
|
|
||||||
|
tortoise = SCM_CDR (tortoise);
|
||||||
|
if (SCM_UNLIKELY (scm_is_eq (hare, tortoise)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SCM_LIKELY (scm_is_null (hare)))
|
||||||
|
return SCM_BOOL_F;
|
||||||
|
else
|
||||||
|
scm_wrong_type_arg_msg (FUNC_NAME, 2, lst, "list");
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
@ -633,13 +657,32 @@ SCM_DEFINE (scm_memv, "memv", 2, 0, 0,
|
||||||
"returned.")
|
"returned.")
|
||||||
#define FUNC_NAME s_scm_memv
|
#define FUNC_NAME s_scm_memv
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_LIST (2, lst);
|
SCM hare = lst, tortoise = lst;
|
||||||
for (; !SCM_NULL_OR_NIL_P (lst); lst = SCM_CDR (lst))
|
|
||||||
|
while (scm_is_pair (hare))
|
||||||
{
|
{
|
||||||
if (! scm_is_false (scm_eqv_p (SCM_CAR (lst), x)))
|
if (scm_is_true (scm_eqv_p (SCM_CAR (hare), x)))
|
||||||
return lst;
|
return hare;
|
||||||
|
else
|
||||||
|
hare = SCM_CDR (hare);
|
||||||
|
|
||||||
|
if (!scm_is_pair (hare))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (scm_is_true (scm_eqv_p (SCM_CAR (hare), x)))
|
||||||
|
return hare;
|
||||||
|
else
|
||||||
|
hare = SCM_CDR (hare);
|
||||||
|
|
||||||
|
tortoise = SCM_CDR (tortoise);
|
||||||
|
if (SCM_UNLIKELY (scm_is_eq (hare, tortoise)))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return SCM_BOOL_F;
|
|
||||||
|
if (SCM_LIKELY (scm_is_null (hare)))
|
||||||
|
return SCM_BOOL_F;
|
||||||
|
else
|
||||||
|
scm_wrong_type_arg_msg (FUNC_NAME, 2, lst, "list");
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue