On Fri, Nov 13, 2009 at 3:38 PM, Sasha Khapyorsky <sas...@voltaire.com> wrote:
>
> Add cl_fmap_match() function - it is similar for cl_fmap_get() (getting
> fleximap item by key) with difference that instead of using the map's
> default comparison routine custom compare function can be passed there
> as a parameter.
>
> This can be useful for matching map item by a key pattern.
>
> Signed-off-by: Sasha Khapyorsky <sas...@voltaire.com>
> ---
>
> This function is used in IPv6 SNM MGID compression patch.
>
>  opensm/complib/cl_map.c              |   14 ++++++++++--
>  opensm/complib/libosmcomp.map        |    1 +
>  opensm/include/complib/cl_fleximap.h |   36 
> ++++++++++++++++++++++++++++++++++
>  3 files changed, 48 insertions(+), 3 deletions(-)
>
> diff --git a/opensm/complib/cl_map.c b/opensm/complib/cl_map.c
> index d851bf8..f5fb1f3 100644
> --- a/opensm/complib/cl_map.c
> +++ b/opensm/complib/cl_map.c
> @@ -1144,8 +1144,9 @@ void cl_fmap_init(IN cl_fmap_t * const p_map, IN 
> cl_pfn_fmap_cmp_t pfn_compare)
>        cl_fmap_remove_all(p_map);
>  }
>
> -cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
> -                           IN const void *const p_key)
> +cl_fmap_item_t *cl_fmap_match(IN const cl_fmap_t * const p_map,
> +                             IN const void *const p_key,
> +                             IN cl_pfn_fmap_cmp_t pfn_compare)
>  {
>        cl_fmap_item_t *p_item;
>        int cmp;
> @@ -1156,7 +1157,8 @@ cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const 
> p_map,
>        p_item = __cl_fmap_root(p_map);
>
>        while (p_item != &p_map->nil) {
> -               cmp = p_map->pfn_compare(p_key, p_item->p_key);
> +               cmp = pfn_compare ? pfn_compare(p_key, p_item->p_key) :
> +                       p_map->pfn_compare(p_key, p_item->p_key);
>
>                if (!cmp)
>                        break;  /* just right */
> @@ -1170,6 +1172,12 @@ cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const 
> p_map,
>        return (p_item);
>  }
>
> +cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
> +                           IN const void *const p_key)
> +{
> +       return cl_fmap_match(p_map, p_key, p_map->pfn_compare);
> +}
> +
>  cl_fmap_item_t *cl_fmap_get_next(IN const cl_fmap_t * const p_map,
>                                 IN const void *const p_key)
>  {
> diff --git a/opensm/complib/libosmcomp.map b/opensm/complib/libosmcomp.map
> index 788eb2a..52410cc 100644
> --- a/opensm/complib/libosmcomp.map
> +++ b/opensm/complib/libosmcomp.map
> @@ -66,6 +66,7 @@ OSMCOMP_2.3 {
>                cl_map_merge;
>                cl_map_delta;
>                cl_fmap_init;
> +               cl_fmap_match;
>                cl_fmap_get;
>                cl_fmap_get_next;
>                cl_fmap_apply_func;
> diff --git a/opensm/include/complib/cl_fleximap.h 
> b/opensm/include/complib/cl_fleximap.h
> index ec008cf..b74040f 100644
> --- a/opensm/include/complib/cl_fleximap.h
> +++ b/opensm/include/complib/cl_fleximap.h
> @@ -619,6 +619,42 @@ cl_fmap_item_t *cl_fmap_insert(IN cl_fmap_t * const 
> p_map,
>  *      Flexi Map, cl_fmap_remove, cl_fmap_item_t
>  *********/
>
> +/****f* Component Library: Flexi Map/cl_fmap_match
> +* NAME
> +*      cl_fmap_get

typo: cl_fmap_match

> +*
> +* DESCRIPTION
> +*      The cl_fmap_match function returns the map item matching a key.
> +*
> +* SYNOPSIS
> +*/
> +cl_fmap_item_t *cl_fmap_match(IN const cl_fmap_t * const p_map,
> +                             IN const void *const p_key,
> +                             IN cl_pfn_fmap_cmp_t pfn_compare);
> +/*
> +* PARAMETERS
> +*      p_map
> +*              [in] Pointer to a cl_fmap_t structure from which to retrieve 
> the
> +*              item with the specified key.
> +*
> +*      p_key
> +*              [in] Pointer to a key value used to search for the desired 
> map item.
> +*
> +*      pfn_compare
> +*              [in] Pointer to a compare function to invoke to compare the
> +*              keys of items in the map. Passing NULL here makes such call
> +*              to be equivalent to using cl_fmap_get().
> +*
> +* RETURN VALUES
> +*      Pointer to the map item matching the desired key value.
> +*
> +*      Pointer to the map end if there was no item matching the desired key
> +*      value stored in the flexi map.
> +*
> +* SEE ALSO
> +*      Flexi Map, cl_fmap_remove, cl_fmap_get
> +*********/
> +
>  /****f* Component Library: Flexi Map/cl_fmap_get
>  * NAME
>  *      cl_fmap_get
> --
> 1.6.5.2
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to