root/include/gpac/map.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Jerome Gorin
 *                      Copyright (c) Telecom ParisTech 2000-2013
 *                                      All rights reserved
 *
 *  This file is part of GPAC / dashcast-Debug@dashcast_build
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC 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.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef _GF_MAP_H_
#define _GF_MAP_H_
#ifdef __cplusplus
extern "C" {
#endif

/*!
 *      \file <map.h>
 *      \brief Hash Map.
 */

/*!
 *      \addtogroup  map_grp Hash map
 *      \ingroup utils_grp
 *      \brief Hash Map
 *
 *      This section documents the map object of the GPAC framework
 *      \note The map use a random function for hashing. Collisions are resolved by using a GF_List on each slot.
 *      @{
 */

#include <gpac/tools.h>


/**
 * \struct GF_Map
 * \brief Map Object.
 *
 * A GF_Map associate key to values.
 */
typedef struct _tag_map GF_Map;


/* Pair structure */

/**
 * \struct GF_Pair
 * \brief Pair structure.
 *
 * Define the association Key/value.
 */
typedef struct {
        char *key;
        void *value;
} GF_Pair;


/**
 * \struct GF_Iterator
 * \brief Map iterator Object.
 *
 * Allows to go through each pair key/value in the map.
 */
typedef struct _it_map {
        /* The current map*/
        GF_Map* map;

        /* The current pair */
        GF_Pair* pair;

        /* The current list */
        u32 ilist;

        /* The current index in the hasmap*/
        u32 hash;

} GF_It_Map;

/*!
 *      \brief map constructor
 *
 *      Constructs a new map object
 *
 *      \param hash_capacity the number of slot in the hash table
 *      \note a zero hash_capacity is not allowed, a hash_capacity of 1 is
 *      equivalent to a gf_list_find from GF_List with a complexity search in o(n)
 *      \return new map object
 */
GF_Map *gf_map_new(u32 hash_capacity);

/*!
 *      \brief map destructor
 *
 *      Destructs a map object
 *      \param ptr map object to destruct
 *      \note The caller is only responsible to destroy the content of the map, not the key
 */
void gf_map_del(GF_Map *ptr);

/*!
 *      \brief Set a new map iterator
 *
 *      Associate a map iterator to a map
 *
 *      \param map the map associated to the iterator
 *      \param it the resulting iterator
 *      \return GF_OK if iterator has been set properly, otherwise a GF_Err
 */
GF_Err gf_map_iter_set(GF_Map* map, GF_It_Map* it);

/*!
 *      \brief return the next value in the map
 *
 *      Return the next value of a GF_Pair in the map
 *      \param it  the map iterator object
 *  \return the next value of the map if exists, otherwise NULL
 */
void* gf_map_iter_has_next(GF_It_Map* it);

/*!
 *      \brief Reset the iterator in the map
 *
 *      Reinitalize the iterator to the beginning of the map
 *      \param it  the map iterator object
 *  \return GF_OK if the iterator has been correctly reinitialize, otherwise a GF_Err
 */
GF_Err gf_map_iter_reset(GF_It_Map* it);

/*!
 *      \brief get count
 *
 *      Returns number of items in the map
 *      \param ptr target map object
 *      \return number of items in the map
 */
u32 gf_map_count(const GF_Map *ptr);

/*!
 *      \brief add item
 *
 *      Adds an item in the map with an associated key
 *
 *      \param ptr target map object
 *      \param key the identified key
 *      \param item item to add
 *      \return GF_OF if insertion occurs properly, GF_NOT_SUPPORTED if the key already exists, a GF_Err in other cases
 *      \note the caller is responsible for the deallocation of the key as it is copyied in the map
 */
GF_Err gf_map_insert(GF_Map *ptr, const char* key, void* item);

/*!
 *      \brief removes the couple key/item from the map
 *
 *      Removes an item from the map given to its key if exists
 *      \param ptr target map object
 *      \param key the key of the item.
 *      \return GF_TRUE if the key has been delete, otherwise GF_FALSE
 *      \note It is the caller responsability to destroy the content of the list if needed
 */
Bool gf_map_rem(GF_Map *ptr, const char* key);

/*!
 *      \brief finds item
 *
 *      Finds a key in the map
 *
 *      \param ptr target map object.
 *      \param key the key to find.
 *      \return a pointer to the corresponding value if found, otherwise NULL.
 */
void* gf_map_find(GF_Map *ptr, const char* key);

/*!
 *      \brief Check if map contains key
 *
 *      \param ptr target map object.
 *      \param key the key to check.
 *      \return GF_TRUE if map contains keys, otherwise GF_FALSE
 */
Bool gf_map_has_key(GF_Map *ptr, const char* key);

/*!
 *      \brief resets map
 *
 *      Resets the content of the map
 *      \param ptr target map object.
 *      \note It is the caller responsability to destroy the content of the list if needed
 */
void gf_map_reset(GF_Map *ptr);


/*! @} */

#ifdef __cplusplus
}
#endif

#endif /* _GF_MAP_H_ */

/* [<][>][^][v][top][bottom][index][help] */