New version from Albin Jones, plus fixes by McCallum.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@948 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
mccallum 1996-02-22 15:25:44 +00:00
parent f46b4d9b55
commit 1a34c9461b
34 changed files with 1259 additions and 1292 deletions

View file

@ -46,11 +46,6 @@
#include <objects/RBTreeNode.h> #include <objects/RBTreeNode.h>
#include <objects/SplayTree.h> #include <objects/SplayTree.h>
#include <objects/EltNodeCollector.h>
#include <objects/LinkedListEltNode.h>
#include <objects/BinaryTreeEltNode.h>
#include <objects/RBTreeEltNode.h>
/* Magnitude objects */ /* Magnitude objects */
#include <objects/Magnitude.h> #include <objects/Magnitude.h>
#include <objects/Random.h> #include <objects/Random.h>
@ -75,4 +70,6 @@
#include <objects/Proxy.h> #include <objects/Proxy.h>
#include <objects/ConnectedCoder.h> #include <objects/ConnectedCoder.h>
#include <objects/Invocation.h>
#endif /* __objects_h_OBJECTS_INCLUDE */ #endif /* __objects_h_OBJECTS_INCLUDE */

View file

@ -33,10 +33,10 @@
/**** Type, Constant, and Macro Definitions **********************************/ /**** Type, Constant, and Macro Definitions **********************************/
typedef void *(*objects_malloc_func_t) (size_t, void *); typedef void *(*objects_malloc_func_t) (size_t, const void *);
typedef void *(*objects_calloc_func_t) (size_t, size_t, void *); typedef void *(*objects_calloc_func_t) (size_t, size_t, const void *);
typedef void *(*objects_realloc_func_t) (void *, size_t, void *); typedef void *(*objects_realloc_func_t) (void *, size_t, const void *);
typedef void (*objects_free_func_t) (void *, void *); typedef void (*objects_free_func_t) (void *, const void *);
typedef struct _objects_allocs objects_allocs_t; typedef struct _objects_allocs objects_allocs_t;
@ -46,7 +46,7 @@ struct _objects_allocs
objects_calloc_func_t calloc; objects_calloc_func_t calloc;
objects_realloc_func_t realloc; objects_realloc_func_t realloc;
objects_free_func_t free; objects_free_func_t free;
void *user_data; const void *user_data;
}; };
/* Shorthand macros. */ /* Shorthand macros. */
@ -71,10 +71,10 @@ void *
objects_calloc (objects_allocs_t allocs, size_t n, size_t s); objects_calloc (objects_allocs_t allocs, size_t n, size_t s);
void * void *
objects_realloc (objects_allocs_t allocs, void *p, size_t s); objects_realloc (objects_allocs_t allocs, const void *p, size_t s);
void void
objects_free (objects_allocs_t allocs, void *p); objects_free (objects_allocs_t allocs, const void *p);
size_t size_t
objects_next_power_of_two (size_t start); objects_next_power_of_two (size_t start);

View file

@ -47,7 +47,7 @@ struct _objects_array_bucket
size_t index; size_t index;
/* The bucket's cargo */ /* The bucket's cargo */
void *element; const void *element;
}; };
struct _objects_array struct _objects_array
@ -55,8 +55,8 @@ struct _objects_array
/* Identifying information. */ /* Identifying information. */
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -135,7 +135,7 @@ int objects_array_is_equal_to_array (objects_array_t * array, objects_array_t *
/** Adding **/ /** Adding **/
void *objects_array_at_index_put_element (objects_array_t * array, size_t index, void *element); const void *objects_array_at_index_put_element (objects_array_t * array, size_t index, const void *element);
/** Replacing **/ /** Replacing **/
@ -143,9 +143,9 @@ void *objects_array_at_index_put_element (objects_array_t * array, size_t index,
void objects_array_remove_element_at_index (objects_array_t * array, size_t index); void objects_array_remove_element_at_index (objects_array_t * array, size_t index);
void objects_array_remove_element (objects_array_t * array, void *element); void objects_array_remove_element (objects_array_t * array, const void *element);
void objects_array_remove_element_known_present (objects_array_t * array, void *element); void objects_array_remove_element_known_present (objects_array_t * array, const void *element);
/** Emptying **/ /** Emptying **/
@ -153,19 +153,19 @@ void objects_array_empty (objects_array_t * array);
/** Searching **/ /** Searching **/
int objects_array_contains_element (objects_array_t * array, void *element); int objects_array_contains_element (objects_array_t * array, const void *element);
void *objects_array_element (objects_array_t * array, void *element); const void *objects_array_element (objects_array_t * array, const void *element);
size_t objects_array_index_of_element (objects_array_t * array, void *element); size_t objects_array_index_of_element (objects_array_t * array, const void *element);
void *objects_array_element_at_index (objects_array_t * array, size_t index); const void *objects_array_element_at_index (objects_array_t * array, size_t index);
void **objects_array_all_elements (objects_array_t * array); const void **objects_array_all_elements (objects_array_t * array);
void **objects_array_all_elements_ascending (objects_array_t * array); const void **objects_array_all_elements_ascending (objects_array_t * array);
void **objects_array_all_element_descending (objects_array_t * array); const void **objects_array_all_element_descending (objects_array_t * array);
/** Enumerating **/ /** Enumerating **/
@ -175,9 +175,9 @@ objects_array_enumerator_t objects_array_ascending_enumerator (objects_array_t *
objects_array_enumerator_t objects_array_descending_enumerator (objects_array_t * array); objects_array_enumerator_t objects_array_descending_enumerator (objects_array_t * array);
int objects_array_enumerator_next_index_and_element (objects_array_enumerator_t *enumerator, size_t *index, void **element); int objects_array_enumerator_next_index_and_element (objects_array_enumerator_t *enumerator, size_t *index, const void **element);
int objects_array_enumerator_next_element (objects_array_enumerator_t *enumerator, void **element); int objects_array_enumerator_next_element (objects_array_enumerator_t *enumerator, const void **element);
int objects_array_enumerator_next_index (objects_array_enumerator_t *enumerator, size_t *element); int objects_array_enumerator_next_index (objects_array_enumerator_t *enumerator, size_t *element);

View file

@ -53,8 +53,8 @@ struct _objects_data
{ {
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;

View file

@ -49,7 +49,7 @@ struct _objects_hash_node
objects_hash_node_t *next_in_hash; objects_hash_node_t *next_in_hash;
objects_hash_node_t *prev_in_hash; objects_hash_node_t *prev_in_hash;
void *element; const void *element;
}; };
struct _objects_hash_bucket struct _objects_hash_bucket
@ -64,8 +64,8 @@ struct _objects_hash
{ {
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -144,7 +144,10 @@ objects_hash_t * objects_hash_copy_with_allocs (objects_hash_t * hash, objects_a
* to handle functions that aren't one-to-one is to create a new hash * to handle functions that aren't one-to-one is to create a new hash
* and transform the elements of the first to create the elements of * and transform the elements of the first to create the elements of
* the second. */ * the second. */
objects_hash_t * objects_hash_map_elements (objects_hash_t * hash, void *(*fcn) (void *, void *), void *user_data); objects_hash_t *
objects_hash_map_elements (objects_hash_t * hash,
const void *(*fcn) (const void *, const void *),
const void *user_data);
/** Destroying **/ /** Destroying **/
@ -160,19 +163,22 @@ int objects_hash_is_equal_to_hash (objects_hash_t * hash, objects_hash_t * other
/** Adding **/ /** Adding **/
void *objects_hash_add_element_known_absent (objects_hash_t * hash, void *element); const void *objects_hash_add_element_known_absent (objects_hash_t *hash,
const void *element);
void *objects_hash_add_element (objects_hash_t * hash, void *element); const void *objects_hash_add_element (objects_hash_t *hash,
const void *element);
void *objects_hash_add_element_if_absent (objects_hash_t * hash, void *element); const void *objects_hash_add_element_if_absent (objects_hash_t *hash,
const void *element);
/** Replacing **/ /** Replacing **/
void objects_hash_replace_element (objects_hash_t * hash, void *element); void objects_hash_replace_element (objects_hash_t *hash, const void *element);
/** Removing **/ /** Removing **/
void objects_hash_remove_element (objects_hash_t * hash, void *element); void objects_hash_remove_element (objects_hash_t *hash, const void *element);
/** Emptying **/ /** Emptying **/
@ -182,17 +188,18 @@ void objects_hash_empty (objects_hash_t * hash);
void *objects_hash_any_element (objects_hash_t *hash); void *objects_hash_any_element (objects_hash_t *hash);
int objects_hash_contains_element (objects_hash_t * hash, void *element); int objects_hash_contains_element (objects_hash_t *hash, const void *element);
void *objects_hash_element (objects_hash_t * hash, void *element); const void *objects_hash_element (objects_hash_t *hash, const void *element);
void **objects_hash_all_elements (objects_hash_t * hash); const void **objects_hash_all_elements (objects_hash_t *hash);
/** Enumerating **/ /** Enumerating **/
objects_hash_enumerator_t objects_hash_enumerator (objects_hash_t *hash); objects_hash_enumerator_t objects_hash_enumerator (objects_hash_t *hash);
int objects_hash_enumerator_next_element (objects_hash_enumerator_t *enumerator, void **element); int objects_hash_enumerator_next_element (objects_hash_enumerator_t *enumeratr,
const void **element);
/** Statistics **/ /** Statistics **/

View file

@ -47,7 +47,7 @@ struct _objects_list_node
objects_list_node_t *next_in_list; objects_list_node_t *next_in_list;
objects_list_node_t *prev_in_list; objects_list_node_t *prev_in_list;
void *element; const void *element;
}; };
struct _objects_list struct _objects_list
@ -56,7 +56,7 @@ struct _objects_list
int magic; int magic;
size_t number; size_t number;
char *name; char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -143,9 +143,9 @@ objects_list_t * objects_list_at_index_insert_list (objects_list_t * base_list,
objects_list_t * objects_list_roll_to_nth_element (objects_list_t * list, long int n); objects_list_t * objects_list_roll_to_nth_element (objects_list_t * list, long int n);
objects_list_t * objects_list_roll_to_element (objects_list_t * list, void *element); objects_list_t * objects_list_roll_to_element (objects_list_t * list, const void *element);
objects_list_t * objects_list_roll_to_nth_occurrance_of_element (objects_list_t * list, long int n, void *element); objects_list_t * objects_list_roll_to_nth_occurrance_of_element (objects_list_t * list, long int n, const void *element);
objects_list_t * objects_list_invert (objects_list_t * list); objects_list_t * objects_list_invert (objects_list_t * list);
@ -153,39 +153,39 @@ objects_list_t * objects_list_swap_elements_at_indices (objects_list_t * list, l
/** Adding **/ /** Adding **/
void *objects_list_append_element (objects_list_t * list, void *element); const void *objects_list_append_element (objects_list_t * list, const void *element);
void *objects_list_append_element_if_absent (objects_list_t * list, void *element); const void *objects_list_append_element_if_absent (objects_list_t * list, const void *element);
void *objects_list_prepend_element (objects_list_t * list, void *element); const void *objects_list_prepend_element (objects_list_t * list, const void *element);
void *objects_list_prepend_element_if_absent (objects_list_t * list, void *element); const void *objects_list_prepend_element_if_absent (objects_list_t * list, const void *element);
void *objects_list_at_index_insert_element (objects_list_t * list, long int n, void *element); const void *objects_list_at_index_insert_element (objects_list_t * list, long int n, const void *element);
void *objects_list_at_index_insert_element_if_absent (objects_list_t * list, long int n, void *element); const void *objects_list_at_index_insert_element_if_absent (objects_list_t * list, long int n, const void *element);
void *objects_list_queue_push_element (objects_list_t * list, void *element); const void *objects_list_queue_push_element (objects_list_t * list, const void *element);
void *objects_list_stack_push_element (objects_list_t * list, void *element); const void *objects_list_stack_push_element (objects_list_t * list, const void *element);
/** Replacing **/ /** Replacing **/
void objects_list_replace_nth_occurrance_of_element (objects_list_t * list, long int n, void *old_element, void *new_element); void objects_list_replace_nth_occurrance_of_element (objects_list_t * list, long int n, const void *old_element, const void *new_element);
void objects_list_replace_element (objects_list_t * list, void *old_element, void *new_element); void objects_list_replace_element (objects_list_t * list, const void *old_element, const void *new_element);
void objects_list_replace_nth_element (objects_list_t * list, long int n, void *new_element); void objects_list_replace_nth_element (objects_list_t * list, long int n, const void *new_element);
void objects_list_replace_first_element (objects_list_t * list, void *new_element); void objects_list_replace_first_element (objects_list_t * list, const void *new_element);
void objects_list_replace_last_element (objects_list_t * list, void *new_element); void objects_list_replace_last_element (objects_list_t * list, const void *new_element);
/** Removing **/ /** Removing **/
void objects_list_remove_nth_occurrence_of_element (objects_list_t * list, long int n, void *element); void objects_list_remove_nth_occurrence_of_element (objects_list_t * list, long int n, const void *element);
void objects_list_remove_element (objects_list_t * list, void *element); void objects_list_remove_element (objects_list_t * list, const void *element);
void objects_list_remove_nth_element (objects_list_t * list, long int n); void objects_list_remove_nth_element (objects_list_t * list, long int n);
@ -207,17 +207,17 @@ void objects_list_empty (objects_list_t * list);
/** Searching **/ /** Searching **/
int objects_list_contains_element (objects_list_t * list, void *element); int objects_list_contains_element (objects_list_t * list, const void *element);
void *objects_list_element (objects_list_t * list, void *element); const void *objects_list_element (objects_list_t * list, const void *element);
void *objects_list_nth_element (objects_list_t * list, long int n); const void *objects_list_nth_element (objects_list_t * list, long int n);
void *objects_list_first_element (objects_list_t * list); const void *objects_list_first_element (objects_list_t * list);
void *objects_list_last_element (objects_list_t * list); const void *objects_list_last_element (objects_list_t * list);
void **objects_list_all_elements (objects_list_t * list); const void **objects_list_all_elements (objects_list_t * list);
/** Enumerating **/ /** Enumerating **/
@ -227,13 +227,13 @@ objects_list_enumerator_t objects_list_forward_enumerator (objects_list_t * list
objects_list_enumerator_t objects_list_reverse_enumerator (objects_list_t * list); objects_list_enumerator_t objects_list_reverse_enumerator (objects_list_t * list);
int objects_list_enumerator_next_element (objects_list_enumerator_t *enumerator, void **element); int objects_list_enumerator_next_element (objects_list_enumerator_t *enumerator, const void **element);
/** Mapping **/ /** Mapping **/
/* NO WARNING: The mapping function FCN need not be one-to-one on the /* NO WARNING: The mapping function FCN need not be one-to-one on the
* elements of LIST. In fact, FCN may do whatever it likes. */ * elements of LIST. In fact, FCN may do whatever it likes. */
objects_list_t * objects_list_map_elements (objects_list_t * list, void *(*fcn) (void *, void *), void *user_data); objects_list_t * objects_list_map_elements (objects_list_t * list, const void *(*fcn) (const void *, const void *), const void *user_data);
/** Statistics **/ /** Statistics **/

View file

@ -44,8 +44,8 @@ typedef struct _objects_map_enumerator objects_map_enumerator_t;
struct _objects_map_node struct _objects_map_node
{ {
void *key; const void *key;
void *value; const void *value;
objects_map_bucket_t *bucket; objects_map_bucket_t *bucket;
objects_map_t *map; objects_map_t *map;
@ -70,7 +70,7 @@ struct _objects_map
int magic; int magic;
size_t number; size_t number;
char *name; char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
objects_callbacks_t key_callbacks; objects_callbacks_t key_callbacks;
@ -203,19 +203,19 @@ int
/** Finding elements in a mapionary **/ /** Finding elements in a mapionary **/
int int
objects_map_contains_key (objects_map_t * map, void *key); objects_map_contains_key (objects_map_t * map, const void *key);
int int
objects_map_key_and_value (objects_map_t * map, objects_map_key_and_value (objects_map_t * map,
void *key, const void *key,
void **old_key, void **old_key,
void **value); void **value);
void * const void *
objects_map_key (objects_map_t * map, void *key); objects_map_key (objects_map_t * map, const void *key);
void * const void *
objects_map_value (objects_map_t * map, void *key); objects_map_value_at_key (objects_map_t * map, const void *key);
/** Enumerating the nodes and elements of a mapionary **/ /** Enumerating the nodes and elements of a mapionary **/
@ -223,58 +223,58 @@ objects_map_enumerator_t
objects_map_enumerator (objects_map_t * map); objects_map_enumerator (objects_map_t * map);
int int
objects_map_enumerator_next_key_and_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key_and_value (objects_map_enumerator_t *enumeratr,
void **key, const void **key,
void **value); const void **value);
int int
objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator,
void **key); const void **key);
int int
objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator,
void **value); const void **value);
/** Obtaining an array of the elements of a mapionary **/ /** Obtaining an array of the elements of a mapionary **/
void ** const void **
objects_map_all_keys_and_values (objects_map_t * map); objects_map_all_keys_and_values (objects_map_t * map);
void ** const void **
objects_map_all_keys (objects_map_t * map); objects_map_all_keys (objects_map_t * map);
void ** const void **
objects_map_all_values (objects_map_t * map); objects_map_all_values (objects_map_t * map);
/** Removing **/ /** Removing **/
void void
objects_map_remove_key (objects_map_t * map, void *key); objects_map_remove_key (objects_map_t * map, const void *key);
void void
objects_map_empty (objects_map_t * map); objects_map_empty (objects_map_t * map);
/** Adding **/ /** Adding **/
void * const void *
objects_map_at_key_put_value_known_absent (objects_map_t * map, objects_map_at_key_put_value_known_absent (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
void * const void *
objects_map_at_key_put_value (objects_map_t * map, objects_map_at_key_put_value (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
void * const void *
objects_map_at_key_put_value_if_absent (objects_map_t * map, objects_map_at_key_put_value_if_absent (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
/** Replacing **/ /** Replacing **/
void void
objects_map_replace_key (objects_map_t * map, void *key); objects_map_replace_key (objects_map_t * map, const void *key);
/** Comparing **/ /** Comparing **/
@ -300,15 +300,15 @@ objects_map_t *
* equal) keys. */ * equal) keys. */
objects_map_t * objects_map_t *
objects_map_map_keys (objects_map_t * map, objects_map_map_keys (objects_map_t * map,
void *(*kfcn) (void *, void *), const void *(*kfcn) (const void *, const void *),
void *user_data); const void *user_data);
/* NO WARNING: The mapping function VFCN need not be one-to-one on /* NO WARNING: The mapping function VFCN need not be one-to-one on
* (the equivalence classes of) values. */ * (the equivalence classes of) values. */
objects_map_t * objects_map_t *
objects_map_map_values (objects_map_t * map, objects_map_map_values (objects_map_t * map,
void *(*vfcn) (void *, void *), const void *(*vfcn) (const void *, const void *),
void *user_data); const void *user_data);
/** Miscellaneous **/ /** Miscellaneous **/

View file

@ -47,7 +47,7 @@ struct _objects_array_bucket
size_t index; size_t index;
/* The bucket's cargo */ /* The bucket's cargo */
void *element; const void *element;
}; };
struct _objects_array struct _objects_array
@ -55,8 +55,8 @@ struct _objects_array
/* Identifying information. */ /* Identifying information. */
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -135,7 +135,7 @@ int objects_array_is_equal_to_array (objects_array_t * array, objects_array_t *
/** Adding **/ /** Adding **/
void *objects_array_at_index_put_element (objects_array_t * array, size_t index, void *element); const void *objects_array_at_index_put_element (objects_array_t * array, size_t index, const void *element);
/** Replacing **/ /** Replacing **/
@ -143,9 +143,9 @@ void *objects_array_at_index_put_element (objects_array_t * array, size_t index,
void objects_array_remove_element_at_index (objects_array_t * array, size_t index); void objects_array_remove_element_at_index (objects_array_t * array, size_t index);
void objects_array_remove_element (objects_array_t * array, void *element); void objects_array_remove_element (objects_array_t * array, const void *element);
void objects_array_remove_element_known_present (objects_array_t * array, void *element); void objects_array_remove_element_known_present (objects_array_t * array, const void *element);
/** Emptying **/ /** Emptying **/
@ -153,19 +153,19 @@ void objects_array_empty (objects_array_t * array);
/** Searching **/ /** Searching **/
int objects_array_contains_element (objects_array_t * array, void *element); int objects_array_contains_element (objects_array_t * array, const void *element);
void *objects_array_element (objects_array_t * array, void *element); const void *objects_array_element (objects_array_t * array, const void *element);
size_t objects_array_index_of_element (objects_array_t * array, void *element); size_t objects_array_index_of_element (objects_array_t * array, const void *element);
void *objects_array_element_at_index (objects_array_t * array, size_t index); const void *objects_array_element_at_index (objects_array_t * array, size_t index);
void **objects_array_all_elements (objects_array_t * array); const void **objects_array_all_elements (objects_array_t * array);
void **objects_array_all_elements_ascending (objects_array_t * array); const void **objects_array_all_elements_ascending (objects_array_t * array);
void **objects_array_all_element_descending (objects_array_t * array); const void **objects_array_all_element_descending (objects_array_t * array);
/** Enumerating **/ /** Enumerating **/
@ -175,9 +175,9 @@ objects_array_enumerator_t objects_array_ascending_enumerator (objects_array_t *
objects_array_enumerator_t objects_array_descending_enumerator (objects_array_t * array); objects_array_enumerator_t objects_array_descending_enumerator (objects_array_t * array);
int objects_array_enumerator_next_index_and_element (objects_array_enumerator_t *enumerator, size_t *index, void **element); int objects_array_enumerator_next_index_and_element (objects_array_enumerator_t *enumerator, size_t *index, const void **element);
int objects_array_enumerator_next_element (objects_array_enumerator_t *enumerator, void **element); int objects_array_enumerator_next_element (objects_array_enumerator_t *enumerator, const void **element);
int objects_array_enumerator_next_index (objects_array_enumerator_t *enumerator, size_t *element); int objects_array_enumerator_next_index (objects_array_enumerator_t *enumerator, size_t *element);

View file

@ -33,12 +33,14 @@
/**** Type, Constant, and Macro Definitions **********************************/ /**** Type, Constant, and Macro Definitions **********************************/
typedef size_t (*objects_hash_func_t) (void *, void *); typedef size_t (*objects_hash_func_t) (const void *, const void *);
typedef int (*objects_compare_func_t) (void *, void *, void *); typedef int (*objects_compare_func_t) (const void *, const void *,
typedef int (*objects_is_equal_func_t) (void *, void *, void *); const void *);
typedef void *(*objects_retain_func_t) (void *, void *); typedef int (*objects_is_equal_func_t) (const void *, const void *,
typedef void (*objects_release_func_t) (void *, void *); const void *);
typedef void *(*objects_describe_func_t) (void *, void *); typedef void *(*objects_retain_func_t) (const void *, const void *);
typedef void (*objects_release_func_t) (void *, const void *);
typedef void *(*objects_describe_func_t) (const void *, const void *);
typedef struct _objects_callbacks objects_callbacks_t; typedef struct _objects_callbacks objects_callbacks_t;
@ -50,7 +52,7 @@ struct _objects_callbacks
objects_retain_func_t retain; objects_retain_func_t retain;
objects_release_func_t release; objects_release_func_t release;
objects_describe_func_t describe; objects_describe_func_t describe;
void *not_an_item_marker; const void *not_an_item_marker;
}; };
/** Callbacks for various types **/ /** Callbacks for various types **/
@ -88,85 +90,85 @@ objects_callbacks_standardize (objects_callbacks_t callbacks);
/** Using callbacks **/ /** Using callbacks **/
size_t objects_hash (objects_callbacks_t callbacks, size_t objects_hash (objects_callbacks_t callbacks,
void *thing, const void *thing,
void *user_data); const void *user_data);
int objects_compare (objects_callbacks_t callbacks, int objects_compare (objects_callbacks_t callbacks,
void *thing1, const void *thing1,
void *thing2, const void *thing2,
void *user_data); const void *user_data);
int objects_is_equal (objects_callbacks_t callbacks, int objects_is_equal (objects_callbacks_t callbacks,
void *thing1, const void *thing1,
void *thing2, const void *thing2,
void *user_data); const void *user_data);
void *objects_retain (objects_callbacks_t callbacks, void *objects_retain (objects_callbacks_t callbacks,
void *thing, const void *thing,
void *user_data); const void *user_data);
void objects_release (objects_callbacks_t callbacks, void objects_release (objects_callbacks_t callbacks,
void *thing, void *thing,
void *user_data); const void *user_data);
/* FIXME: Decide what to do with this describe stuff. We'd really like /* FIXME: Decide what to do with this describe stuff. We'd really like
* them to return Strings? Or would we rather they be `char *'s? * them to return Strings? Or would we rather they be `char *'s?
* Or something else? */ * Or something else? */
void *objects_describe (objects_callbacks_t callbacks, void *objects_describe (objects_callbacks_t callbacks,
void *thing, const void *thing,
void *user_data); const void *user_data);
void *objects_not_an_item_marker (objects_callbacks_t); const void *objects_not_an_item_marker (objects_callbacks_t);
/** Specific callback functions **/ /** Specific callback functions **/
/* For `void *' */ /* For `void *' */
size_t objects_void_p_hash(void *ptr); size_t objects_void_p_hash(const void *ptr);
int objects_void_p_compare(void *ptr, void *qtr); int objects_void_p_compare(const void *ptr, const void *qtr);
int objects_void_p_is_equal(void *ptr, void *qtr); int objects_void_p_is_equal(const void *ptr, const void *qtr);
void *objects_void_p_retain(void *ptr); const void *objects_void_p_retain(const void *ptr);
void objects_void_p_release(void *ptr); void objects_void_p_release(const void *ptr);
void *objects_void_p_describe(void *ptr); const void *objects_void_p_describe(const void *ptr);
/* For `void *' */ /* For `void *' */
size_t objects_owned_void_p_hash(void *ptr); size_t objects_owned_void_p_hash(const void *ptr);
int objects_owned_void_p_compare(void *ptr, void *qtr); int objects_owned_void_p_compare(const void *ptr, const void *qtr);
int objects_owned_void_p_is_equal(void *ptr, void *qtr); int objects_owned_void_p_is_equal(const void *ptr, const void *qtr);
void *objects_owned_void_p_retain(void *ptr); const void *objects_owned_void_p_retain(const void *ptr);
void objects_owned_void_p_release(void *ptr); void objects_owned_void_p_release(const void *ptr);
void *objects_owned_void_p_describe(void *ptr); const void *objects_owned_void_p_describe(const void *ptr);
/* For `int' */ /* For `int' */
size_t objects_int_hash(void *i); size_t objects_int_hash(const void *i);
int objects_int_compare(void *i, void *j); int objects_int_compare(const void *i, const void *j);
int objects_int_is_equal(void *i, void *j); int objects_int_is_equal(const void *i, const void *j);
void *objects_int_retain(void *i); const void *objects_int_retain(const void *i);
void objects_int_release(void *i); void objects_int_release(const void *i);
void *objects_int_describe(void *i); const void *objects_int_describe(const void *i);
/* For `int *' */ /* For `int *' */
size_t objects_int_p_hash(void *iptr); size_t objects_int_p_hash(const void *iptr);
int objects_int_p_compare(void *iptr, void *jptr); int objects_int_p_compare(const void *iptr, const void *jptr);
int objects_int_p_is_equal(void *iptr, void *jptr); int objects_int_p_is_equal(const void *iptr, const void *jptr);
void *objects_int_p_retain(void *iptr); const void *objects_int_p_retain(const void *iptr);
void objects_int_p_release(void *iptr); void objects_int_p_release(const void *iptr);
void *objects_int_p_describe(void *iptr); const void *objects_int_p_describe(const void *iptr);
/* For `char *' */ /* For `char *' */
size_t objects_char_p_hash(void *cptr); size_t objects_char_p_hash(const void *cptr);
int objects_char_p_compare(void *cptr, void *dptr); int objects_char_p_compare(const void *cptr, const void *dptr);
int objects_char_p_is_equal(void *cptr, void *dptr); int objects_char_p_is_equal(const void *cptr, const void *dptr);
void *objects_char_p_retain(void *cptr); const void *objects_char_p_retain(const void *cptr);
void objects_char_p_release(void *cptr); void objects_char_p_release(const void *cptr);
void *objects_char_p_describe(void *cptr); const void *objects_char_p_describe(const void *cptr);
/* For `id' */ /* For `id' */
size_t objects_id_hash(void *obj); size_t objects_id_hash(const void *obj);
int objects_id_compare(void *obj, void *jbo); int objects_id_compare(const void *obj, const void *jbo);
int objects_id_is_equal(void *obj, void *jbo); int objects_id_is_equal(const void *obj, const void *jbo);
void *objects_id_retain(void *obj); const void *objects_id_retain(const void *obj);
void objects_id_release(void *obj); void objects_id_release(const void *obj);
void *objects_id_describe(void *obj); const void *objects_id_describe(const void *obj);
#endif /* __callbacks_h_OBJECTS_INCLUDE */ #endif /* __callbacks_h_OBJECTS_INCLUDE */

View file

@ -49,7 +49,7 @@ struct _objects_hash_node
objects_hash_node_t *next_in_hash; objects_hash_node_t *next_in_hash;
objects_hash_node_t *prev_in_hash; objects_hash_node_t *prev_in_hash;
void *element; const void *element;
}; };
struct _objects_hash_bucket struct _objects_hash_bucket
@ -64,8 +64,8 @@ struct _objects_hash
{ {
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -144,7 +144,10 @@ objects_hash_t * objects_hash_copy_with_allocs (objects_hash_t * hash, objects_a
* to handle functions that aren't one-to-one is to create a new hash * to handle functions that aren't one-to-one is to create a new hash
* and transform the elements of the first to create the elements of * and transform the elements of the first to create the elements of
* the second. */ * the second. */
objects_hash_t * objects_hash_map_elements (objects_hash_t * hash, void *(*fcn) (void *, void *), void *user_data); objects_hash_t *
objects_hash_map_elements (objects_hash_t * hash,
const void *(*fcn) (const void *, const void *),
const void *user_data);
/** Destroying **/ /** Destroying **/
@ -160,19 +163,22 @@ int objects_hash_is_equal_to_hash (objects_hash_t * hash, objects_hash_t * other
/** Adding **/ /** Adding **/
void *objects_hash_add_element_known_absent (objects_hash_t * hash, void *element); const void *objects_hash_add_element_known_absent (objects_hash_t *hash,
const void *element);
void *objects_hash_add_element (objects_hash_t * hash, void *element); const void *objects_hash_add_element (objects_hash_t *hash,
const void *element);
void *objects_hash_add_element_if_absent (objects_hash_t * hash, void *element); const void *objects_hash_add_element_if_absent (objects_hash_t *hash,
const void *element);
/** Replacing **/ /** Replacing **/
void objects_hash_replace_element (objects_hash_t * hash, void *element); void objects_hash_replace_element (objects_hash_t *hash, const void *element);
/** Removing **/ /** Removing **/
void objects_hash_remove_element (objects_hash_t * hash, void *element); void objects_hash_remove_element (objects_hash_t *hash, const void *element);
/** Emptying **/ /** Emptying **/
@ -182,17 +188,18 @@ void objects_hash_empty (objects_hash_t * hash);
void *objects_hash_any_element (objects_hash_t *hash); void *objects_hash_any_element (objects_hash_t *hash);
int objects_hash_contains_element (objects_hash_t * hash, void *element); int objects_hash_contains_element (objects_hash_t *hash, const void *element);
void *objects_hash_element (objects_hash_t * hash, void *element); const void *objects_hash_element (objects_hash_t *hash, const void *element);
void **objects_hash_all_elements (objects_hash_t * hash); const void **objects_hash_all_elements (objects_hash_t *hash);
/** Enumerating **/ /** Enumerating **/
objects_hash_enumerator_t objects_hash_enumerator (objects_hash_t *hash); objects_hash_enumerator_t objects_hash_enumerator (objects_hash_t *hash);
int objects_hash_enumerator_next_element (objects_hash_enumerator_t *enumerator, void **element); int objects_hash_enumerator_next_element (objects_hash_enumerator_t *enumeratr,
const void **element);
/** Statistics **/ /** Statistics **/

View file

@ -47,7 +47,7 @@ struct _objects_list_node
objects_list_node_t *next_in_list; objects_list_node_t *next_in_list;
objects_list_node_t *prev_in_list; objects_list_node_t *prev_in_list;
void *element; const void *element;
}; };
struct _objects_list struct _objects_list
@ -56,7 +56,7 @@ struct _objects_list
int magic; int magic;
size_t number; size_t number;
char *name; char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -143,9 +143,9 @@ objects_list_t * objects_list_at_index_insert_list (objects_list_t * base_list,
objects_list_t * objects_list_roll_to_nth_element (objects_list_t * list, long int n); objects_list_t * objects_list_roll_to_nth_element (objects_list_t * list, long int n);
objects_list_t * objects_list_roll_to_element (objects_list_t * list, void *element); objects_list_t * objects_list_roll_to_element (objects_list_t * list, const void *element);
objects_list_t * objects_list_roll_to_nth_occurrance_of_element (objects_list_t * list, long int n, void *element); objects_list_t * objects_list_roll_to_nth_occurrance_of_element (objects_list_t * list, long int n, const void *element);
objects_list_t * objects_list_invert (objects_list_t * list); objects_list_t * objects_list_invert (objects_list_t * list);
@ -153,39 +153,39 @@ objects_list_t * objects_list_swap_elements_at_indices (objects_list_t * list, l
/** Adding **/ /** Adding **/
void *objects_list_append_element (objects_list_t * list, void *element); const void *objects_list_append_element (objects_list_t * list, const void *element);
void *objects_list_append_element_if_absent (objects_list_t * list, void *element); const void *objects_list_append_element_if_absent (objects_list_t * list, const void *element);
void *objects_list_prepend_element (objects_list_t * list, void *element); const void *objects_list_prepend_element (objects_list_t * list, const void *element);
void *objects_list_prepend_element_if_absent (objects_list_t * list, void *element); const void *objects_list_prepend_element_if_absent (objects_list_t * list, const void *element);
void *objects_list_at_index_insert_element (objects_list_t * list, long int n, void *element); const void *objects_list_at_index_insert_element (objects_list_t * list, long int n, const void *element);
void *objects_list_at_index_insert_element_if_absent (objects_list_t * list, long int n, void *element); const void *objects_list_at_index_insert_element_if_absent (objects_list_t * list, long int n, const void *element);
void *objects_list_queue_push_element (objects_list_t * list, void *element); const void *objects_list_queue_push_element (objects_list_t * list, const void *element);
void *objects_list_stack_push_element (objects_list_t * list, void *element); const void *objects_list_stack_push_element (objects_list_t * list, const void *element);
/** Replacing **/ /** Replacing **/
void objects_list_replace_nth_occurrance_of_element (objects_list_t * list, long int n, void *old_element, void *new_element); void objects_list_replace_nth_occurrance_of_element (objects_list_t * list, long int n, const void *old_element, const void *new_element);
void objects_list_replace_element (objects_list_t * list, void *old_element, void *new_element); void objects_list_replace_element (objects_list_t * list, const void *old_element, const void *new_element);
void objects_list_replace_nth_element (objects_list_t * list, long int n, void *new_element); void objects_list_replace_nth_element (objects_list_t * list, long int n, const void *new_element);
void objects_list_replace_first_element (objects_list_t * list, void *new_element); void objects_list_replace_first_element (objects_list_t * list, const void *new_element);
void objects_list_replace_last_element (objects_list_t * list, void *new_element); void objects_list_replace_last_element (objects_list_t * list, const void *new_element);
/** Removing **/ /** Removing **/
void objects_list_remove_nth_occurrence_of_element (objects_list_t * list, long int n, void *element); void objects_list_remove_nth_occurrence_of_element (objects_list_t * list, long int n, const void *element);
void objects_list_remove_element (objects_list_t * list, void *element); void objects_list_remove_element (objects_list_t * list, const void *element);
void objects_list_remove_nth_element (objects_list_t * list, long int n); void objects_list_remove_nth_element (objects_list_t * list, long int n);
@ -207,17 +207,17 @@ void objects_list_empty (objects_list_t * list);
/** Searching **/ /** Searching **/
int objects_list_contains_element (objects_list_t * list, void *element); int objects_list_contains_element (objects_list_t * list, const void *element);
void *objects_list_element (objects_list_t * list, void *element); const void *objects_list_element (objects_list_t * list, const void *element);
void *objects_list_nth_element (objects_list_t * list, long int n); const void *objects_list_nth_element (objects_list_t * list, long int n);
void *objects_list_first_element (objects_list_t * list); const void *objects_list_first_element (objects_list_t * list);
void *objects_list_last_element (objects_list_t * list); const void *objects_list_last_element (objects_list_t * list);
void **objects_list_all_elements (objects_list_t * list); const void **objects_list_all_elements (objects_list_t * list);
/** Enumerating **/ /** Enumerating **/
@ -227,13 +227,13 @@ objects_list_enumerator_t objects_list_forward_enumerator (objects_list_t * list
objects_list_enumerator_t objects_list_reverse_enumerator (objects_list_t * list); objects_list_enumerator_t objects_list_reverse_enumerator (objects_list_t * list);
int objects_list_enumerator_next_element (objects_list_enumerator_t *enumerator, void **element); int objects_list_enumerator_next_element (objects_list_enumerator_t *enumerator, const void **element);
/** Mapping **/ /** Mapping **/
/* NO WARNING: The mapping function FCN need not be one-to-one on the /* NO WARNING: The mapping function FCN need not be one-to-one on the
* elements of LIST. In fact, FCN may do whatever it likes. */ * elements of LIST. In fact, FCN may do whatever it likes. */
objects_list_t * objects_list_map_elements (objects_list_t * list, void *(*fcn) (void *, void *), void *user_data); objects_list_t * objects_list_map_elements (objects_list_t * list, const void *(*fcn) (const void *, const void *), const void *user_data);
/** Statistics **/ /** Statistics **/

View file

@ -44,8 +44,8 @@ typedef struct _objects_map_enumerator objects_map_enumerator_t;
struct _objects_map_node struct _objects_map_node
{ {
void *key; const void *key;
void *value; const void *value;
objects_map_bucket_t *bucket; objects_map_bucket_t *bucket;
objects_map_t *map; objects_map_t *map;
@ -70,7 +70,7 @@ struct _objects_map
int magic; int magic;
size_t number; size_t number;
char *name; char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
objects_callbacks_t key_callbacks; objects_callbacks_t key_callbacks;
@ -203,19 +203,19 @@ int
/** Finding elements in a mapionary **/ /** Finding elements in a mapionary **/
int int
objects_map_contains_key (objects_map_t * map, void *key); objects_map_contains_key (objects_map_t * map, const void *key);
int int
objects_map_key_and_value (objects_map_t * map, objects_map_key_and_value (objects_map_t * map,
void *key, const void *key,
void **old_key, void **old_key,
void **value); void **value);
void * const void *
objects_map_key (objects_map_t * map, void *key); objects_map_key (objects_map_t * map, const void *key);
void * const void *
objects_map_value (objects_map_t * map, void *key); objects_map_value_at_key (objects_map_t * map, const void *key);
/** Enumerating the nodes and elements of a mapionary **/ /** Enumerating the nodes and elements of a mapionary **/
@ -223,58 +223,58 @@ objects_map_enumerator_t
objects_map_enumerator (objects_map_t * map); objects_map_enumerator (objects_map_t * map);
int int
objects_map_enumerator_next_key_and_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key_and_value (objects_map_enumerator_t *enumeratr,
void **key, const void **key,
void **value); const void **value);
int int
objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator,
void **key); const void **key);
int int
objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator,
void **value); const void **value);
/** Obtaining an array of the elements of a mapionary **/ /** Obtaining an array of the elements of a mapionary **/
void ** const void **
objects_map_all_keys_and_values (objects_map_t * map); objects_map_all_keys_and_values (objects_map_t * map);
void ** const void **
objects_map_all_keys (objects_map_t * map); objects_map_all_keys (objects_map_t * map);
void ** const void **
objects_map_all_values (objects_map_t * map); objects_map_all_values (objects_map_t * map);
/** Removing **/ /** Removing **/
void void
objects_map_remove_key (objects_map_t * map, void *key); objects_map_remove_key (objects_map_t * map, const void *key);
void void
objects_map_empty (objects_map_t * map); objects_map_empty (objects_map_t * map);
/** Adding **/ /** Adding **/
void * const void *
objects_map_at_key_put_value_known_absent (objects_map_t * map, objects_map_at_key_put_value_known_absent (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
void * const void *
objects_map_at_key_put_value (objects_map_t * map, objects_map_at_key_put_value (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
void * const void *
objects_map_at_key_put_value_if_absent (objects_map_t * map, objects_map_at_key_put_value_if_absent (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
/** Replacing **/ /** Replacing **/
void void
objects_map_replace_key (objects_map_t * map, void *key); objects_map_replace_key (objects_map_t * map, const void *key);
/** Comparing **/ /** Comparing **/
@ -300,15 +300,15 @@ objects_map_t *
* equal) keys. */ * equal) keys. */
objects_map_t * objects_map_t *
objects_map_map_keys (objects_map_t * map, objects_map_map_keys (objects_map_t * map,
void *(*kfcn) (void *, void *), const void *(*kfcn) (const void *, const void *),
void *user_data); const void *user_data);
/* NO WARNING: The mapping function VFCN need not be one-to-one on /* NO WARNING: The mapping function VFCN need not be one-to-one on
* (the equivalence classes of) values. */ * (the equivalence classes of) values. */
objects_map_t * objects_map_t *
objects_map_map_values (objects_map_t * map, objects_map_map_values (objects_map_t * map,
void *(*vfcn) (void *, void *), const void *(*vfcn) (const void *, const void *),
void *user_data); const void *user_data);
/** Miscellaneous **/ /** Miscellaneous **/

View file

@ -46,11 +46,6 @@
#include <objects/RBTreeNode.h> #include <objects/RBTreeNode.h>
#include <objects/SplayTree.h> #include <objects/SplayTree.h>
#include <objects/EltNodeCollector.h>
#include <objects/LinkedListEltNode.h>
#include <objects/BinaryTreeEltNode.h>
#include <objects/RBTreeEltNode.h>
/* Magnitude objects */ /* Magnitude objects */
#include <objects/Magnitude.h> #include <objects/Magnitude.h>
#include <objects/Random.h> #include <objects/Random.h>
@ -75,4 +70,6 @@
#include <objects/Proxy.h> #include <objects/Proxy.h>
#include <objects/ConnectedCoder.h> #include <objects/ConnectedCoder.h>
#include <objects/Invocation.h>
#endif /* __objects_h_OBJECTS_INCLUDE */ #endif /* __objects_h_OBJECTS_INCLUDE */

View file

@ -3,8 +3,8 @@
* *
* Author: Albin L. Jones <Albin.L.Jones@Dartmouth.EDU> * Author: Albin L. Jones <Albin.L.Jones@Dartmouth.EDU>
* Created: Mon Dec 12 23:54:09 EST 1994 * Created: Mon Dec 12 23:54:09 EST 1994
* Updated: Sat Feb 10 15:59:11 EST 1996 * Updated: Mon Feb 12 22:55:15 EST 1996
* Serial: 96.02.10.01 * Serial: 96.02.12.01
* *
* This file is part of the GNU Objective C Class Library. * This file is part of the GNU Objective C Class Library.
* *
@ -30,6 +30,7 @@
#include <Foundation/NSArray.h> #include <Foundation/NSArray.h>
#include <Foundation/NSException.h> #include <Foundation/NSException.h>
#include <Foundation/NSHashTable.h> #include <Foundation/NSHashTable.h>
#include <NSCallBacks.h>
#include <Foundation/atoz.h> #include <Foundation/atoz.h>
#include <objects/hash.h> #include <objects/hash.h>
@ -37,9 +38,7 @@
/* These are to increase readabilty locally. */ /* These are to increase readabilty locally. */
typedef unsigned int (*NSHT_hash_func_t)(NSHashTable *, const void *); typedef unsigned int (*NSHT_hash_func_t)(NSHashTable *, const void *);
typedef BOOL (*NSHT_isEqual_func_t)(NSHashTable *, typedef BOOL (*NSHT_isEqual_func_t)(NSHashTable *, const void *, const void *);
const void *,
const void *);
typedef void (*NSHT_retain_func_t)(NSHashTable *, const void *); typedef void (*NSHT_retain_func_t)(NSHashTable *, const void *);
typedef void (*NSHT_release_func_t)(NSHashTable *, void *); typedef void (*NSHT_release_func_t)(NSHashTable *, void *);
typedef NSString *(*NSHT_describe_func_t)(NSHashTable *, const void *); typedef NSString *(*NSHT_describe_func_t)(NSHashTable *, const void *);
@ -48,65 +47,65 @@ typedef NSString *(*NSHT_describe_func_t)(NSHashTable *, const void *);
const NSHashTableCallBacks NSIntHashCallBacks = const NSHashTableCallBacks NSIntHashCallBacks =
{ {
(NSHT_hash_func_t) _NSLF_int_hash, (NSHT_hash_func_t) _NS_int_hash,
(NSHT_isEqual_func_t) _NSLF_int_is_equal, (NSHT_isEqual_func_t) _NS_int_is_equal,
(NSHT_retain_func_t) fn_null_function, (NSHT_retain_func_t) _NS_int_retain,
(NSHT_release_func_t) fn_null_function, (NSHT_release_func_t) _NS_int_release,
(NSHT_describe_Func_t) _NSLF_int_describe (NSHT_describe_func_t) _NS_int_describe
}; };
const NSHashTableCallBacks NSNonOwnedPointerHashCallBacks = const NSHashTableCallBacks NSNonOwnedPointerHashCallBacks =
{ {
(NSHT_hash_func_t) _NSLF_void_p_hash, (NSHT_hash_func_t) _NS_owned_void_p_hash,
(NSHT_isEqual_func_t) _NSLF_void_p_is_equal, (NSHT_isEqual_func_t) _NS_owned_void_p_is_equal,
(NSHT_retain_func_t) fn_null_function, (NSHT_retain_func_t) _NS_owned_void_p_retain,
(NSHT_release_func_t) fn_null_function, (NSHT_release_func_t) _NS_owned_void_p_release,
(NSHT_describe_func_t) _NSLF_void_p_describe (NSHT_describe_func_t) _NS_owned_void_p_describe
}; };
const NSHashTableCallBacks NSNonRetainedObjectsHashCallBacks = const NSHashTableCallBacks NSNonRetainedObjectsHashCallBacks =
{ {
(NSHT_hash_func_t) _NSLF_id_hash, (NSHT_hash_func_t) _NS_non_retained_id_hash,
(NSHT_isEqual_func_t) _NSLF_id_is_equal, (NSHT_isEqual_func_t) _NS_non_retained_id_is_equal,
(NSHT_retain_func_t) fn_null_function, (NSHT_retain_func_t) _NS_non_retained_id_retain,
(NSHT_release_func_t) fn_null_function, (NSHT_release_func_t) _NS_non_retained_id_release,
(NSHT_describe_func_t) _NSLF_id_describe (NSHT_describe_func_t) _NS_non_retained_id_describe
}; };
const NSHashTableCallBacks NSObjectsHashCallBacks = const NSHashTableCallBacks NSObjectsHashCallBacks =
{ {
(NSHT_hash_func_t) _NSLF_id_hash, (NSHT_hash_func_t) _NS_id_hash,
(NSHT_isEqual_func_t) _NSLF_id_is_equal, (NSHT_isEqual_func_t) _NS_id_is_equal,
(NSHT_retain_func_t) _NSLF_id_retain, (NSHT_retain_func_t) _NS_id_retain,
(NSHT_release_func_t) _NSLF_id_object, (NSHT_release_func_t) _NS_id_release,
(NSHT_describe_func_t) _NSLF_id_describe (NSHT_describe_func_t) _NS_id_describe
}; };
const NSHashTableCallBacks NSOwnedPointerHashCallBacks = const NSHashTableCallBacks NSOwnedPointerHashCallBacks =
{ {
(NSHT_hash_func_t) _NSLF_void_p_hash, (NSHT_hash_func_t) _NS_owned_void_p_hash,
(NSHT_isEqual_func_t) _NSLF_void_p_is_equal, (NSHT_isEqual_func_t) _NS_owned_void_p_is_equal,
(NSHT_retain_func_t) fn_null_function, (NSHT_retain_func_t) _NS_owned_void_p_retain,
(NSHT_release_func_t) _NSLF_void_p_release, (NSHT_release_func_t) _NS_owned_void_p_release,
(NSHT_describe_func_t) _NSLF_void_p_describe (NSHT_describe_func_t) _NS_owned_void_p_describe
}; };
const NSHashTableCallBacks NSPointerToStructHashCallBacks = const NSHashTableCallBacks NSPointerToStructHashCallBacks =
{ {
(NSHT_hash_func_t) _NSLF_int_p_hash, (NSHT_hash_func_t) _NS_int_p_hash,
(NSHT_isEqual_func_t) _NSLF_int_p_is_equal, (NSHT_isEqual_func_t) _NS_int_p_is_equal,
(NSHT_retain_func_t) fn_null_function, (NSHT_retain_func_t) _NS_int_p_retain,
(NSHT_release_func_t) fn_null_function, (NSHT_release_func_t) _NS_int_p_release,
(NSHT_describe_func_t) _NSLF_int_p_describe (NSHT_describe_func_t) _NS_int_p_describe
}; };
/** Macros **/ /** Macros **/
#define NSHT_ZONE(T) \ #define NSHT_ZONE(T) \
((NSZone *)((fn_hash_allocs((fn_hash_t *)(T))).user_data)) ((NSZone *)((objects_hash_allocs((objects_hash_t *)(T))).user_data))
#define NSHT_CALLBACKS(T) \ #define NSHT_CALLBACKS(T) \
(*((NSHashTableCallBacks *)(__void_p__(fn_hash_extra((fn_hash_t *)(T)))))) (*((NSHashTableCallBacks *)(objects_hash_extra((objects_hash_t *)(T)))))
#define NSHT_DESCRIBE(T, P) \ #define NSHT_DESCRIBE(T, P) \
NSHT_CALLBACKS((T)).describe((T), (P)) NSHT_CALLBACKS((T)).describe((T), (P))
@ -114,111 +113,102 @@ const NSHashTableCallBacks NSPointerToStructHashCallBacks =
/** Dummy callbacks **/ /** Dummy callbacks **/
size_t size_t
_NSHT_hash(fn_generic_t element, void *table) _NSHT_hash (const void *element, const void *table)
{ {
return NSHT_CALLBACKS(table).hash((NSHashTable *)table, return (NSHT_CALLBACKS(table)).hash ((NSHashTable *)table, element);
__void_p__(element));
} }
int int
_NSHT_compare(fn_generic_t element1, _NSHT_compare (const void *element1, const void *element2, const void *table)
fn_generic_t element2,
void *table)
{ {
return !(NSHT_CALLBACKS(table).isEqual((NSHashTable *)table, return !((NSHT_CALLBACKS(table)).isEqual ((NSHashTable *)table,
__void_p__(element1), element1,
__void_p__(element2))); element2));
} }
int int
_NSHT_is_equal(fn_generic_t element1, _NSHT_is_equal (const void *element1, const void *element2, const void *table)
fn_generic_t element2,
void *table)
{ {
return NSHT_CALLBACKS(table).isEqual((NSHashTable *) table, return (NSHT_CALLBACKS(table)).isEqual ((NSHashTable *) table,
__void_p__(element1), element1,
__void_p__(element2)); element2);
} }
fn_generic_t void *
_NSHT_retain(fn_generic_t element, void *table) _NSHT_retain (const void *element, const void *table)
{ {
NSHT_CALLBACKS(table).retain((NSHashTable *)table, (NSHT_CALLBACKS(table)).retain ((NSHashTable *)table, element);
__void_p__(element)); return (void*) element;
return element;
} }
void void
_NSHT_release(fn_generic_t element, void *table) _NSHT_release (void *element, const void *table)
{ {
NSHT_CALLBACKS(table).release(table, __void_p__(element)); (NSHT_CALLBACKS(table)).release ((NSHashTable*)table, (void*)element);
return; return;
} }
/* These are wrappers for getting at the real callbacks. */ /* These are wrappers for getting at the real callbacks. */
const fn_callbacks_t _NSHT_callbacks = const objects_callbacks_t _NSHT_callbacks =
{ {
_NSHT_hash, _NSHT_hash,
_NSHT_compare, _NSHT_compare,
_NSHT_is_equal, _NSHT_is_equal,
_NSHT_retain, _NSHT_retain,
_NSHT_release, _NSHT_release,
(fn_describe_func_t)fn_null_function, 0,
0 0
}; };
/** Extra, extra **/ /** Extra, extra **/
/* Make a copy of a hash table's callbacks. */ /* Make a copy of a hash table's callbacks. */
fn_generic_t void *
_NSHT_extra_retain(fn_generic_t extra, void *table) _NSHT_extra_retain (const void *extra, const void *table)
{ {
/* Pick out the callbacks in EXTRA. */ /* Pick out the callbacks in EXTRA. */
NSHashTableCallBacks *callBacks = (NSHashTableCallBacks *)__void_p__(extra); NSHashTableCallBacks *callBacks = (NSHashTableCallBacks *)(extra);
/* Find our zone. */ /* Find our zone. */
NSZone *zone = NSHT_ZONE(table); NSZone *zone = NSHT_ZONE(table);
/* A pointer to some new callbacks. */ /* A pointer to some new callbacks. */
NSHashTableCallbacks *newCallBacks; NSHashTableCallBacks *newCallBacks;
/* Set aside space for our new callbacks in the right zone. */ /* Set aside space for our new callbacks in the right zone. */
newCallBacks = (NSHashTableCallBacks *)NSZoneMalloc(zone, newCallBacks = (NSHashTableCallBacks *)
NSZoneMalloc(zone,
sizeof(NSHashTableCallBacks)); sizeof(NSHashTableCallBacks));
/* Copy CALLBACKS into NEWCALLBACKS. */ /* Copy CALLBACKS into NEWCALLBACKS. */
*newCallBacks = *callBacks; *newCallBacks = *callBacks;
/* Stuff NEWCALLBACKS into EXTRA. */
__void_p__(extra) = newCallBacks;
/* Return our new EXTRA. */ /* Return our new EXTRA. */
return extra; return (void*) extra;
} }
void void
_NSHT_extra_release(fn_generic_t extra, void *table) _NSHT_extra_release (void *extra, const void *table)
{ {
void *ptr = __void_p__(extra);
NSZone *zone = NSHT_ZONE(table); NSZone *zone = NSHT_ZONE(table);
if (ptr != NULL) if (extra != NULL)
NSZoneFree(zone, ptr); NSZoneFree(zone, (void*)extra);
return; return;
} }
/* The idea here is that these callbacks ensure that the /* The idea here is that these callbacks ensure that the
* NSHashTableCallbacks which are associated with a given NSHashTable * NSHashTableCallbacks which are associated with a given NSHashTable
* remain so throughout the life of the table and its copies. */ * remain so associated throughout the life of the table and its copies. */
fn_callbacks_t _NSHT_extra_callbacks = objects_callbacks_t _NSHT_extra_callbacks =
{ {
(fn_hash_func_t) fn_generic_hash, (objects_hash_func_t) objects_void_p_hash,
(fn_is_equal_func_t) fn_generic_is_equal, (objects_compare_func_t) objects_void_p_compare,
(fn_compare_func_t) fn_generic_compare, (objects_is_equal_func_t) objects_void_p_is_equal,
_NSHT_extra_retain, _NSHT_extra_retain,
_NSHT_extra_release, _NSHT_extra_release,
(fn_describe_func_t) fn_null_function, 0,
0 0
}; };
@ -232,30 +222,30 @@ NSCreateHashTableWithZone(NSHashTableCallBacks callBacks,
NSZone *zone) NSZone *zone)
{ {
NSHashTable *table; NSHashTable *table;
fn_callbacks_t callbacks; objects_callbacks_t callbacks;
fn_allocs_t allocs; objects_allocs_t allocs;
/* These callbacks just look in the TABLE's extra and uses the /* These callbacks just look in the TABLE's extra and uses the
* callbacks there. See above for precise definitions. */ * callbacks there. See above for precise definitions. */
callbacks = _NSHT_callbacks; callbacks = _NSHT_callbacks;
allocs = fn_allocs_for_zone(zone); allocs = objects_allocs_for_zone(zone);
/* Then we build the table. */ /* Then we build the table. */
table = fn_hash_with_allocs_with_callbacks(allocs, callbacks); table = objects_hash_with_allocs_with_callbacks(allocs, callbacks);
if (table != NULL) if (table != NULL)
{ {
fn_generic_t extra; const void *extra;
/* Resize TABLE to CAPACITY. */ /* Resize TABLE to CAPACITY. */
fn_hash_resize(table, capacity); objects_hash_resize(table, capacity);
/* Set aside space for the NSHashTableExtra. */ /* Set aside space for the NSHashTableExtra. */
__void_p__(extra) = &callBacks; extra = &callBacks;
/* Add EXTRA to TABLE. This takes care of everything for us. */ /* Add EXTRA to TABLE. This takes care of everything for us. */
fn_hash_set_extra_callbacks(table, _NSHT_extra_callbacks); objects_hash_set_extra_callbacks(table, _NSHT_extra_callbacks);
fn_hash_set_extra(table, extra); objects_hash_set_extra(table, extra);
} }
/* Wah-hoo! */ /* Wah-hoo! */
@ -274,13 +264,13 @@ NSCreateHashTable(NSHashTableCallBacks callBacks,
NSHashTable * NSHashTable *
NSCopyHashTableWithZone (NSHashTable *table, NSZone *zone) NSCopyHashTableWithZone (NSHashTable *table, NSZone *zone)
{ {
fn_allocs_t allocs; objects_allocs_t allocs;
NSHashTable *new_table; NSHashTable *new_table;
/* Due to the wonders of modern Libfn technology, everything we care /* Due to the wonders of modern Libfn technology, everything we care
* about is automagically transferred. */ * about is automagically transferred. */
allocs = fn_allocs_for_zone(zone); allocs = objects_allocs_for_zone(zone);
new_table = fn_hash_copy_with_allocs(table, allocs); new_table = objects_hash_copy_with_allocs(table, allocs);
return new_table; return new_table;
} }
@ -290,9 +280,9 @@ NSCopyHashTableWithZone(NSHashTable *table, NSZone *zone)
void void
NSFreeHashTable (NSHashTable *table) NSFreeHashTable (NSHashTable *table)
{ {
/* Due to the wonders of modern Libfn technology, everything we care /* Due to the wonders of modern Libobjects structure technology,
* about is automagically and safely destroyed. */ * everything we care about is automagically and safely destroyed. */
fn_hash_dealloc(table); objects_hash_dealloc(table);
return; return;
} }
@ -301,7 +291,7 @@ NSFreeHashTable(NSHashTable *table)
void void
NSResetHashTable (NSHashTable *table) NSResetHashTable (NSHashTable *table)
{ {
fn_hash_empty(table); objects_hash_empty(table);
return; return;
} }
@ -310,7 +300,7 @@ NSResetHashTable(NSHashTable *table)
BOOL BOOL
NSCompareHashTables (NSHashTable *table1, NSHashTable *table2) NSCompareHashTables (NSHashTable *table1, NSHashTable *table2)
{ {
return (fn_hash_is_equal_to_hash(table1, table2) ? YES : NO); return (objects_hash_is_equal_to_hash(table1, table2) ? YES : NO);
} }
/** Counting **/ /** Counting **/
@ -318,7 +308,7 @@ NSCompareHashTables(NSHashTable *table1, NSHashTable *table2)
unsigned int unsigned int
NSCountHashTable (NSHashTable *table) NSCountHashTable (NSHashTable *table)
{ {
return (unsigned int) fn_hash_count(table); return (unsigned int) objects_hash_count(table);
} }
/** Retrieving **/ /** Retrieving **/
@ -326,57 +316,28 @@ NSCountHashTable(NSHashTable *table)
void * void *
NSHashGet (NSHashTable *table, const void *pointer) NSHashGet (NSHashTable *table, const void *pointer)
{ {
fn_generic_t element; /* Just make the call. You know the number. */
fn_generic_t member; return (void*) objects_hash_element (table, pointer);
/* Stuff POINTER into (the `void *' facet of) ELEMENT. */
__void_p__(element) = pointer;
/* Look up ELEMENT in TABLE. */
member = fn_hash_element(table, element);
/* Return the `void *' facet of MEMBER. */
return __void_p__(member);
} }
NSArray * NSArray *
NSAllHashTableObjects (NSHashTable *table) NSAllHashTableObjects (NSHashTable *table)
{ {
NSArray *array; NSMutableArray *array;
fn_generic_t *elements; NSHashEnumerator enumerator;
id *objects; id element;
unsigned int count;
/* FIXME: We should really be locking TABLE somehow, to insure /* FIXME: We should really be locking TABLE somehow, to insure
* the thread-safeness of this method. */ * the thread-safeness of this method. */
/* Get an array of the (generically-typed) elements of TABLE. */ /* Get us a mutable array with plenty of space. */
elements = fn_hash_all_elements(table); array = [NSMutableArray arrayWithCapacity:NSCountHashTable(table)];
/* How many thing are in TABLE? */ /* Get an enumerator for TABLE. */
count = NSCountHashTable(table); enumerator = NSEnumerateHashTable(table);
/* Make enough room for our array of `id's together with a while ((element = NSNextHashEnumeratorItem(&enumerator)) != 0)
* terminating `nil' that we add below. */ [array addObject:element];
objects = fn_calloc(fn_hash_allocs(table), count + 1, sizeof(id));
/* Step through the generic array and copy the `id' facet of each
* into the corresponding member of the objects array. Remember
* that this function is only suppossed to be called when TABLE
* contains objects. Otherwise, everything goes to hell remarkably
* quickly. */
for (i = 0; i < count; ++i)
objects[i] = __id__(elements[i]);
/* `nil' terminate OBJECTS. */
objects[i] = nil;
/* Build the NSArray to return. */
array = [[NSArray alloc] initWithObjects:objects count:count];
/* Free up all the space we allocated here. */
fn_free(fn_hash_allocs(table), elements);
fn_free(fn_hash_allocs(table), objects);
/* FIXME: Should ARRAY returned be `autorelease'd? */ /* FIXME: Should ARRAY returned be `autorelease'd? */
return [array autorelease]; return [array autorelease];
@ -387,19 +348,19 @@ NSAllHashTableObjects(NSHashTable *table)
NSHashEnumerator NSHashEnumerator
NSEnumerateHashTable (NSHashTable *table) NSEnumerateHashTable (NSHashTable *table)
{ {
return fn_hash_enumerator(table); return objects_hash_enumerator (table);
} }
void * void *
NSNextHashEnumeratorItem (NSHashEnumerator *enumerator) NSNextHashEnumeratorItem (NSHashEnumerator *enumerator)
{ {
fn_generic_t element; const void *element;
/* Grab the next element. */ /* Grab the next element. */
fn_hash_enumerator_next_element(enumerator, &element); objects_hash_enumerator_next_element (enumerator, &element);
/* Return ELEMENT's `void *' facet. */ /* Return ELEMENT. */
return __void_p__(element); return (void*) element;
} }
/** Adding **/ /** Adding **/
@ -407,69 +368,54 @@ NSNextHashEnumeratorItem(NSHashEnumerator *enumerator)
void void
NSHashInsert (NSHashTable *table, const void *pointer) NSHashInsert (NSHashTable *table, const void *pointer)
{ {
fn_generic_t element; /* Place POINTER in TABLE. */
objects_hash_add_element (table, pointer);
/* Stuff POINTER into ELEMENT. */
__void_p__(element) = (void *)pointer;
/* Place ELEMENT in TABLE. */
fn_hash_add_element(table, element);
/* OpenStep doesn't care for any return value, so... */
return; return;
} }
void void
NSHashInsertKnownAbsent(NSHashTable *table, const void *pointer) NSHashInsertKnownAbsent (NSHashTable *table, const void *element)
{ {
fn_generic_t element; if (objects_hash_contains_element(table, element))
__void_p__(element) = pointer;
if (fn_hash_contains_element(table, element))
{ {
/* FIXME: I should make this give the user/programmer more /* FIXME: I should make this give the user/programmer more
* information. Not difficult to do, just something for a later * information. Not difficult to do, just something for a later
* date. */ * date. */
[NSException raise:NSInvalidArgumentException [NSException raise:NSInvalidArgumentException
format:@"Attempted reinsertion of \"%@\" into a hash table.", format:@"Attempted reinsertion of \"%@\" into a hash table.",
NSHT_DESCRIBE(table, pointer)]; NSHT_DESCRIBE(table, element)];
} }
else else
{ {
fn_hash_add_element_known_absent(table, element); objects_hash_add_element_known_absent(table, element);
} }
return; return;
} }
void * void *
NSHashInsertIfAbsent(NSHashTable *table, const void *pointer) NSHashInsertIfAbsent (NSHashTable *table, const void *element)
{ {
fn_generic_t element; const void *old_element;
/* Stuff POINTER into ELEMENT. */
__void_p__(element) = (void *)pointer;
/* Place ELEMENT in TABLE. */ /* Place ELEMENT in TABLE. */
element = fn_hash_add_element_if_absent(table, element); old_element = objects_hash_add_element_if_absent(table, element);
/* Return the `void *' facet of ELEMENT. */ /* Return the version of ELEMENT in TABLE now. */
return __void_p__(element); return (void*) old_element;
} }
/** Removing **/ /** Removing **/
void void
NSHashRemove(NSHashTable *table, const void *pointer) NSHashRemove (NSHashTable *table, const void *element)
{ {
fn_generic_t element;
/* Stuff POINTER into ELEMENT. */
__void_p__(element) = pointer;
/* Remove ELEMENT from TABLE. */ /* Remove ELEMENT from TABLE. */
fn_hash_remove_element(table, element); objects_hash_remove_element(table, element);
/* OpenStep doesn't care about return values here, so... */
return; return;
} }
@ -481,23 +427,22 @@ NSHashRemove(NSHashTable *table, const void *pointer)
NSString * NSString *
NSStringFromHashTable (NSHashTable *table) NSStringFromHashTable (NSHashTable *table)
{ {
NSString *string; NSMutableString *string;
NSHashEnumerator enumerator; NSHashEnumerator enumerator;
void *pointer; const void *pointer;
/* This will be our string. */ /* This will be our string. */
string = [NSMutableString string]; string = [NSMutableString stringWithCapacity:0];
/* Get an enumerator for TABLE. */ /* Get an enumerator for TABLE. */
enumerator = NSEnumerateHashTable(table); enumerator = NSEnumerateHashTable(table);
/* Iterate over the elements of TABLE, appending the description of /* Iterate over the elements of TABLE, appending the description of
* each to the mutable string STRING. */ * each to the mutable string STRING. */
while ((pointer = NSNextHashEnumeratorItem(&enumerator)) != NULL) while ((pointer = NSNextHashEnumeratorItem(&enumerator)) != 0)
[string appendFormat:@"%@;", NSHT_DESCRIBE(table, pointer)]; [string appendFormat:@"%@;", NSHT_DESCRIBE(table, pointer)];
/* Note that this string'll need to be `retain'ed. */ /* Note that this string'll need to be `retain'ed. */
/* FIXME: Should I `autorelease' STRING? I think so. */ /* FIXME: Should I `autorelease' STRING? I think so. */
return [string autorelease]; return (NSString *)[string autorelease];
} }

View file

@ -26,17 +26,19 @@
/**** Included Headers *******************************************************/ /**** Included Headers *******************************************************/
#include <Foundation/NSObject.h>
#include <Foundation/NSString.h> #include <Foundation/NSString.h>
#include <Foundation/NSArray.h> #include <Foundation/NSArray.h>
#include <Foundation/NSException.h> #include <Foundation/NSException.h>
#include <Foundation/_NSLibfn.h>
#include <Foundation/NSMapTable.h> #include <Foundation/NSMapTable.h>
#include <fn/map.h> #include <NSCallBacks.h>
#include <Foundation/atoz.h>
#include <objects/map.h>
/**** Type, Constant, and Macro Definitions **********************************/ /**** Type, Constant, and Macro Definitions **********************************/
/* This is for keeping track of information... */ /* This is for keeping track of information... */
typedef struct _NSMT_extra NSMT_extra_t; typedef struct _NSMT_extra _NSMT_extra_t;
struct _NSMT_extra struct _NSMT_extra
{ {
@ -56,29 +58,29 @@ const NSMapTableKeyCallBacks NSIntMapKeyCallBacks =
{ {
(NSMT_hash_func_t) _NS_int_hash, (NSMT_hash_func_t) _NS_int_hash,
(NSMT_is_equal_func_t) _NS_int_is_equal, (NSMT_is_equal_func_t) _NS_int_is_equal,
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_int_retain,
(NSMT_release_func_t) fn_null_function, (NSMT_release_func_t) _NS_int_release,
(NSMT_describe_func_t) _NS_int_describe, (NSMT_describe_func_t) _NS_int_describe,
(const void *) 0 0
}; };
const NSMapTableKeyCallBacks NSNonOwnedPointerMapKeyCallBacks = const NSMapTableKeyCallBacks NSNonOwnedPointerMapKeyCallBacks =
{ {
(NSMT_hash_func_t) _NS_void_p_hash, (NSMT_hash_func_t) _NS_non_owned_void_p_hash,
(NSMT_is_equal_func_t) _NS_void_p_is_equal, (NSMT_is_equal_func_t) _NS_non_owned_void_p_is_equal,
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_non_owned_void_p_retain,
(NSMT_release_func_t) fn_null_function, (NSMT_release_func_t) _NS_non_owned_void_p_release,
(NSMT_describe_func_t) _NS_void_p_describe, (NSMT_describe_func_t) _NS_non_owned_void_p_describe,
(const void *) NULL 0
}; };
const NSMapTableKeyCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks = const NSMapTableKeyCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks =
{ {
(NSMT_hash_func_t) _NS_void_p_hash, (NSMT_hash_func_t) _NS_non_owned_void_p_hash,
(NSMT_is_equal_func_t) _NS_void_p_is_equal, (NSMT_is_equal_func_t) _NS_non_owned_void_p_is_equal,
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_non_owned_void_p_retain,
(NSMT_release_func_t) fn_null_function, (NSMT_release_func_t) _NS_non_owned_void_p_release,
(NSMT_describe_func_t) _NS_void_p_describe, (NSMT_describe_func_t) _NS_non_owned_void_p_describe,
/* FIXME: Oh my. Is this really ok? I did it in a moment of /* FIXME: Oh my. Is this really ok? I did it in a moment of
* weakness. A fit of madness, I say! And if this is wrong, what * weakness. A fit of madness, I say! And if this is wrong, what
* *should* it be?!? */ * *should* it be?!? */
@ -87,12 +89,12 @@ const NSMapTableKeyCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks =
const NSMapTableKeyCallBacks NSNonRetainedObjectMapKeyCallBacks = const NSMapTableKeyCallBacks NSNonRetainedObjectMapKeyCallBacks =
{ {
(NSMT_hash_func_t) _NS_id_hash, (NSMT_hash_func_t) _NS_non_retained_id_hash,
(NSMT_is_equal_func_t) _NS_id_is_equal, (NSMT_is_equal_func_t) _NS_non_retained_id_is_equal,
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_non_retained_id_retain,
(NSMT_release_func_t) fn_null_function, (NSMT_release_func_t) _NS_non_retained_id_release,
(NSMT_describe_func_t) _NS_id_describe, (NSMT_describe_func_t) _NS_non_retained_id_describe,
(const void *) NULL 0
}; };
const NSMapTableKeyCallBacks NSObjectMapKeyCallBacks = const NSMapTableKeyCallBacks NSObjectMapKeyCallBacks =
@ -102,31 +104,31 @@ const NSMapTableKeyCallBacks NSObjectMapKeyCallBacks =
(NSMT_retain_func_t) _NS_id_retain, (NSMT_retain_func_t) _NS_id_retain,
(NSMT_release_func_t) _NS_id_release, (NSMT_release_func_t) _NS_id_release,
(NSMT_describe_func_t) _NS_id_describe, (NSMT_describe_func_t) _NS_id_describe,
(const void *) NULL 0
}; };
const NSMapTableKeyCallBacks NSOwnedPointerMapKeyCallBacks = const NSMapTableKeyCallBacks NSOwnedPointerMapKeyCallBacks =
{ {
(NSMT_hash_func_t) _NS_void_p_hash, (NSMT_hash_func_t) _NS_owned_void_p_hash,
(NSMT_is_equal_func_t) _NS_void_p_is_equal, (NSMT_is_equal_func_t) _NS_owned_void_p_is_equal,
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_owned_void_p_retain,
(NSMT_release_func_t) _NS_void_p_release, (NSMT_release_func_t) _NS_owned_void_p_release,
(NSMT_describe_func_t) _NS_void_p_describe, (NSMT_describe_func_t) _NS_owned_void_p_describe,
(const void *) NULL 0
}; };
const NSMapTableValueCallBacks NSIntMapValueCallBacks = const NSMapTableValueCallBacks NSIntMapValueCallBacks =
{ {
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_int_retain,
(NSMT_release_func_t) fn_null_function, (NSMT_release_func_t) _NS_int_release,
(NSMT_describe_func_t) _NS_int_describe (NSMT_describe_func_t) _NS_int_describe
}; };
const NSMapTableValueCallBacks NSNonOwnedPointerMapValueCallBacks = const NSMapTableValueCallBacks NSNonOwnedPointerMapValueCallBacks =
{ {
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_non_owned_void_p_retain,
(NSMT_release_func_t) fn_null_function, (NSMT_release_func_t) _NS_non_owned_void_p_release,
(NSMT_describe_func_t) _NS_void_p_describe (NSMT_describe_func_t) _NS_non_owned_void_p_describe
}; };
const NSMapTableValueCallBacks NSObjectMapValueCallBacks = const NSMapTableValueCallBacks NSObjectMapValueCallBacks =
@ -138,18 +140,18 @@ const NSMapTableValueCallBacks NSObjectMapValueCallBacks =
const NSMapTableValueCallBacks NSOwnedPointerMapValueCallBacks = const NSMapTableValueCallBacks NSOwnedPointerMapValueCallBacks =
{ {
(NSMT_retain_func_t) fn_null_function, (NSMT_retain_func_t) _NS_owned_void_p_retain,
(NSMT_release_func_t) _NS_void_p_release, (NSMT_release_func_t) _NS_owned_void_p_release,
(NSMT_describe_func_t) _NS_void_p_describe (NSMT_describe_func_t) _NS_owned_void_p_describe
}; };
/** Macros **/ /** Macros **/
#define NSMT_ZONE(T) \ #define NSMT_ZONE(T) \
((NSZone *)((fn_map_allocs((fn_map_t *)(T))).user_data)) ((NSZone *)((objects_map_allocs((objects_map_t *)(T))).user_data))
#define NSMT_EXTRA(T) \ #define NSMT_EXTRA(T) \
((NSMT_extra_t *)(__void_p__(fn_map_extra((fn_map_t *)(T))))) ((_NSMT_extra_t *)(objects_map_extra((objects_map_t *)(T))))
#define NSMT_KEY_CALLBACKS(T) \ #define NSMT_KEY_CALLBACKS(T) \
((NSMT_EXTRA((T)))->keyCallBacks) ((NSMT_EXTRA((T)))->keyCallBacks)
@ -166,126 +168,118 @@ const NSMapTableValueCallBacks NSOwnedPointerMapValueCallBacks =
/** Dummy callbacks **/ /** Dummy callbacks **/
size_t size_t
_NSMT_key_hash(fn_generic_t element, void *table) _NSMT_key_hash (const void *element, const void *table)
{ {
return NSMT_KEY_CALLBACKS(table).hash((NSMapTable *)table, return NSMT_KEY_CALLBACKS(table).hash((NSMapTable *)table,
__void_p__(element)); element);
} }
int int
_NSMT_key_compare(fn_generic_t element1, _NSMT_key_compare (const void *element1, const void *element2,
fn_generic_t element2, const void *table)
void *table)
{ {
return !(NSMT_KEY_CALLBACKS(table).isEqual((NSMapTable *)table, return !(NSMT_KEY_CALLBACKS(table).isEqual((NSMapTable *)table,
__void_p__(element1), element1,
__void_p__(element2))); element2));
} }
int int
_NSMT_key_is_equal(fn_generic_t element1, _NSMT_key_is_equal (const void *element1, const void *element2,
fn_generic_t element2, const void *table)
void *table)
{ {
return NSMT_KEY_CALLBACKS(table).isEqual((NSMapTable *) table, return NSMT_KEY_CALLBACKS(table).isEqual((NSMapTable *) table,
__void_p__(element1), element1,
__void_p__(element2)); element2);
} }
fn_generic_t void *
_NSMT_key_retain(fn_generic_t element, void *table) _NSMT_key_retain (const void *element, const void *table)
{ {
NSMT_KEY_CALLBACKS(table).retain((NSMapTable *)table, NSMT_KEY_CALLBACKS(table).retain((NSMapTable *)table, element);
__void_p__(element)); return (void*) element;
return element;
} }
void void
_NSMT_key_release(fn_generic_t element, void *table) _NSMT_key_release (void *element, const void *table)
{ {
NSMT_KEY_CALLBACKS(table).release(table, __void_p__(element)); NSMT_KEY_CALLBACKS(table).release ((NSMapTable*)table, element);
return; return;
} }
fn_generic_t void *
_NSMT_value_retain(fn_generic_t element, void *table) _NSMT_value_retain (const void *element, const void *table)
{ {
NSMT_VALUE_CALLBACKS(table).retain((NSMapTable *)table, NSMT_VALUE_CALLBACKS(table).retain ((NSMapTable *)table, element);
__void_p__(element)); return (void*) element;
return element;
} }
void void
_NSMT_value_release(fn_generic_t element, void *table) _NSMT_value_release (void *element, const void *table)
{ {
NSMT_VALUE_CALLBACKS(table).release(table, __void_p__(element)); NSMT_VALUE_CALLBACKS(table).release ((NSMapTable*)table, element);
return; return;
} }
/* These are wrappers for getting at the real callbacks. */ /* These are wrappers for getting at the real callbacks. */
fn_callbacks_t _NSMT_key_callbacks = objects_callbacks_t _NSMT_key_callbacks =
{ {
_NSMT_key_hash, _NSMT_key_hash,
_NSMT_key_compare, _NSMT_key_compare,
_NSMT_key_is_equal, _NSMT_key_is_equal,
_NSMT_key_retain, _NSMT_key_retain,
_NSMT_key_release, _NSMT_key_release,
(fn_describe_func_t)fn_null_function, 0,
0 0
}; };
fn_callbacks_t objects_callbacks_t
_NSMT_callbacks_for_key_callbacks (NSMapTableKeyCallBacks keyCallBacks) _NSMT_callbacks_for_key_callbacks (NSMapTableKeyCallBacks keyCallBacks)
{ {
fn_callbacks_t cb = _NSMT_key_callbacks; objects_callbacks_t cb = _NSMT_key_callbacks;
__void_p__(cb.not_an_item_marker) = (void *)(keyCallBacks.notAKeyMarker); cb.not_an_item_marker = keyCallBacks.notAKeyMarker;
return callbacks; return cb;
} }
fn_callbacks_t _NSMT_value_callbacks = objects_callbacks_t _NSMT_value_callbacks =
{ {
(fn_hash_func_t) fn_generic_hash, (objects_hash_func_t) objects_void_p_hash,
(fn_compare_func_t) fn_generic_compare, (objects_compare_func_t) objects_void_p_compare,
(fn_is_equal_func_t) fn_generic_is_equal, (objects_is_equal_func_t) objects_void_p_is_equal,
_NSMT_value_retain, _NSMT_value_retain,
_NSMT_value_release, _NSMT_value_release,
(fn_describe_func_t)fn_null_function, 0,
0 0
}; };
/** Extra, extra **/ /** Extra, extra **/
/* Make a copy of a hash table's callbacks. */ /* Make a copy of a hash table's callbacks. */
fn_generic_t void *
_NSMT_extra_retain(fn_generic_t g, void *table) _NSMT_extra_retain(const void *extra, const void *table)
{ {
/* A pointer to some space for new callbacks. */ /* A pointer to some space for new callbacks. */
NSMT_extra_t *new_extra; _NSMT_extra_t *new_extra;
/* Set aside space for our new callbacks in the right zone. */ /* Set aside space for our new callbacks in the right zone. */
new_extra = (NSMT_extra_t *)NSZoneMalloc(NSMT_ZONE(table), new_extra = (_NSMT_extra_t *)NSZoneMalloc(NSMT_ZONE(table),
sizeof(NSMT_extra_t)); sizeof(_NSMT_extra_t));
/* Copy the old callbacks into NEW_EXTRA. */ /* Copy the old callbacks into NEW_EXTRA. */
*new_extra = *((NSMT_extra_t *)(__void_p__(g))) *new_extra = *((_NSMT_extra_t *)(extra));
/* Stuff NEW_EXTRA into G. */
__void_p__(g) = new_extra;
/* Return our new EXTRA. */ /* Return our new EXTRA. */
return g; return new_extra;
} }
void void
_NSMT_extra_release(fn_generic_t extra, void *table) _NSMT_extra_release(void *extra, const void *table)
{ {
void *ptr = __void_p__(extra);
NSZone *zone = NSMT_ZONE(table); NSZone *zone = NSMT_ZONE(table);
if (ptr != NULL) if (extra != 0)
NSZoneFree(zone, ptr); NSZoneFree(zone, extra);
return; return;
} }
@ -293,14 +287,14 @@ _NSMT_extra_release(fn_generic_t extra, void *table)
/* The idea here is that these callbacks ensure that the /* The idea here is that these callbacks ensure that the
* NSMapTableCallbacks which are associated with a given NSMapTable * NSMapTableCallbacks which are associated with a given NSMapTable
* remain so throughout the life of the table and its copies. */ * remain so throughout the life of the table and its copies. */
fn_callbacks_t _NSMT_extra_callbacks = objects_callbacks_t _NSMT_extra_callbacks =
{ {
(fn_hash_func_t) fn_generic_hash, (objects_hash_func_t) objects_void_p_hash,
(fn_is_equal_func_t) fn_generic_is_equal, (objects_compare_func_t) objects_void_p_compare,
(fn_compare_func_t) fn_generic_compare, (objects_is_equal_func_t) objects_void_p_is_equal,
_NSMT_extra_retain, _NSMT_extra_retain,
_NSMT_extra_release, _NSMT_extra_release,
(fn_describe_func_t) fn_null_function, 0,
0 0
}; };
@ -315,33 +309,38 @@ NSCreateMapTableWithZone(NSMapTableKeyCallBacks keyCallBacks,
NSZone *zone) NSZone *zone)
{ {
NSMapTable *table; NSMapTable *table;
fn_callbacks_t key_callbacks, value_callbacks; objects_callbacks_t key_callbacks, value_callbacks;
fn_allocs_t alloc; objects_allocs_t allocs;
/* Transform the callbacks we were given. */ /* Transform the callbacks we were given. */
key_callbacks = _NSMT_callbacks_for_key_callbacks(keyCallBacks); key_callbacks = _NSMT_callbacks_for_key_callbacks(keyCallBacks);
value_callbacks = _NSMT_value_callbacks; value_callbacks = _NSMT_value_callbacks;
/* Get some useful allocs. */ /* Get some useful allocs. */
alloc = fn_allocs_for_zone(zone); allocs = objects_allocs_for_zone(zone);
/* Create a map table. */ /* Create a map table. */
table = fn_map_with_allocs_with_callbacks(allocs, key_callbacks, table = objects_map_with_allocs_with_callbacks(allocs, key_callbacks,
value_callbacks); value_callbacks);
/* Adjust the capacity of TABLE. */ /* Adjust the capacity of TABLE. */
fn_map_resize(table, capacity); objects_map_resize(table, capacity);
if (table != NULL) if (table != 0)
{ {
NSMapTableExtras *extras; _NSMT_extra_t extra;
/* Set aside space for the NSMapTableExtras. */ /* Set aside space for TABLE's extra. */
extras = _NSNewMapTableExtrasWithZone(zone); extra.keyCallBacks = keyCallBacks;
extras->keyCallBacks = keyCallBacks; extra.valueCallBacks = valueCallBacks;
extras->valueCallBacks = valueCallBacks;
table->extras = extras; /* These callbacks are defined above. */
objects_map_set_extra_callbacks(table, _NSMT_extra_callbacks);
/* We send a pointer because that's all the room we have.
* The callbacks make a copy of these extras, so we needn't
* worry about the way they disappear real soon now. */
objects_map_set_extra(table, &extra);
} }
return table; return table;
@ -352,21 +351,18 @@ NSCreateMapTable(NSMapTableKeyCallBacks keyCallBacks,
NSMapTableValueCallBacks valueCallBacks, NSMapTableValueCallBacks valueCallBacks,
unsigned int capacity) unsigned int capacity)
{ {
return NSCreateMapTableWithZone(keyCallBacks, return NSCreateMapTableWithZone(keyCallBacks, valueCallBacks,
valueCallBacks, capacity, 0);
capacity,
NULL);
} }
/* FIXME: CODE THIS! */
NSMapTable * NSMapTable *
NSCopyMapTableWithZone(NSMapTable *table, NSZone *zone) NSCopyMapTableWithZone(NSMapTable *table, NSZone *zone)
{ {
fn_allocs_t allocs; objects_allocs_t allocs;
NSMapTable *new_table; NSMapTable *new_table;
allocs = fn_allocs_for_zone(zone); allocs = objects_allocs_for_zone(zone);
new_table = fn_map_copy_with_allocs(table, alloc); new_table = objects_map_copy_with_allocs(table, allocs);
return new_table; return new_table;
} }
@ -376,14 +372,14 @@ NSCopyMapTableWithZone(NSMapTable *table, NSZone *zone)
void void
NSFreeMapTable(NSMapTable *table) NSFreeMapTable(NSMapTable *table)
{ {
fn_map_dealloc(table); objects_map_dealloc(table);
return; return;
} }
void void
NSResetMapTable(NSMapTable *table) NSResetMapTable(NSMapTable *table)
{ {
fn_map_empty(table); objects_map_empty(table);
return; return;
} }
@ -392,7 +388,7 @@ NSResetMapTable(NSMapTable *table)
BOOL BOOL
NSCompareMapTables(NSMapTable *table1, NSMapTable *table2) NSCompareMapTables(NSMapTable *table1, NSMapTable *table2)
{ {
return fn_map_is_equal_map(table1, table2) ? YES : NO; return objects_map_is_equal_to_map(table1, table2) ? YES : NO;
} }
/** Getting the number of items in an NSMapTable **/ /** Getting the number of items in an NSMapTable **/
@ -400,7 +396,7 @@ NSCompareMapTables(NSMapTable *table1, NSMapTable *table2)
unsigned int unsigned int
NSCountMapTable(NSMapTable *table) NSCountMapTable(NSMapTable *table)
{ {
return (unsigned int) fn_map_count(table); return (unsigned int) objects_map_count(table);
} }
/** Retrieving items from an NSMapTable **/ /** Retrieving items from an NSMapTable **/
@ -409,20 +405,10 @@ BOOL
NSMapMember(NSMapTable *table, const void *key, NSMapMember(NSMapTable *table, const void *key,
void **originalKey, void **value) void **originalKey, void **value)
{ {
fn_generic_t k, ok, v;
int i; int i;
/* Stuff KEY into K. */
__void_p__(k) = key;
/* Check for K in TABLE. */ /* Check for K in TABLE. */
i = fn_map_key_and_value(table, k, &ok, &v); i = objects_map_key_and_value_at_key (table, key, originalKey, value);
/* Put the `void *' facet of OK and V into ORIGINALKEY and VALUE. */
if (originalKey != NULL)
*originalKey = __void_p__(ok);
if (value != NULL)
*value = __void_p__(v);
/* Indicate our state of success. */ /* Indicate our state of success. */
return i ? YES : NO; return i ? YES : NO;
@ -431,28 +417,25 @@ NSMapMember(NSMapTable *table, const void *key,
void * void *
NSMapGet(NSMapTable *table, const void *key) NSMapGet(NSMapTable *table, const void *key)
{ {
return fn_map_value(table, key); return (void*) objects_map_value_at_key (table, key);
} }
NSMapEnumerator NSMapEnumerator
NSEnumerateMapTable(NSMapTable *table) NSEnumerateMapTable(NSMapTable *table)
{ {
return fn_map_enumerator(table); return objects_map_enumerator(table);
} }
BOOL BOOL
NSNextMapEnumeratorPair(NSMapEnumerator *enumerator, NSNextMapEnumeratorPair(NSMapEnumerator *enumerator,
void **key, void **value) void **key, void **value)
{ {
fn_generic_t k, v;
int i; int i;
/* Get the next pair. */ /* Get the next pair. */
i = fn_map_enumerator_next_key_and_value(enumerator, &k, &v); i = objects_map_enumerator_next_key_and_value (enumerator,
(const void**)key,
/* Put the `void *' facet of K and V into KEY and VALUE. */ (const void**)value);
*key = __void_p__(k);
*value = __void_p__(v);
/* Indicate our success or failure. */ /* Indicate our success or failure. */
return i ? YES : NO; return i ? YES : NO;
@ -461,50 +444,41 @@ NSNextMapEnumeratorPair(NSMapEnumerator *enumerator,
NSArray * NSArray *
NSAllMapTableKeys(NSMapTable *table) NSAllMapTableKeys(NSMapTable *table)
{ {
NSArray *array; NSMutableArray *keyArray;
fn_generic_t *keys; NSMapEnumerator enumerator;
id *objects; id key;
unsigned int count;
count = fn_map_count(table); /* Create our mutable key array. */
keys = fn_map_all_keys(table); keyArray = [NSMutableArray arrayWithCapacity: NSCountMapTable (table)];
objects = fn_calloc(fn_set_allocs(table), count + 1, sizeof(id));
for (i = 0; i < count; ++i) /* Get an enumerator for TABLE. */
objects[i] = __id__(keys[i]); enumerator = NSEnumerateMapTable (table);
objects[i] = nil; /* Step through TABLE... */
while (NSNextMapEnumeratorPair (&enumerator, (void**)&key, 0))
array = [[NSArray alloc] initWithObjects:objects count:count]; [keyArray addObject: key];
fn_free(fn_map_allocs(table), keys);
fn_free(fn_map_allocs(table), objects);
/* FIXME: Should ARRAY returned be `autorelease'd? */ /* FIXME: Should ARRAY returned be `autorelease'd? */
return [array autorelease]; return [keyArray autorelease];
} }
NSArray * NSArray *
NSAllMapTableValues(NSMapTable *table) NSAllMapTableValues(NSMapTable *table)
{ {
NSArray *array; NSMutableArray *array;
fn_generic_t *values; NSMapEnumerator enumerator;
id *objects; id valueArray;
unsigned int count; id value;
count = fn_map_count(table); /* Create our mutable value array. */
values = fn_map_all_values(table); valueArray = [NSMutableArray arrayWithCapacity:NSCountMapTable(table)];
objects = fn_calloc(fn_set_allocs(table), count + 1, sizeof(id));
for (i = 0; i < count; ++i) /* Get an enumerator for TABLE. */
objects[i] = __id__(values[i]); enumerator = NSEnumerateMapTable(table);
objects[i] = nil; /* Step through TABLE... */
while (NSNextMapEnumeratorPair (&enumerator, 0, (void**)&value))
array = [[NSArray alloc] initWithObjects:objects count:count]; [valueArray addObject:value];
fn_free(fn_map_allocs(table), keys);
fn_free(fn_map_allocs(table), objects);
/* FIXME: Should ARRAY returned be `autorelease'd? */ /* FIXME: Should ARRAY returned be `autorelease'd? */
return [array autorelease]; return [array autorelease];
@ -515,14 +489,8 @@ NSAllMapTableValues(NSMapTable *table)
void void
NSMapInsert(NSMapTable *table, const void *key, const void *value) NSMapInsert(NSMapTable *table, const void *key, const void *value)
{ {
fn_generic_t k, v; /* Put KEY -> VALUE into TABLE. */
objects_map_at_key_put_value (table, key, value);
/* Stuff KEY and VALUE into K and V. */
__void_p__(k) = key;
__void_p__(v) = value;
/* Put K -> V into TABLE. */
fn_map_at_key_put_value(table, k, v);
return; return;
} }
@ -530,30 +498,23 @@ NSMapInsert(NSMapTable *table, const void *key, const void *value)
void * void *
NSMapInsertIfAbsent(NSMapTable *table, const void *key, const void *value) NSMapInsertIfAbsent(NSMapTable *table, const void *key, const void *value)
{ {
fn_generic_t k, v, m; void *old_key;
/* Stuff KEY and VALUE into K and V. */ if (objects_map_contains_key (table, key))
__void_p__(k) = key; return (void*) objects_map_key (table, key);
__void_p__(v) = value; else
{
/* Put K -> V into TABLE. */ /* Put KEY -> VALUE into TABLE. */
m = fn_map_at_key_put_value_if_absent(table, k, v); objects_map_at_key_put_value_known_absent (table, key, value);
return NULL;
/* Return the `void *' facet of M. */ }
return __void_p__(m);
} }
void void
NSMapInsertKnownAbsent(NSMapTable *table, const void *key, const void *value) NSMapInsertKnownAbsent(NSMapTable *table, const void *key, const void *value)
{ {
fn_generic_t k, v;
/* Stuff KEY and VALUE into K and V. */
__void_p__(k) = key;
__void_p__(v) = value;
/* Is the key already in the table? */ /* Is the key already in the table? */
if (fn_map_contains_key(table, k)) if (objects_map_contains_key(table, key))
{ {
/* Ooh. Bad. The docs say to raise an exception! */ /* Ooh. Bad. The docs say to raise an exception! */
/* FIXME: I should make this much more informative. */ /* FIXME: I should make this much more informative. */
@ -563,7 +524,7 @@ NSMapInsertKnownAbsent(NSMapTable *table, const void *key, const void *value)
else else
{ {
/* Well, we know it's not there, so... */ /* Well, we know it's not there, so... */
fn_map_at_key_put_value_known_absent(table, k, v); objects_map_at_key_put_value_known_absent (table, key, value);
} }
/* Yah-hoo! */ /* Yah-hoo! */
@ -575,7 +536,7 @@ NSMapInsertKnownAbsent(NSMapTable *table, const void *key, const void *value)
void void
NSMapRemove(NSMapTable *table, const void *key) NSMapRemove(NSMapTable *table, const void *key)
{ {
fn_map_remove_key(table, key); objects_map_remove_key (table, key);
return; return;
} }
@ -584,14 +545,14 @@ NSMapRemove(NSMapTable *table, const void *key)
NSString * NSString *
NSStringFromMapTable(NSMapTable *table) NSStringFromMapTable(NSMapTable *table)
{ {
NSString *string; NSMutableString *string;
NSMapEnumerator enumerator; NSMapEnumerator enumerator;
NSMapTableKeyCallBacks keyCallBacks; NSMapTableKeyCallBacks keyCallBacks;
NSMapTableValueCallBacks valueCallBacks; NSMapTableValueCallBacks valueCallBacks;
void *key, *value; void *key, *value;
/* Get an empty mutable string. */ /* Get an empty mutable string. */
string = [NSMutableString string]; string = [NSMutableString stringWithCapacity:0];
/* Pull the NSMapTable...CallBacks out of the mess. */ /* Pull the NSMapTable...CallBacks out of the mess. */
keyCallBacks = NSMT_KEY_CALLBACKS(table); keyCallBacks = NSMT_KEY_CALLBACKS(table);

View file

@ -45,7 +45,7 @@ objects_callbacks_t objects_callbacks_for_char_p =
/**** Function Implementations ***********************************************/ /**** Function Implementations ***********************************************/
size_t size_t
objects_char_p_hash(void *cptr) objects_char_p_hash (const void *cptr)
{ {
register char *s = (char *) cptr; register char *s = (char *) cptr;
register size_t h = 0; register size_t h = 0;
@ -58,7 +58,7 @@ objects_char_p_hash(void *cptr)
} }
int int
objects_char_p_compare(void *cptr, void *dptr) objects_char_p_compare (const void *cptr, const void *dptr)
{ {
register char *s = (char *) cptr; register char *s = (char *) cptr;
register char *t = (char *) dptr; register char *t = (char *) dptr;
@ -86,7 +86,7 @@ objects_char_p_compare(void *cptr, void *dptr)
* internationalization here. CPTR and DPTR are taken to be C strings * internationalization here. CPTR and DPTR are taken to be C strings
* in the default (seven or) eight bit character encoding. */ * in the default (seven or) eight bit character encoding. */
int int
objects_char_p_is_equal(register void *cptr, register void *dptr) objects_char_p_is_equal (register const void *cptr, register const void *dptr)
{ {
register char *s = (char *) cptr; register char *s = (char *) cptr;
register char *t = (char *) dptr; register char *t = (char *) dptr;
@ -108,20 +108,20 @@ objects_char_p_is_equal(register void *cptr, register void *dptr)
} }
} }
void * const void *
objects_char_p_retain(void *cptr) objects_char_p_retain (const void *cptr)
{ {
return cptr; return cptr;
} }
void void
objects_char_p_release(void *cptr) objects_char_p_release (const void *cptr)
{ {
return; return;
} }
void * const void *
objects_char_p_describe(void *cptr) objects_char_p_describe (const void *cptr)
{ {
/* FIXME: Code this. But first, figure out what it should do, OK? */ /* FIXME: Code this. But first, figure out what it should do, OK? */
return 0; return 0;

View file

@ -53,41 +53,45 @@ objects_callbacks_t objects_callbacks_for_id =
* that there was already a built-in call to do this sort of thing. */ * that there was already a built-in call to do this sort of thing. */
size_t size_t
objects_id_hash(void *obj) objects_id_hash(const void *obj)
{ {
return (size_t)[(id)obj hash]; return (size_t)[(id)obj hash];
} }
int int
objects_id_compare(void *obj, void *jbo) objects_id_compare(const void *obj, const void *jbo)
{ {
return (int)[(id)obj compare:(id)jbo]; return (int)[(id)obj compare:(id)jbo];
} }
int int
objects_id_is_equal(void *obj, void *jbo) objects_id_is_equal(const void *obj, const void *jbo)
{ {
return (int)[(id)obj isEqual:(id)jbo]; return (int)[(id)obj isEqual:(id)jbo];
} }
void * const void *
objects_id_retain(void *obj) objects_id_retain(const void *obj)
{ {
return [(id)obj retain]; return [(id)obj retain];
} }
void void
objects_id_release(void *obj) objects_id_release(const void *obj)
{ {
[(id)obj release]; [(id)obj release];
return; return;
} }
void * const void *
objects_id_describe(void *obj) objects_id_describe (const void *obj)
{ {
/* FIXME: Harrumph. Make all of these describe functions live /* FIXME: Harrumph. Make all of these describe functions live
* in harmony. Please. */ * in harmony. Please. */
#if 0
return [(id)obj describe]; return [(id)obj describe];
#else
return 0;
#endif
} }

View file

@ -45,37 +45,37 @@ objects_callbacks_t objects_callbacks_for_int =
/**** Function Implementations ***********************************************/ /**** Function Implementations ***********************************************/
size_t size_t
objects_int_hash(void *i) objects_int_hash (const void *i)
{ {
return (size_t)((int)i); return (size_t)((int)i);
} }
int int
objects_int_compare(void *i, void *j) objects_int_compare (const void *i, const void *j)
{ {
return ((int)i) - ((int)j); return ((int)i) - ((int)j);
} }
int int
objects_int_is_equal(void *i, void *j) objects_int_is_equal (const void *i, const void *j)
{ {
return ((int)i) == ((int)j); return ((int)i) == ((int)j);
} }
void * const void *
objects_int_retain(void *i) objects_int_retain (const void *i)
{ {
return i; return i;
} }
void void
object_int_release(void *i) objects_int_release (const void *i)
{ {
return; return;
} }
void * const void *
objects_int_describe(void *i) objects_int_describe (const void *i)
{ {
/* FIXME: Code this. */ /* FIXME: Code this. */
return 0; return 0;

View file

@ -46,7 +46,7 @@ objects_callbacks_t objects_callbacks_for_int_p =
/**** Function Implementations ***********************************************/ /**** Function Implementations ***********************************************/
size_t size_t
objects_int_p_hash(void *iptr) objects_int_p_hash (const void *iptr)
{ {
return (size_t)(*((int *)iptr)); return (size_t)(*((int *)iptr));
} }
@ -54,31 +54,31 @@ objects_int_p_hash(void *iptr)
/* FIXME: Are these next two correct? These seem rather useless to me. */ /* FIXME: Are these next two correct? These seem rather useless to me. */
int int
objects_int_p_compare(void *iptr, void *jptr) objects_int_p_compare (const void *iptr, const void *jptr)
{ {
return *((int *)iptr) - *((int *)jptr); return *((int *)iptr) - *((int *)jptr);
} }
int int
objects_int_p_is_equal(void *iptr, void *jptr) objects_int_p_is_equal (const void *iptr, const void *jptr)
{ {
return *((int *)iptr) == *((int *)jptr); return *((int *)iptr) == *((int *)jptr);
} }
void * const void *
objects_int_p_retain(void *iptr) objects_int_p_retain (const void *iptr)
{ {
return iptr; return iptr;
} }
void void
objects_int_p_release(void *iptr) objects_int_p_release (const void *iptr)
{ {
return; return;
} }
void * const void *
objects_int_p_describe(void *iptr) objects_int_p_describe (const void *iptr)
{ {
/* FIXME: Code this. */ /* FIXME: Code this. */
return 0; return 0;

View file

@ -54,13 +54,13 @@ objects_callbacks_t objects_callbacks_for_owned_void_p =
/**** Function Implementations ***********************************************/ /**** Function Implementations ***********************************************/
size_t size_t
objects_void_p_hash(void *cptr) objects_void_p_hash (const void *cptr)
{ {
return ((size_t) cptr)/4; return ((size_t) cptr)/4;
} }
int int
objects_void_p_compare(void *cptr, void *dptr) objects_void_p_compare (const void *cptr, const void *dptr)
{ {
if (cptr == dptr) if (cptr == dptr)
return 0; return 0;
@ -71,25 +71,25 @@ objects_void_p_compare(void *cptr, void *dptr)
} }
int int
objects_void_p_is_equal(register void *cptr, register void *dptr) objects_void_p_is_equal (register const void *cptr, register const void *dptr)
{ {
return (cptr == dptr); return (cptr == dptr);
} }
void * const void *
objects_void_p_retain(void *cptr) objects_void_p_retain (const void *cptr)
{ {
return cptr; return cptr;
} }
void void
objects_void_p_release(void *cptr) objects_void_p_release (const void *cptr)
{ {
return; return;
} }
size_t size_t
objects_owned_void_p_hash(void *cptr) objects_owned_void_p_hash (const void *cptr)
{ {
/* We divide by 4 because many machines align /* We divide by 4 because many machines align
* memory on word boundaries. */ * memory on word boundaries. */
@ -97,7 +97,7 @@ objects_owned_void_p_hash(void *cptr)
} }
int int
objects_owned_void_p_compare(void *cptr, void *dptr) objects_owned_void_p_compare (const void *cptr, const void *dptr)
{ {
if (cptr == dptr) if (cptr == dptr)
return 0; return 0;
@ -108,22 +108,30 @@ objects_owned_void_p_compare(void *cptr, void *dptr)
} }
int int
objects_owned_void_p_is_equal(register void *cptr, register void *dptr) objects_owned_void_p_is_equal(register const void *cptr,
register const void *dptr)
{ {
return (cptr == dptr); return (cptr == dptr);
} }
void * const void *
objects_owned_void_p_retain(void *cptr) objects_owned_void_p_retain(const void *cptr)
{ {
return cptr; return cptr;
} }
void void
objects_owned_void_p_release(void *cptr) objects_owned_void_p_release (const void *cptr)
{ {
free(cptr); free ((void*)cptr);
return; return;
} }
const void *
objects_void_p_describe (const void *obj)
{
/* FIXME: Harrumph. Make all of these describe functions live
* in harmony. Please. */
return 0;
}

View file

@ -75,7 +75,8 @@ objects_callbacks_standardize(objects_callbacks_t callbacks)
/** Using callbacks **/ /** Using callbacks **/
size_t size_t
objects_hash (objects_callbacks_t callbacks, void *thing, void *user_data) objects_hash (objects_callbacks_t callbacks,
const void *thing, const void *user_data)
{ {
if (callbacks.hash != 0) if (callbacks.hash != 0)
return callbacks.hash(thing, user_data); return callbacks.hash(thing, user_data);
@ -85,9 +86,9 @@ objects_hash (objects_callbacks_t callbacks, void *thing, void *user_data)
int int
objects_compare (objects_callbacks_t callbacks, objects_compare (objects_callbacks_t callbacks,
void *thing1, const void *thing1,
void *thing2, const void *thing2,
void *user_data) const void *user_data)
{ {
if (callbacks.compare != 0) if (callbacks.compare != 0)
return callbacks.compare(thing1, thing2, user_data); return callbacks.compare(thing1, thing2, user_data);
@ -99,9 +100,9 @@ objects_compare (objects_callbacks_t callbacks,
int int
objects_is_equal (objects_callbacks_t callbacks, objects_is_equal (objects_callbacks_t callbacks,
void *thing1, const void *thing1,
void *thing2, const void *thing2,
void *user_data) const void *user_data)
{ {
if (callbacks.is_equal != 0) if (callbacks.is_equal != 0)
return callbacks.is_equal(thing1, thing2, user_data); return callbacks.is_equal(thing1, thing2, user_data);
@ -112,7 +113,8 @@ objects_is_equal (objects_callbacks_t callbacks,
} }
void * void *
objects_retain (objects_callbacks_t callbacks, void *thing, void *user_data) objects_retain (objects_callbacks_t callbacks,
const void *thing, const void *user_data)
{ {
if (callbacks.retain != 0) if (callbacks.retain != 0)
return callbacks.retain(thing, user_data); return callbacks.retain(thing, user_data);
@ -121,7 +123,8 @@ objects_retain (objects_callbacks_t callbacks, void *thing, void *user_data)
} }
void void
objects_release (objects_callbacks_t callbacks, void *thing, void *user_data) objects_release (objects_callbacks_t callbacks,
void *thing, const void *user_data)
{ {
if (callbacks.release != 0) if (callbacks.release != 0)
callbacks.release (thing, user_data); callbacks.release (thing, user_data);
@ -131,7 +134,8 @@ objects_release (objects_callbacks_t callbacks, void *thing, void *user_data)
} }
void * void *
objects_describe(objects_callbacks_t callbacks, void *thing, void *user_data) objects_describe(objects_callbacks_t callbacks,
const void *thing, const void *user_data)
{ {
if (callbacks.release != 0) if (callbacks.release != 0)
return callbacks.describe(thing, user_data); return callbacks.describe(thing, user_data);

View file

@ -38,10 +38,11 @@ objects_hash_bucket_t *
_objects_hash_pick_bucket_for_element (objects_hash_t *hash, _objects_hash_pick_bucket_for_element (objects_hash_t *hash,
objects_hash_bucket_t *buckets, objects_hash_bucket_t *buckets,
size_t bucket_count, size_t bucket_count,
void *element) const void *element)
{ {
return buckets + (objects_hash (objects_hash_element_callbacks (hash), return buckets + (objects_hash (objects_hash_element_callbacks (hash),
element, hash) % bucket_count); element, hash)
% bucket_count);
} }
objects_hash_bucket_t * objects_hash_bucket_t *
@ -51,11 +52,12 @@ _objects_hash_pick_bucket_for_node (objects_hash_t * hash,
objects_hash_node_t * node) objects_hash_node_t * node)
{ {
return buckets + (objects_hash (objects_hash_element_callbacks (hash), return buckets + (objects_hash (objects_hash_element_callbacks (hash),
node->element, hash) % bucket_count); node->element, hash)
% bucket_count);
} }
objects_hash_bucket_t * objects_hash_bucket_t *
_objects_hash_bucket_for_element (objects_hash_t * hash, void *element) _objects_hash_bucket_for_element (objects_hash_t * hash, const void *element)
{ {
return _objects_hash_pick_bucket_for_element (hash, hash->buckets, return _objects_hash_pick_bucket_for_element (hash, hash->buckets,
hash->bucket_count, element); hash->bucket_count, element);
@ -242,7 +244,7 @@ _objects_hash_remangle_buckets (objects_hash_t * hash,
} }
objects_hash_node_t * objects_hash_node_t *
_objects_hash_new_node (objects_hash_t * hash, void *element) _objects_hash_new_node (objects_hash_t * hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -281,7 +283,9 @@ _objects_hash_free_node (objects_hash_node_t * node)
hash = node->hash; hash = node->hash;
/* Release ELEMENT. (It's retained in `_objects_hash_new_node()'.) */ /* Release ELEMENT. (It's retained in `_objects_hash_new_node()'.) */
objects_release (objects_hash_element_callbacks (hash), node->element, hash); objects_release (objects_hash_element_callbacks (hash),
(void*)node->element,
hash);
/* Actually free the space hash aside for NODE. */ /* Actually free the space hash aside for NODE. */
objects_free (objects_hash_allocs (hash), node); objects_free (objects_hash_allocs (hash), node);
@ -292,7 +296,7 @@ _objects_hash_free_node (objects_hash_node_t * node)
} }
objects_hash_node_t * objects_hash_node_t *
_objects_hash_node_for_element (objects_hash_t * hash, void *element) _objects_hash_node_for_element (objects_hash_t * hash, const void *element)
{ {
objects_hash_bucket_t *bucket; objects_hash_bucket_t *bucket;
objects_hash_node_t *node; objects_hash_node_t *node;
@ -414,7 +418,7 @@ objects_hash_check (objects_hash_t * hash)
/** Searching **/ /** Searching **/
int int
objects_hash_contains_element (objects_hash_t * hash, void *element) objects_hash_contains_element (objects_hash_t *hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -423,8 +427,8 @@ objects_hash_contains_element (objects_hash_t * hash, void *element)
return node != NULL; return node != NULL;
} }
void * const void *
objects_hash_element (objects_hash_t * hash, void *element) objects_hash_element (objects_hash_t *hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -437,17 +441,17 @@ objects_hash_element (objects_hash_t * hash, void *element)
return objects_hash_not_an_element_marker (hash); return objects_hash_not_an_element_marker (hash);
} }
void ** const void **
objects_hash_all_elements (objects_hash_t *hash) objects_hash_all_elements (objects_hash_t *hash)
{ {
size_t j; size_t j;
void **array; const void **array;
objects_hash_enumerator_t enumerator; objects_hash_enumerator_t enumerator;
/* Allocate space for ARRAY. Remember that it is the programmer's /* Allocate space for ARRAY. Remember that it is the programmer's
* responsibility to free this by calling * responsibility to free this by calling
* `objects_free(objects_hash_allocs(HASH), ARRAY)' */ * `objects_free(objects_hash_allocs(HASH), ARRAY)' */
array = (void **) objects_calloc (objects_hash_allocs (hash), array = (const void **) objects_calloc (objects_hash_allocs (hash),
hash->node_count + 1, hash->node_count + 1,
sizeof (void *)); sizeof (void *));
@ -538,7 +542,7 @@ objects_hash_enumerator (objects_hash_t * hash)
int int
objects_hash_enumerator_next_element (objects_hash_enumerator_t * enumerator, objects_hash_enumerator_next_element (objects_hash_enumerator_t * enumerator,
void **element) const void **element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -573,8 +577,9 @@ objects_hash_enumerator_next_element (objects_hash_enumerator_t * enumerator,
/** Adding **/ /** Adding **/
void * const void *
objects_hash_add_element_known_absent (objects_hash_t * hash, void *element) objects_hash_add_element_known_absent (objects_hash_t *hash,
const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -593,8 +598,8 @@ objects_hash_add_element_known_absent (objects_hash_t * hash, void *element)
} }
} }
void * const void *
objects_hash_add_element (objects_hash_t * hash, void *element) objects_hash_add_element (objects_hash_t * hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -609,13 +614,15 @@ objects_hash_add_element (objects_hash_t * hash, void *element)
else else
{ {
objects_retain (objects_hash_element_callbacks (hash), element, hash); objects_retain (objects_hash_element_callbacks (hash), element, hash);
objects_release (objects_hash_element_callbacks (hash), node->element, hash); objects_release (objects_hash_element_callbacks (hash),
(void*)node->element,
hash);
return node->element = element; return node->element = element;
} }
} }
void * const void *
objects_hash_add_element_if_absent (objects_hash_t * hash, void *element) objects_hash_add_element_if_absent (objects_hash_t* hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -634,7 +641,7 @@ objects_hash_add_element_if_absent (objects_hash_t * hash, void *element)
/** Removing **/ /** Removing **/
void void
objects_hash_remove_element (objects_hash_t * hash, void *element) objects_hash_remove_element (objects_hash_t *hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -789,7 +796,7 @@ objects_hash_init_from_hash (objects_hash_t * hash, objects_hash_t * old_hash)
if (hash != NULL) if (hash != NULL)
{ {
objects_hash_enumerator_t enumerator; objects_hash_enumerator_t enumerator;
void *element; const void *element;
/* Make a note of the callbacks for HASH. */ /* Make a note of the callbacks for HASH. */
hash->callbacks = objects_hash_element_callbacks (hash); hash->callbacks = objects_hash_element_callbacks (hash);
@ -838,7 +845,7 @@ objects_hash_dealloc (objects_hash_t * hash)
/** Replacing **/ /** Replacing **/
void void
objects_hash_replace_element (objects_hash_t * hash, void *element) objects_hash_replace_element (objects_hash_t *hash, const void *element)
{ {
objects_hash_node_t *node; objects_hash_node_t *node;
@ -850,7 +857,9 @@ objects_hash_replace_element (objects_hash_t * hash, void *element)
/* Remember: First retain the new element, then release the old /* Remember: First retain the new element, then release the old
* element, just in case they're the same. */ * element, just in case they're the same. */
objects_retain (objects_hash_element_callbacks (hash), element, hash); objects_retain (objects_hash_element_callbacks (hash), element, hash);
objects_release (objects_hash_element_callbacks (hash), node->element, hash); objects_release (objects_hash_element_callbacks (hash),
(void*)node->element,
hash);
node->element = element; node->element = element;
} }
@ -864,7 +873,7 @@ int
objects_hash_contains_hash (objects_hash_t * hash1, objects_hash_t * hash2) objects_hash_contains_hash (objects_hash_t * hash1, objects_hash_t * hash2)
{ {
objects_hash_enumerator_t enumerator; objects_hash_enumerator_t enumerator;
void *element; const void *element;
enumerator = objects_hash_enumerator (hash2); enumerator = objects_hash_enumerator (hash2);
@ -906,7 +915,7 @@ int
objects_hash_intersects_hash (objects_hash_t * hash, objects_hash_t * other_hash) objects_hash_intersects_hash (objects_hash_t * hash, objects_hash_t * other_hash)
{ {
objects_hash_enumerator_t enumerator; objects_hash_enumerator_t enumerator;
void *element; const void *element;
/* Get an element enumerator for OTHER_HASH. */ /* Get an element enumerator for OTHER_HASH. */
enumerator = objects_hash_enumerator (other_hash); enumerator = objects_hash_enumerator (other_hash);
@ -956,8 +965,8 @@ objects_hash_copy (objects_hash_t * old_hash)
* the second. */ * the second. */
objects_hash_t * objects_hash_t *
objects_hash_map_elements (objects_hash_t * hash, objects_hash_map_elements (objects_hash_t * hash,
void *(*fcn) (void *, void *), const void *(*fcn) (const void *, const void *),
void *user_data) const void *user_data)
{ {
objects_hash_enumerator_t enumerator; objects_hash_enumerator_t enumerator;
objects_hash_node_t *node; objects_hash_node_t *node;
@ -966,14 +975,16 @@ objects_hash_map_elements (objects_hash_t * hash,
while ((node = _objects_hash_enumerator_next_node (&enumerator)) != NULL) while ((node = _objects_hash_enumerator_next_node (&enumerator)) != NULL)
{ {
void *element; const void *element;
element = (*fcn) (node->element, user_data); element = (*fcn) (node->element, user_data);
/* Remember: First retain the new element, then release the old /* Remember: First retain the new element, then release the old
* element. */ * element. */
objects_retain (objects_hash_element_callbacks (hash), element, hash); objects_retain (objects_hash_element_callbacks (hash), element, hash);
objects_release (objects_hash_element_callbacks (hash), node->element, hash); objects_release (objects_hash_element_callbacks (hash),
(void*)node->element,
hash);
node->element = element; node->element = element;
} }
@ -1025,7 +1036,7 @@ objects_hash_t *
objects_hash_union_hash (objects_hash_t * hash, objects_hash_t * other_hash) objects_hash_union_hash (objects_hash_t * hash, objects_hash_t * other_hash)
{ {
objects_hash_enumerator_t enumerator; objects_hash_enumerator_t enumerator;
void *element; const void *element;
enumerator = objects_hash_enumerator (other_hash); enumerator = objects_hash_enumerator (other_hash);

View file

@ -54,7 +54,7 @@ _objects_list_remove_node_from_its_list (objects_list_node_t * node)
} }
objects_list_node_t * objects_list_node_t *
_objects_list_new_node (objects_list_t * list, void *element) _objects_list_new_node (objects_list_t * list, const void *element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -75,7 +75,9 @@ _objects_list_new_node (objects_list_t * list, void *element)
void void
_objects_list_free_node (objects_list_t * list, objects_list_node_t * node) _objects_list_free_node (objects_list_t * list, objects_list_node_t * node)
{ {
objects_release (objects_list_element_callbacks (node->list), node->element, node->list); objects_release (objects_list_element_callbacks (node->list),
(void*)node->element,
node->list);
objects_free (objects_list_allocs (list), node); objects_free (objects_list_allocs (list), node);
return; return;
} }
@ -114,7 +116,7 @@ _objects_list_nth_node (objects_list_t * list, long int n)
inline objects_list_node_t * inline objects_list_node_t *
_objects_list_nth_node_for_element (objects_list_t * list, _objects_list_nth_node_for_element (objects_list_t * list,
long int n, long int n,
void *element) const void *element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -191,10 +193,10 @@ objects_list_check (objects_list_t * list)
} }
int int
objects_list_contains_element (objects_list_t * list, void *element) objects_list_contains_element (objects_list_t * list, const void *element)
{ {
objects_list_enumerator_t enumerator; objects_list_enumerator_t enumerator;
void *member; const void *member;
objects_list_enumerator (list); objects_list_enumerator (list);
@ -258,7 +260,7 @@ objects_list_reverse_enumerator (objects_list_t * list)
int int
objects_list_enumerator_next_element (objects_list_enumerator_t * enumerator, objects_list_enumerator_next_element (objects_list_enumerator_t * enumerator,
void **element) const void **element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -288,8 +290,8 @@ objects_list_enumerator_next_element (objects_list_enumerator_t * enumerator,
/** Searching **/ /** Searching **/
void * const void *
objects_list_element (objects_list_t * list, void *element) objects_list_element (objects_list_t * list, const void *element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -301,7 +303,7 @@ objects_list_element (objects_list_t * list, void *element)
return objects_list_not_an_element_marker (list); return objects_list_not_an_element_marker (list);
} }
void * const void *
objects_list_nth_element (objects_list_t * list, long int n) objects_list_nth_element (objects_list_t * list, long int n)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -314,7 +316,7 @@ objects_list_nth_element (objects_list_t * list, long int n)
return objects_list_not_an_element_marker (list); return objects_list_not_an_element_marker (list);
} }
void * const void *
objects_list_first_element (objects_list_t * list) objects_list_first_element (objects_list_t * list)
{ {
if (list->first_node != NULL) if (list->first_node != NULL)
@ -323,7 +325,7 @@ objects_list_first_element (objects_list_t * list)
return objects_list_not_an_element_marker (list); return objects_list_not_an_element_marker (list);
} }
void * const void *
objects_list_last_element (objects_list_t * list) objects_list_last_element (objects_list_t * list)
{ {
if (list->last_node != NULL) if (list->last_node != NULL)
@ -334,16 +336,16 @@ objects_list_last_element (objects_list_t * list)
/** Obtaining elements **/ /** Obtaining elements **/
void ** const void **
objects_list_all_elements (objects_list_t * list) objects_list_all_elements (objects_list_t * list)
{ {
objects_list_enumerator_t enumerator; objects_list_enumerator_t enumerator;
void **array; const void **array;
size_t i; size_t i;
array = objects_calloc (objects_list_allocs (list), array = objects_calloc (objects_list_allocs (list),
objects_list_count (list) + 1, objects_list_count (list) + 1,
sizeof (void *)); sizeof (const void *));
for (i = 0; objects_list_enumerator_next_element (&enumerator, array + i); ++i); for (i = 0; objects_list_enumerator_next_element (&enumerator, array + i); ++i);
@ -352,34 +354,34 @@ objects_list_all_elements (objects_list_t * list)
/** Adding elements **/ /** Adding elements **/
void * const void *
objects_list_append_element (objects_list_t * list, void *element) objects_list_append_element (objects_list_t * list, const void *element)
{ {
return objects_list_at_index_insert_element (list, -1, element); return objects_list_at_index_insert_element (list, -1, element);
} }
void * const void *
objects_list_append_element_if_absent (objects_list_t * list, void *element) objects_list_append_element_if_absent (objects_list_t * list, const void *element)
{ {
return objects_list_at_index_insert_element_if_absent (list, -1, element); return objects_list_at_index_insert_element_if_absent (list, -1, element);
} }
void * const void *
objects_list_prepend_element (objects_list_t * list, void *element) objects_list_prepend_element (objects_list_t * list, const void *element)
{ {
return objects_list_at_index_insert_element (list, 0, element); return objects_list_at_index_insert_element (list, 0, element);
} }
void * const void *
objects_list_prepend_element_if_absent (objects_list_t * list, void *element) objects_list_prepend_element_if_absent (objects_list_t * list, const void *element)
{ {
return objects_list_at_index_insert_element_if_absent (list, 0, element); return objects_list_at_index_insert_element_if_absent (list, 0, element);
} }
void * const void *
objects_list_at_index_insert_element (objects_list_t * list, objects_list_at_index_insert_element (objects_list_t * list,
long int n, long int n,
void *element) const void *element)
{ {
objects_list_node_t *anode, *bnode, *new_node, *node; objects_list_node_t *anode, *bnode, *new_node, *node;
@ -438,10 +440,10 @@ objects_list_at_index_insert_element (objects_list_t * list,
return new_node->element; return new_node->element;
} }
void * const void *
objects_list_at_index_insert_element_if_absent (objects_list_t * list, objects_list_at_index_insert_element_if_absent (objects_list_t * list,
long int n, long int n,
void *element) const void *element)
{ {
if (!objects_list_contains_element (list, element)) if (!objects_list_contains_element (list, element))
return objects_list_at_index_insert_element (list, n, element); return objects_list_at_index_insert_element (list, n, element);
@ -454,7 +456,7 @@ objects_list_at_index_insert_element_if_absent (objects_list_t * list,
void void
objects_list_remove_nth_occurrance_of_element (objects_list_t * list, objects_list_remove_nth_occurrance_of_element (objects_list_t * list,
long int n, long int n,
void *element) const void *element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -470,7 +472,7 @@ objects_list_remove_nth_occurrance_of_element (objects_list_t * list,
} }
void void
objects_list_remove_element (objects_list_t * list, void *element) objects_list_remove_element (objects_list_t * list, const void *element)
{ {
objects_list_remove_nth_occurrance_of_element (list, 0, element); objects_list_remove_nth_occurrance_of_element (list, 0, element);
return; return;
@ -530,8 +532,8 @@ objects_list_empty (objects_list_t * list)
void void
objects_list_replace_nth_occurrance_of_element (objects_list_t * list, objects_list_replace_nth_occurrance_of_element (objects_list_t * list,
long int n, long int n,
void *old_element, const void *old_element,
void *new_element) const void *new_element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -540,7 +542,9 @@ objects_list_replace_nth_occurrance_of_element (objects_list_t * list,
if (node != NULL) if (node != NULL)
{ {
objects_retain (objects_list_element_callbacks (list), new_element, list); objects_retain (objects_list_element_callbacks (list), new_element, list);
objects_release (objects_list_element_callbacks (list), node->element, list); objects_release (objects_list_element_callbacks (list),
(void*)node->element,
list);
node->element = new_element; node->element = new_element;
} }
@ -549,8 +553,8 @@ objects_list_replace_nth_occurrance_of_element (objects_list_t * list,
void void
objects_list_replace_element (objects_list_t * list, objects_list_replace_element (objects_list_t * list,
void *old_element, const void *old_element,
void *new_element) const void *new_element)
{ {
objects_list_replace_nth_occurrance_of_element (list, 0, old_element, new_element); objects_list_replace_nth_occurrance_of_element (list, 0, old_element, new_element);
return; return;
@ -559,7 +563,7 @@ objects_list_replace_element (objects_list_t * list,
void void
objects_list_replace_nth_element (objects_list_t * list, objects_list_replace_nth_element (objects_list_t * list,
long int n, long int n,
void *new_element) const void *new_element)
{ {
objects_list_node_t *node; objects_list_node_t *node;
@ -568,7 +572,9 @@ objects_list_replace_nth_element (objects_list_t * list,
if (node != NULL) if (node != NULL)
{ {
objects_retain (objects_list_element_callbacks (list), new_element, list); objects_retain (objects_list_element_callbacks (list), new_element, list);
objects_release (objects_list_element_callbacks (list), node->element, list); objects_release (objects_list_element_callbacks (list),
(void*)node->element,
list);
node->element = new_element; node->element = new_element;
} }
@ -577,7 +583,7 @@ objects_list_replace_nth_element (objects_list_t * list,
void void
objects_list_replace_first_element (objects_list_t * list, objects_list_replace_first_element (objects_list_t * list,
void *new_element) const void *new_element)
{ {
objects_list_replace_nth_element (list, 0, new_element); objects_list_replace_nth_element (list, 0, new_element);
return; return;
@ -585,7 +591,7 @@ objects_list_replace_first_element (objects_list_t * list,
void void
objects_list_replace_last_element (objects_list_t * list, objects_list_replace_last_element (objects_list_t * list,
void *new_element) const void *new_element)
{ {
objects_list_replace_nth_element (list, -1, new_element); objects_list_replace_nth_element (list, -1, new_element);
return; return;
@ -692,7 +698,7 @@ objects_list_t *
objects_list_init_from_list (objects_list_t * list, objects_list_t * old_list) objects_list_init_from_list (objects_list_t * list, objects_list_t * old_list)
{ {
objects_list_enumerator_t enumerator; objects_list_enumerator_t enumerator;
void *element; const void *element;
if (list != NULL) if (list != NULL)
{ {
@ -762,7 +768,7 @@ objects_list_at_index_insert_list (objects_list_t * base_list,
objects_list_t * infix_list) objects_list_t * infix_list)
{ {
objects_list_enumerator_t enumerator; objects_list_enumerator_t enumerator;
void *element; const void *element;
if (n < 0) if (n < 0)
enumerator = objects_list_forward_enumerator (infix_list); enumerator = objects_list_forward_enumerator (infix_list);
@ -801,8 +807,8 @@ objects_list_copy_with_allocs (objects_list_t * old_list, objects_allocs_t alloc
objects_list_t * objects_list_t *
objects_list_map_elements (objects_list_t * list, objects_list_map_elements (objects_list_t * list,
void *(*fcn) (void *, void *), const void *(*fcn) (const void *, const void *),
void *user_data) const void *user_data)
{ {
objects_list_enumerator_t enumerator; objects_list_enumerator_t enumerator;
objects_list_node_t *node; objects_list_node_t *node;
@ -811,14 +817,14 @@ objects_list_map_elements (objects_list_t * list,
while ((node = _objects_list_enumerator_next_node (&enumerator)) != NULL) while ((node = _objects_list_enumerator_next_node (&enumerator)) != NULL)
{ {
void *element; const void *element;
element = (*fcn) (node->element, user_data); element = (*fcn) (node->element, user_data);
/* NOTE: I'm accessing the callbacks directly for a little /* NOTE: I'm accessing the callbacks directly for a little
* efficiency. */ * efficiency. */
objects_retain (list->callbacks, element, list); objects_retain (list->callbacks, element, list);
objects_release (list->callbacks, node->element, list); objects_release (list->callbacks, (void*)node->element, list);
node->element = element; node->element = element;
} }
@ -834,7 +840,7 @@ objects_hash_init_from_list (objects_hash_t * hash, objects_list_t * list)
if (hash != NULL) if (hash != NULL)
{ {
objects_list_enumerator_t enumerator; objects_list_enumerator_t enumerator;
void *element; const void *element;
/* Make a note of the callbacks for HASH. */ /* Make a note of the callbacks for HASH. */
hash->callbacks = objects_list_element_callbacks (list); hash->callbacks = objects_list_element_callbacks (list);
@ -872,7 +878,7 @@ objects_hash_init_from_list (objects_hash_t * hash, objects_list_t * list)
// if (chash != NULL) // if (chash != NULL)
// { // {
// objects_list_enumerator_t enumerator; // objects_list_enumerator_t enumerator;
// void *element; // const void *element;
// //
// /* Make a note of the callbacks for CHASH. */ // /* Make a note of the callbacks for CHASH. */
// chash->callbacks = objects_list_element_callbacks (list); // chash->callbacks = objects_list_element_callbacks (list);

View file

@ -39,10 +39,11 @@ objects_map_bucket_t *
_objects_map_pick_bucket_for_key (objects_map_t *map, _objects_map_pick_bucket_for_key (objects_map_t *map,
objects_map_bucket_t *buckets, objects_map_bucket_t *buckets,
size_t bucket_count, size_t bucket_count,
void *key) const void *key)
{ {
return buckets + (objects_hash (objects_map_key_callbacks (map), return buckets + (objects_hash (objects_map_key_callbacks (map),
key, map) % bucket_count); key, map)
% bucket_count);
} }
objects_map_bucket_t * objects_map_bucket_t *
@ -52,11 +53,12 @@ _objects_map_pick_bucket_for_node (objects_map_t * map,
objects_map_node_t * node) objects_map_node_t * node)
{ {
return buckets + (objects_hash (objects_map_key_callbacks (map), return buckets + (objects_hash (objects_map_key_callbacks (map),
node->key, map) % bucket_count); node->key, map)
% bucket_count);
} }
objects_map_bucket_t * objects_map_bucket_t *
_objects_map_bucket_for_key (objects_map_t * map, void *key) _objects_map_bucket_for_key (objects_map_t * map, const void *key)
{ {
return _objects_map_pick_bucket_for_key (map, map->buckets, return _objects_map_pick_bucket_for_key (map, map->buckets,
map->bucket_count, key); map->bucket_count, key);
@ -100,7 +102,8 @@ _objects_map_unlink_node_from_its_bucket (objects_map_node_t * node)
} }
void void
_objects_map_link_node_into_map (objects_map_t * map, objects_map_node_t * node) _objects_map_link_node_into_map (objects_map_t * map,
objects_map_node_t * node)
{ {
if (map->first_node != NULL) if (map->first_node != NULL)
map->first_node->prev_in_map = node; map->first_node->prev_in_map = node;
@ -129,7 +132,8 @@ _objects_map_unlink_node_from_its_map (objects_map_node_t * node)
} }
void void
_objects_map_add_node_to_bucket (objects_map_bucket_t * bucket, objects_map_node_t * node) _objects_map_add_node_to_bucket (objects_map_bucket_t * bucket,
objects_map_node_t * node)
{ {
if (bucket != NULL) if (bucket != NULL)
{ {
@ -145,9 +149,11 @@ _objects_map_add_node_to_bucket (objects_map_bucket_t * bucket, objects_map_node
} }
void void
_objects_map_add_node_to_its_bucket (objects_map_t * map, objects_map_node_t * node) _objects_map_add_node_to_its_bucket (objects_map_t * map,
objects_map_node_t * node)
{ {
_objects_map_add_node_to_bucket (_objects_map_bucket_for_node (map, node), node); _objects_map_add_node_to_bucket (_objects_map_bucket_for_node (map, node),
node);
return; return;
} }
@ -243,7 +249,7 @@ _objects_map_remangle_buckets (objects_map_t * map,
} }
objects_map_node_t * objects_map_node_t *
_objects_map_new_node (objects_map_t * map, void *key, void *value) _objects_map_new_node (objects_map_t * map, const void *key, const void *value)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -286,8 +292,10 @@ _objects_map_free_node (objects_map_node_t * node)
/* Release KEY and VALUE. (They're retained above in /* Release KEY and VALUE. (They're retained above in
* `_objects_map_new_node()'.) */ * `_objects_map_new_node()'.) */
objects_release (objects_map_key_callbacks (map), node->key, map); objects_release (objects_map_key_callbacks (map),
objects_release (objects_map_value_callbacks (map), node->value, map); (void*)node->key, map);
objects_release (objects_map_value_callbacks (map),
(void*)node->value, map);
/* Actually free the space map aside for NODE. */ /* Actually free the space map aside for NODE. */
objects_free (objects_map_allocs (map), node); objects_free (objects_map_allocs (map), node);
@ -298,7 +306,7 @@ _objects_map_free_node (objects_map_node_t * node)
} }
objects_map_node_t * objects_map_node_t *
_objects_map_node_for_key (objects_map_t * map, void *key) _objects_map_node_for_key (objects_map_t * map, const void *key)
{ {
objects_map_bucket_t *bucket; objects_map_bucket_t *bucket;
objects_map_node_t *node; objects_map_node_t *node;
@ -413,7 +421,7 @@ objects_map_is_empty (objects_map_t * map)
* in DICT. */ * in DICT. */
int int
objects_map_contains_key (objects_map_t * map, void *key) objects_map_contains_key (objects_map_t * map, const void *key)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -426,16 +434,16 @@ objects_map_contains_key (objects_map_t * map, void *key)
} }
int int
objects_map_contains_value (objects_map_t * map, void *value) objects_map_contains_value (objects_map_t * map, const void *value)
{ {
return 0; return 0;
} }
int int
objects_map_key_and_value_at_key (objects_map_t * map, objects_map_key_and_value_at_key (objects_map_t * map,
void **old_key, const void **old_key,
void **value, const void **value,
void *key) const void *key)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -460,37 +468,37 @@ objects_map_key_and_value_at_key (objects_map_t * map,
} }
} }
void * const void *
objects_map_key (objects_map_t * map, void *key) objects_map_key (objects_map_t * map, const void *key)
{ {
void *old_key; const void *old_key;
objects_map_key_and_value_at_key (map, &old_key, NULL, key); objects_map_key_and_value_at_key (map, &old_key, NULL, key);
return old_key; return old_key;
} }
void * const void *
objects_map_value_at_key (objects_map_t * map, void *key) objects_map_value_at_key (objects_map_t * map, const void *key)
{ {
void *value; const void *value;
objects_map_key_and_value_at_key (map, NULL, &value, key); objects_map_key_and_value_at_key (map, NULL, &value, key);
return value; return value;
} }
void ** const void **
objects_map_all_keys_and_values (objects_map_t * map) objects_map_all_keys_and_values (objects_map_t * map)
{ {
size_t j; size_t j;
void **array; const void **array;
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
/* Allocate space for ARRAY. Remember that it is the programmer's /* Allocate space for ARRAY. Remember that it is the programmer's
* responsibility to free this by calling * responsibility to free this by calling
* `objects_free(objects_map_allocs(DICT), ARRAY)' */ * `objects_free(objects_map_allocs(DICT), ARRAY)' */
array = (void **) objects_calloc (objects_map_allocs (map), array = (const void **) objects_calloc (objects_map_allocs (map),
2 * (map->node_count + 1), 2 * (map->node_count + 1),
sizeof (void *)); sizeof (void *));
@ -510,17 +518,17 @@ objects_map_all_keys_and_values (objects_map_t * map)
return array; return array;
} }
void ** const void **
objects_map_all_keys (objects_map_t * map) objects_map_all_keys (objects_map_t * map)
{ {
size_t j; size_t j;
void **array; const void **array;
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
/* Allocate space for ARRAY. Remember that it is the programmer's /* Allocate space for ARRAY. Remember that it is the programmer's
* responsibility to free this by calling * responsibility to free this by calling
* `objects_free(objects_map_allocs(DICT), ARRAY)' */ * `objects_free(objects_map_allocs(DICT), ARRAY)' */
array = (void **) objects_calloc (objects_map_allocs (map), array = (const void **) objects_calloc (objects_map_allocs (map),
map->node_count + 1, map->node_count + 1,
sizeof (void *)); sizeof (void *));
@ -536,17 +544,17 @@ objects_map_all_keys (objects_map_t * map)
return array; return array;
} }
void ** const void **
objects_map_all_values (objects_map_t * map) objects_map_all_values (objects_map_t * map)
{ {
size_t j; size_t j;
void **array; const void **array;
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
/* Allocate space for ARRAY. Remember that it is the programmer's /* Allocate space for ARRAY. Remember that it is the programmer's
* responsibility to free this by calling * responsibility to free this by calling
* `objects_free(objects_map_allocs(DICT), ARRAY)' */ * `objects_free(objects_map_allocs(DICT), ARRAY)' */
array = (void **) objects_calloc (objects_map_allocs (map), array = (const void **) objects_calloc (objects_map_allocs (map),
map->node_count + 1, map->node_count + 1,
sizeof (void *)); sizeof (void *));
@ -644,8 +652,8 @@ _objects_map_enumerator_next_node (objects_map_enumerator_t * enumerator)
int int
objects_map_enumerator_next_key_and_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key_and_value (objects_map_enumerator_t * enumerator,
void **key, const void **key,
void **value) const void **value)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -679,24 +687,24 @@ objects_map_enumerator_next_key_and_value (objects_map_enumerator_t * enumerator
int int
objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator,
void **key) const void **key)
{ {
return objects_map_enumerator_next_key_and_value (enumerator, key, NULL); return objects_map_enumerator_next_key_and_value (enumerator, key, NULL);
} }
int int
objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator,
void **value) const void **value)
{ {
return objects_map_enumerator_next_key_and_value (enumerator, NULL, value); return objects_map_enumerator_next_key_and_value (enumerator, NULL, value);
} }
/** Adding **/ /** Adding **/
void * const void *
objects_map_at_key_put_value_known_absent (objects_map_t * map, objects_map_at_key_put_value_known_absent (objects_map_t * map,
void *key, const void *key,
void *value) const void *value)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -723,10 +731,10 @@ objects_map_at_key_put_value_known_absent (objects_map_t * map,
} }
} }
void * const void *
objects_map_at_key_put_value (objects_map_t * map, objects_map_at_key_put_value (objects_map_t * map,
void *key, const void *key,
void *value) const void *value)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -736,7 +744,8 @@ objects_map_at_key_put_value (objects_map_t * map,
if (node != NULL) if (node != NULL)
{ {
objects_retain (objects_map_value_callbacks (map), value, map); objects_retain (objects_map_value_callbacks (map), value, map);
objects_release (objects_map_value_callbacks (map), node->value, map); objects_release (objects_map_value_callbacks (map),
(void*)node->value, map);
node->value = value; node->value = value;
return node->key; return node->key;
} }
@ -747,10 +756,10 @@ objects_map_at_key_put_value (objects_map_t * map,
} }
} }
void * const void *
objects_map_at_key_put_value_if_absent (objects_map_t * map, objects_map_at_key_put_value_if_absent (objects_map_t * map,
void *key, const void *key,
void *value) const void *value)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -774,7 +783,7 @@ objects_map_at_key_put_value_if_absent (objects_map_t * map,
/** Removing **/ /** Removing **/
void void
objects_map_remove_key (objects_map_t * map, void *key) objects_map_remove_key (objects_map_t * map, const void *key)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -992,8 +1001,8 @@ objects_map_t *
objects_map_init_from_map (objects_map_t * map, objects_map_t * old_map) objects_map_init_from_map (objects_map_t * map, objects_map_t * old_map)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
void *key; const void *key;
void *value; const void *value;
/* Initialize MAP. */ /* Initialize MAP. */
objects_map_init_with_callbacks (map, objects_map_init_with_callbacks (map,
@ -1038,7 +1047,7 @@ objects_map_dealloc (objects_map_t * map)
void void
objects_map_replace_key (objects_map_t * map, objects_map_replace_key (objects_map_t * map,
void *key) const void *key)
{ {
objects_map_node_t *node; objects_map_node_t *node;
@ -1047,7 +1056,8 @@ objects_map_replace_key (objects_map_t * map,
if (node != NULL) if (node != NULL)
{ {
objects_retain (objects_map_key_callbacks (map), key, map); objects_retain (objects_map_key_callbacks (map), key, map);
objects_release (objects_map_key_callbacks (map), node->key, map); objects_release (objects_map_key_callbacks (map),
(void*)node->key, map);
node->key = key; node->key = key;
} }
@ -1060,7 +1070,7 @@ int
objects_map_contains_map (objects_map_t * map1, objects_map_t * map2) objects_map_contains_map (objects_map_t * map1, objects_map_t * map2)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
void *key; const void *key;
enumerator = objects_map_enumerator (map2); enumerator = objects_map_enumerator (map2);
@ -1075,7 +1085,7 @@ int
objects_map_intersects_map (objects_map_t * map1, objects_map_t * map2) objects_map_intersects_map (objects_map_t * map1, objects_map_t * map2)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
void *key; const void *key;
enumerator = objects_map_enumerator (map1); enumerator = objects_map_enumerator (map1);
@ -1137,8 +1147,8 @@ objects_map_copy (objects_map_t * old_map)
objects_map_t * objects_map_t *
objects_map_map_keys (objects_map_t * map, objects_map_map_keys (objects_map_t * map,
void *(*fcn) (void *, void *), const void *(*fcn) (const void *, const void *),
void *user_data) const void *user_data)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
objects_map_node_t *node; objects_map_node_t *node;
@ -1147,12 +1157,13 @@ objects_map_map_keys (objects_map_t * map,
while ((node = _objects_map_enumerator_next_node (&enumerator)) != NULL) while ((node = _objects_map_enumerator_next_node (&enumerator)) != NULL)
{ {
void *key; const void *key;
key = (*fcn) (node->key, user_data); key = (*fcn) (node->key, user_data);
objects_retain (objects_map_key_callbacks (map), key, map); objects_retain (objects_map_key_callbacks (map), key, map);
objects_release (objects_map_key_callbacks (map), node->key, map); objects_release (objects_map_key_callbacks (map),
(void*)node->key, map);
node->key = key; node->key = key;
} }
@ -1161,8 +1172,8 @@ objects_map_map_keys (objects_map_t * map,
objects_map_t * objects_map_t *
objects_map_map_values (objects_map_t * map, objects_map_map_values (objects_map_t * map,
void *(*fcn) (void *, void *), const void *(*fcn) (const void *, const void *),
void *user_data) const void *user_data)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
objects_map_node_t *node; objects_map_node_t *node;
@ -1171,12 +1182,13 @@ objects_map_map_values (objects_map_t * map,
while ((node = _objects_map_enumerator_next_node (&enumerator)) != NULL) while ((node = _objects_map_enumerator_next_node (&enumerator)) != NULL)
{ {
void *value; const void *value;
value = (fcn) (node->value, user_data); value = (fcn) (node->value, user_data);
objects_retain (objects_map_value_callbacks (map), value, map); objects_retain (objects_map_value_callbacks (map), value, map);
objects_release (objects_map_value_callbacks (map), node->value, map); objects_release (objects_map_value_callbacks (map),
(void*)node->value, map);
node->value = value; node->value = value;
} }
@ -1189,7 +1201,7 @@ objects_map_t *
objects_map_intersect_map (objects_map_t * map, objects_map_t * other_map) objects_map_intersect_map (objects_map_t * map, objects_map_t * other_map)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
void *key; const void *key;
enumerator = objects_map_enumerator (map); enumerator = objects_map_enumerator (map);
@ -1204,7 +1216,7 @@ objects_map_t *
objects_map_minus_map (objects_map_t * map, objects_map_t * other_map) objects_map_minus_map (objects_map_t * map, objects_map_t * other_map)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
void *key; const void *key;
enumerator = objects_map_enumerator (other_map); enumerator = objects_map_enumerator (other_map);
@ -1220,8 +1232,8 @@ objects_map_t *
objects_map_union_map (objects_map_t * map, objects_map_t * other_map) objects_map_union_map (objects_map_t * map, objects_map_t * other_map)
{ {
objects_map_enumerator_t enumerator; objects_map_enumerator_t enumerator;
void *key; const void *key;
void *value; const void *value;
enumerator = objects_map_enumerator (other_map); enumerator = objects_map_enumerator (other_map);

View file

@ -33,10 +33,10 @@
/**** Type, Constant, and Macro Definitions **********************************/ /**** Type, Constant, and Macro Definitions **********************************/
typedef void *(*objects_malloc_func_t) (size_t, void *); typedef void *(*objects_malloc_func_t) (size_t, const void *);
typedef void *(*objects_calloc_func_t) (size_t, size_t, void *); typedef void *(*objects_calloc_func_t) (size_t, size_t, const void *);
typedef void *(*objects_realloc_func_t) (void *, size_t, void *); typedef void *(*objects_realloc_func_t) (void *, size_t, const void *);
typedef void (*objects_free_func_t) (void *, void *); typedef void (*objects_free_func_t) (void *, const void *);
typedef struct _objects_allocs objects_allocs_t; typedef struct _objects_allocs objects_allocs_t;
@ -46,7 +46,7 @@ struct _objects_allocs
objects_calloc_func_t calloc; objects_calloc_func_t calloc;
objects_realloc_func_t realloc; objects_realloc_func_t realloc;
objects_free_func_t free; objects_free_func_t free;
void *user_data; const void *user_data;
}; };
/* Shorthand macros. */ /* Shorthand macros. */
@ -71,10 +71,10 @@ void *
objects_calloc (objects_allocs_t allocs, size_t n, size_t s); objects_calloc (objects_allocs_t allocs, size_t n, size_t s);
void * void *
objects_realloc (objects_allocs_t allocs, void *p, size_t s); objects_realloc (objects_allocs_t allocs, const void *p, size_t s);
void void
objects_free (objects_allocs_t allocs, void *p); objects_free (objects_allocs_t allocs, const void *p);
size_t size_t
objects_next_power_of_two (size_t start); objects_next_power_of_two (size_t start);

View file

@ -47,7 +47,7 @@ struct _objects_array_bucket
size_t index; size_t index;
/* The bucket's cargo */ /* The bucket's cargo */
void *element; const void *element;
}; };
struct _objects_array struct _objects_array
@ -55,8 +55,8 @@ struct _objects_array
/* Identifying information. */ /* Identifying information. */
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -135,7 +135,7 @@ int objects_array_is_equal_to_array (objects_array_t * array, objects_array_t *
/** Adding **/ /** Adding **/
void *objects_array_at_index_put_element (objects_array_t * array, size_t index, void *element); const void *objects_array_at_index_put_element (objects_array_t * array, size_t index, const void *element);
/** Replacing **/ /** Replacing **/
@ -143,9 +143,9 @@ void *objects_array_at_index_put_element (objects_array_t * array, size_t index,
void objects_array_remove_element_at_index (objects_array_t * array, size_t index); void objects_array_remove_element_at_index (objects_array_t * array, size_t index);
void objects_array_remove_element (objects_array_t * array, void *element); void objects_array_remove_element (objects_array_t * array, const void *element);
void objects_array_remove_element_known_present (objects_array_t * array, void *element); void objects_array_remove_element_known_present (objects_array_t * array, const void *element);
/** Emptying **/ /** Emptying **/
@ -153,19 +153,19 @@ void objects_array_empty (objects_array_t * array);
/** Searching **/ /** Searching **/
int objects_array_contains_element (objects_array_t * array, void *element); int objects_array_contains_element (objects_array_t * array, const void *element);
void *objects_array_element (objects_array_t * array, void *element); const void *objects_array_element (objects_array_t * array, const void *element);
size_t objects_array_index_of_element (objects_array_t * array, void *element); size_t objects_array_index_of_element (objects_array_t * array, const void *element);
void *objects_array_element_at_index (objects_array_t * array, size_t index); const void *objects_array_element_at_index (objects_array_t * array, size_t index);
void **objects_array_all_elements (objects_array_t * array); const void **objects_array_all_elements (objects_array_t * array);
void **objects_array_all_elements_ascending (objects_array_t * array); const void **objects_array_all_elements_ascending (objects_array_t * array);
void **objects_array_all_element_descending (objects_array_t * array); const void **objects_array_all_element_descending (objects_array_t * array);
/** Enumerating **/ /** Enumerating **/
@ -175,9 +175,9 @@ objects_array_enumerator_t objects_array_ascending_enumerator (objects_array_t *
objects_array_enumerator_t objects_array_descending_enumerator (objects_array_t * array); objects_array_enumerator_t objects_array_descending_enumerator (objects_array_t * array);
int objects_array_enumerator_next_index_and_element (objects_array_enumerator_t *enumerator, size_t *index, void **element); int objects_array_enumerator_next_index_and_element (objects_array_enumerator_t *enumerator, size_t *index, const void **element);
int objects_array_enumerator_next_element (objects_array_enumerator_t *enumerator, void **element); int objects_array_enumerator_next_element (objects_array_enumerator_t *enumerator, const void **element);
int objects_array_enumerator_next_index (objects_array_enumerator_t *enumerator, size_t *element); int objects_array_enumerator_next_index (objects_array_enumerator_t *enumerator, size_t *element);

View file

@ -33,12 +33,14 @@
/**** Type, Constant, and Macro Definitions **********************************/ /**** Type, Constant, and Macro Definitions **********************************/
typedef size_t (*objects_hash_func_t) (void *, void *); typedef size_t (*objects_hash_func_t) (const void *, const void *);
typedef int (*objects_compare_func_t) (void *, void *, void *); typedef int (*objects_compare_func_t) (const void *, const void *,
typedef int (*objects_is_equal_func_t) (void *, void *, void *); const void *);
typedef void *(*objects_retain_func_t) (void *, void *); typedef int (*objects_is_equal_func_t) (const void *, const void *,
typedef void (*objects_release_func_t) (void *, void *); const void *);
typedef void *(*objects_describe_func_t) (void *, void *); typedef void *(*objects_retain_func_t) (const void *, const void *);
typedef void (*objects_release_func_t) (void *, const void *);
typedef void *(*objects_describe_func_t) (const void *, const void *);
typedef struct _objects_callbacks objects_callbacks_t; typedef struct _objects_callbacks objects_callbacks_t;
@ -50,7 +52,7 @@ struct _objects_callbacks
objects_retain_func_t retain; objects_retain_func_t retain;
objects_release_func_t release; objects_release_func_t release;
objects_describe_func_t describe; objects_describe_func_t describe;
void *not_an_item_marker; const void *not_an_item_marker;
}; };
/** Callbacks for various types **/ /** Callbacks for various types **/
@ -88,85 +90,85 @@ objects_callbacks_standardize (objects_callbacks_t callbacks);
/** Using callbacks **/ /** Using callbacks **/
size_t objects_hash (objects_callbacks_t callbacks, size_t objects_hash (objects_callbacks_t callbacks,
void *thing, const void *thing,
void *user_data); const void *user_data);
int objects_compare (objects_callbacks_t callbacks, int objects_compare (objects_callbacks_t callbacks,
void *thing1, const void *thing1,
void *thing2, const void *thing2,
void *user_data); const void *user_data);
int objects_is_equal (objects_callbacks_t callbacks, int objects_is_equal (objects_callbacks_t callbacks,
void *thing1, const void *thing1,
void *thing2, const void *thing2,
void *user_data); const void *user_data);
void *objects_retain (objects_callbacks_t callbacks, void *objects_retain (objects_callbacks_t callbacks,
void *thing, const void *thing,
void *user_data); const void *user_data);
void objects_release (objects_callbacks_t callbacks, void objects_release (objects_callbacks_t callbacks,
void *thing, void *thing,
void *user_data); const void *user_data);
/* FIXME: Decide what to do with this describe stuff. We'd really like /* FIXME: Decide what to do with this describe stuff. We'd really like
* them to return Strings? Or would we rather they be `char *'s? * them to return Strings? Or would we rather they be `char *'s?
* Or something else? */ * Or something else? */
void *objects_describe (objects_callbacks_t callbacks, void *objects_describe (objects_callbacks_t callbacks,
void *thing, const void *thing,
void *user_data); const void *user_data);
void *objects_not_an_item_marker (objects_callbacks_t); const void *objects_not_an_item_marker (objects_callbacks_t);
/** Specific callback functions **/ /** Specific callback functions **/
/* For `void *' */ /* For `void *' */
size_t objects_void_p_hash(void *ptr); size_t objects_void_p_hash(const void *ptr);
int objects_void_p_compare(void *ptr, void *qtr); int objects_void_p_compare(const void *ptr, const void *qtr);
int objects_void_p_is_equal(void *ptr, void *qtr); int objects_void_p_is_equal(const void *ptr, const void *qtr);
void *objects_void_p_retain(void *ptr); const void *objects_void_p_retain(const void *ptr);
void objects_void_p_release(void *ptr); void objects_void_p_release(const void *ptr);
void *objects_void_p_describe(void *ptr); const void *objects_void_p_describe(const void *ptr);
/* For `void *' */ /* For `void *' */
size_t objects_owned_void_p_hash(void *ptr); size_t objects_owned_void_p_hash(const void *ptr);
int objects_owned_void_p_compare(void *ptr, void *qtr); int objects_owned_void_p_compare(const void *ptr, const void *qtr);
int objects_owned_void_p_is_equal(void *ptr, void *qtr); int objects_owned_void_p_is_equal(const void *ptr, const void *qtr);
void *objects_owned_void_p_retain(void *ptr); const void *objects_owned_void_p_retain(const void *ptr);
void objects_owned_void_p_release(void *ptr); void objects_owned_void_p_release(const void *ptr);
void *objects_owned_void_p_describe(void *ptr); const void *objects_owned_void_p_describe(const void *ptr);
/* For `int' */ /* For `int' */
size_t objects_int_hash(void *i); size_t objects_int_hash(const void *i);
int objects_int_compare(void *i, void *j); int objects_int_compare(const void *i, const void *j);
int objects_int_is_equal(void *i, void *j); int objects_int_is_equal(const void *i, const void *j);
void *objects_int_retain(void *i); const void *objects_int_retain(const void *i);
void objects_int_release(void *i); void objects_int_release(const void *i);
void *objects_int_describe(void *i); const void *objects_int_describe(const void *i);
/* For `int *' */ /* For `int *' */
size_t objects_int_p_hash(void *iptr); size_t objects_int_p_hash(const void *iptr);
int objects_int_p_compare(void *iptr, void *jptr); int objects_int_p_compare(const void *iptr, const void *jptr);
int objects_int_p_is_equal(void *iptr, void *jptr); int objects_int_p_is_equal(const void *iptr, const void *jptr);
void *objects_int_p_retain(void *iptr); const void *objects_int_p_retain(const void *iptr);
void objects_int_p_release(void *iptr); void objects_int_p_release(const void *iptr);
void *objects_int_p_describe(void *iptr); const void *objects_int_p_describe(const void *iptr);
/* For `char *' */ /* For `char *' */
size_t objects_char_p_hash(void *cptr); size_t objects_char_p_hash(const void *cptr);
int objects_char_p_compare(void *cptr, void *dptr); int objects_char_p_compare(const void *cptr, const void *dptr);
int objects_char_p_is_equal(void *cptr, void *dptr); int objects_char_p_is_equal(const void *cptr, const void *dptr);
void *objects_char_p_retain(void *cptr); const void *objects_char_p_retain(const void *cptr);
void objects_char_p_release(void *cptr); void objects_char_p_release(const void *cptr);
void *objects_char_p_describe(void *cptr); const void *objects_char_p_describe(const void *cptr);
/* For `id' */ /* For `id' */
size_t objects_id_hash(void *obj); size_t objects_id_hash(const void *obj);
int objects_id_compare(void *obj, void *jbo); int objects_id_compare(const void *obj, const void *jbo);
int objects_id_is_equal(void *obj, void *jbo); int objects_id_is_equal(const void *obj, const void *jbo);
void *objects_id_retain(void *obj); const void *objects_id_retain(const void *obj);
void objects_id_release(void *obj); void objects_id_release(const void *obj);
void *objects_id_describe(void *obj); const void *objects_id_describe(const void *obj);
#endif /* __callbacks_h_OBJECTS_INCLUDE */ #endif /* __callbacks_h_OBJECTS_INCLUDE */

View file

@ -53,8 +53,8 @@ struct _objects_data
{ {
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;

View file

@ -49,7 +49,7 @@ struct _objects_hash_node
objects_hash_node_t *next_in_hash; objects_hash_node_t *next_in_hash;
objects_hash_node_t *prev_in_hash; objects_hash_node_t *prev_in_hash;
void *element; const void *element;
}; };
struct _objects_hash_bucket struct _objects_hash_bucket
@ -64,8 +64,8 @@ struct _objects_hash
{ {
int magic; int magic;
size_t number; size_t number;
char *name; const char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -144,7 +144,10 @@ objects_hash_t * objects_hash_copy_with_allocs (objects_hash_t * hash, objects_a
* to handle functions that aren't one-to-one is to create a new hash * to handle functions that aren't one-to-one is to create a new hash
* and transform the elements of the first to create the elements of * and transform the elements of the first to create the elements of
* the second. */ * the second. */
objects_hash_t * objects_hash_map_elements (objects_hash_t * hash, void *(*fcn) (void *, void *), void *user_data); objects_hash_t *
objects_hash_map_elements (objects_hash_t * hash,
const void *(*fcn) (const void *, const void *),
const void *user_data);
/** Destroying **/ /** Destroying **/
@ -160,19 +163,22 @@ int objects_hash_is_equal_to_hash (objects_hash_t * hash, objects_hash_t * other
/** Adding **/ /** Adding **/
void *objects_hash_add_element_known_absent (objects_hash_t * hash, void *element); const void *objects_hash_add_element_known_absent (objects_hash_t *hash,
const void *element);
void *objects_hash_add_element (objects_hash_t * hash, void *element); const void *objects_hash_add_element (objects_hash_t *hash,
const void *element);
void *objects_hash_add_element_if_absent (objects_hash_t * hash, void *element); const void *objects_hash_add_element_if_absent (objects_hash_t *hash,
const void *element);
/** Replacing **/ /** Replacing **/
void objects_hash_replace_element (objects_hash_t * hash, void *element); void objects_hash_replace_element (objects_hash_t *hash, const void *element);
/** Removing **/ /** Removing **/
void objects_hash_remove_element (objects_hash_t * hash, void *element); void objects_hash_remove_element (objects_hash_t *hash, const void *element);
/** Emptying **/ /** Emptying **/
@ -182,17 +188,18 @@ void objects_hash_empty (objects_hash_t * hash);
void *objects_hash_any_element (objects_hash_t *hash); void *objects_hash_any_element (objects_hash_t *hash);
int objects_hash_contains_element (objects_hash_t * hash, void *element); int objects_hash_contains_element (objects_hash_t *hash, const void *element);
void *objects_hash_element (objects_hash_t * hash, void *element); const void *objects_hash_element (objects_hash_t *hash, const void *element);
void **objects_hash_all_elements (objects_hash_t * hash); const void **objects_hash_all_elements (objects_hash_t *hash);
/** Enumerating **/ /** Enumerating **/
objects_hash_enumerator_t objects_hash_enumerator (objects_hash_t *hash); objects_hash_enumerator_t objects_hash_enumerator (objects_hash_t *hash);
int objects_hash_enumerator_next_element (objects_hash_enumerator_t *enumerator, void **element); int objects_hash_enumerator_next_element (objects_hash_enumerator_t *enumeratr,
const void **element);
/** Statistics **/ /** Statistics **/

View file

@ -47,7 +47,7 @@ struct _objects_list_node
objects_list_node_t *next_in_list; objects_list_node_t *next_in_list;
objects_list_node_t *prev_in_list; objects_list_node_t *prev_in_list;
void *element; const void *element;
}; };
struct _objects_list struct _objects_list
@ -56,7 +56,7 @@ struct _objects_list
int magic; int magic;
size_t number; size_t number;
char *name; char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
@ -143,9 +143,9 @@ objects_list_t * objects_list_at_index_insert_list (objects_list_t * base_list,
objects_list_t * objects_list_roll_to_nth_element (objects_list_t * list, long int n); objects_list_t * objects_list_roll_to_nth_element (objects_list_t * list, long int n);
objects_list_t * objects_list_roll_to_element (objects_list_t * list, void *element); objects_list_t * objects_list_roll_to_element (objects_list_t * list, const void *element);
objects_list_t * objects_list_roll_to_nth_occurrance_of_element (objects_list_t * list, long int n, void *element); objects_list_t * objects_list_roll_to_nth_occurrance_of_element (objects_list_t * list, long int n, const void *element);
objects_list_t * objects_list_invert (objects_list_t * list); objects_list_t * objects_list_invert (objects_list_t * list);
@ -153,39 +153,39 @@ objects_list_t * objects_list_swap_elements_at_indices (objects_list_t * list, l
/** Adding **/ /** Adding **/
void *objects_list_append_element (objects_list_t * list, void *element); const void *objects_list_append_element (objects_list_t * list, const void *element);
void *objects_list_append_element_if_absent (objects_list_t * list, void *element); const void *objects_list_append_element_if_absent (objects_list_t * list, const void *element);
void *objects_list_prepend_element (objects_list_t * list, void *element); const void *objects_list_prepend_element (objects_list_t * list, const void *element);
void *objects_list_prepend_element_if_absent (objects_list_t * list, void *element); const void *objects_list_prepend_element_if_absent (objects_list_t * list, const void *element);
void *objects_list_at_index_insert_element (objects_list_t * list, long int n, void *element); const void *objects_list_at_index_insert_element (objects_list_t * list, long int n, const void *element);
void *objects_list_at_index_insert_element_if_absent (objects_list_t * list, long int n, void *element); const void *objects_list_at_index_insert_element_if_absent (objects_list_t * list, long int n, const void *element);
void *objects_list_queue_push_element (objects_list_t * list, void *element); const void *objects_list_queue_push_element (objects_list_t * list, const void *element);
void *objects_list_stack_push_element (objects_list_t * list, void *element); const void *objects_list_stack_push_element (objects_list_t * list, const void *element);
/** Replacing **/ /** Replacing **/
void objects_list_replace_nth_occurrance_of_element (objects_list_t * list, long int n, void *old_element, void *new_element); void objects_list_replace_nth_occurrance_of_element (objects_list_t * list, long int n, const void *old_element, const void *new_element);
void objects_list_replace_element (objects_list_t * list, void *old_element, void *new_element); void objects_list_replace_element (objects_list_t * list, const void *old_element, const void *new_element);
void objects_list_replace_nth_element (objects_list_t * list, long int n, void *new_element); void objects_list_replace_nth_element (objects_list_t * list, long int n, const void *new_element);
void objects_list_replace_first_element (objects_list_t * list, void *new_element); void objects_list_replace_first_element (objects_list_t * list, const void *new_element);
void objects_list_replace_last_element (objects_list_t * list, void *new_element); void objects_list_replace_last_element (objects_list_t * list, const void *new_element);
/** Removing **/ /** Removing **/
void objects_list_remove_nth_occurrence_of_element (objects_list_t * list, long int n, void *element); void objects_list_remove_nth_occurrence_of_element (objects_list_t * list, long int n, const void *element);
void objects_list_remove_element (objects_list_t * list, void *element); void objects_list_remove_element (objects_list_t * list, const void *element);
void objects_list_remove_nth_element (objects_list_t * list, long int n); void objects_list_remove_nth_element (objects_list_t * list, long int n);
@ -207,17 +207,17 @@ void objects_list_empty (objects_list_t * list);
/** Searching **/ /** Searching **/
int objects_list_contains_element (objects_list_t * list, void *element); int objects_list_contains_element (objects_list_t * list, const void *element);
void *objects_list_element (objects_list_t * list, void *element); const void *objects_list_element (objects_list_t * list, const void *element);
void *objects_list_nth_element (objects_list_t * list, long int n); const void *objects_list_nth_element (objects_list_t * list, long int n);
void *objects_list_first_element (objects_list_t * list); const void *objects_list_first_element (objects_list_t * list);
void *objects_list_last_element (objects_list_t * list); const void *objects_list_last_element (objects_list_t * list);
void **objects_list_all_elements (objects_list_t * list); const void **objects_list_all_elements (objects_list_t * list);
/** Enumerating **/ /** Enumerating **/
@ -227,13 +227,13 @@ objects_list_enumerator_t objects_list_forward_enumerator (objects_list_t * list
objects_list_enumerator_t objects_list_reverse_enumerator (objects_list_t * list); objects_list_enumerator_t objects_list_reverse_enumerator (objects_list_t * list);
int objects_list_enumerator_next_element (objects_list_enumerator_t *enumerator, void **element); int objects_list_enumerator_next_element (objects_list_enumerator_t *enumerator, const void **element);
/** Mapping **/ /** Mapping **/
/* NO WARNING: The mapping function FCN need not be one-to-one on the /* NO WARNING: The mapping function FCN need not be one-to-one on the
* elements of LIST. In fact, FCN may do whatever it likes. */ * elements of LIST. In fact, FCN may do whatever it likes. */
objects_list_t * objects_list_map_elements (objects_list_t * list, void *(*fcn) (void *, void *), void *user_data); objects_list_t * objects_list_map_elements (objects_list_t * list, const void *(*fcn) (const void *, const void *), const void *user_data);
/** Statistics **/ /** Statistics **/

View file

@ -44,8 +44,8 @@ typedef struct _objects_map_enumerator objects_map_enumerator_t;
struct _objects_map_node struct _objects_map_node
{ {
void *key; const void *key;
void *value; const void *value;
objects_map_bucket_t *bucket; objects_map_bucket_t *bucket;
objects_map_t *map; objects_map_t *map;
@ -70,7 +70,7 @@ struct _objects_map
int magic; int magic;
size_t number; size_t number;
char *name; char *name;
void *extra; const void *extra;
objects_callbacks_t extra_callbacks; objects_callbacks_t extra_callbacks;
objects_allocs_t allocs; objects_allocs_t allocs;
objects_callbacks_t key_callbacks; objects_callbacks_t key_callbacks;
@ -203,19 +203,19 @@ int
/** Finding elements in a mapionary **/ /** Finding elements in a mapionary **/
int int
objects_map_contains_key (objects_map_t * map, void *key); objects_map_contains_key (objects_map_t * map, const void *key);
int int
objects_map_key_and_value (objects_map_t * map, objects_map_key_and_value (objects_map_t * map,
void *key, const void *key,
void **old_key, void **old_key,
void **value); void **value);
void * const void *
objects_map_key (objects_map_t * map, void *key); objects_map_key (objects_map_t * map, const void *key);
void * const void *
objects_map_value (objects_map_t * map, void *key); objects_map_value_at_key (objects_map_t * map, const void *key);
/** Enumerating the nodes and elements of a mapionary **/ /** Enumerating the nodes and elements of a mapionary **/
@ -223,58 +223,58 @@ objects_map_enumerator_t
objects_map_enumerator (objects_map_t * map); objects_map_enumerator (objects_map_t * map);
int int
objects_map_enumerator_next_key_and_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key_and_value (objects_map_enumerator_t *enumeratr,
void **key, const void **key,
void **value); const void **value);
int int
objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_key (objects_map_enumerator_t * enumerator,
void **key); const void **key);
int int
objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator, objects_map_enumerator_next_value (objects_map_enumerator_t * enumerator,
void **value); const void **value);
/** Obtaining an array of the elements of a mapionary **/ /** Obtaining an array of the elements of a mapionary **/
void ** const void **
objects_map_all_keys_and_values (objects_map_t * map); objects_map_all_keys_and_values (objects_map_t * map);
void ** const void **
objects_map_all_keys (objects_map_t * map); objects_map_all_keys (objects_map_t * map);
void ** const void **
objects_map_all_values (objects_map_t * map); objects_map_all_values (objects_map_t * map);
/** Removing **/ /** Removing **/
void void
objects_map_remove_key (objects_map_t * map, void *key); objects_map_remove_key (objects_map_t * map, const void *key);
void void
objects_map_empty (objects_map_t * map); objects_map_empty (objects_map_t * map);
/** Adding **/ /** Adding **/
void * const void *
objects_map_at_key_put_value_known_absent (objects_map_t * map, objects_map_at_key_put_value_known_absent (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
void * const void *
objects_map_at_key_put_value (objects_map_t * map, objects_map_at_key_put_value (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
void * const void *
objects_map_at_key_put_value_if_absent (objects_map_t * map, objects_map_at_key_put_value_if_absent (objects_map_t * map,
void *key, const void *key,
void *value); const void *value);
/** Replacing **/ /** Replacing **/
void void
objects_map_replace_key (objects_map_t * map, void *key); objects_map_replace_key (objects_map_t * map, const void *key);
/** Comparing **/ /** Comparing **/
@ -300,15 +300,15 @@ objects_map_t *
* equal) keys. */ * equal) keys. */
objects_map_t * objects_map_t *
objects_map_map_keys (objects_map_t * map, objects_map_map_keys (objects_map_t * map,
void *(*kfcn) (void *, void *), const void *(*kfcn) (const void *, const void *),
void *user_data); const void *user_data);
/* NO WARNING: The mapping function VFCN need not be one-to-one on /* NO WARNING: The mapping function VFCN need not be one-to-one on
* (the equivalence classes of) values. */ * (the equivalence classes of) values. */
objects_map_t * objects_map_t *
objects_map_map_values (objects_map_t * map, objects_map_map_values (objects_map_t * map,
void *(*vfcn) (void *, void *), const void *(*vfcn) (const void *, const void *),
void *user_data); const void *user_data);
/** Miscellaneous **/ /** Miscellaneous **/

View file

@ -46,11 +46,6 @@
#include <objects/RBTreeNode.h> #include <objects/RBTreeNode.h>
#include <objects/SplayTree.h> #include <objects/SplayTree.h>
#include <objects/EltNodeCollector.h>
#include <objects/LinkedListEltNode.h>
#include <objects/BinaryTreeEltNode.h>
#include <objects/RBTreeEltNode.h>
/* Magnitude objects */ /* Magnitude objects */
#include <objects/Magnitude.h> #include <objects/Magnitude.h>
#include <objects/Random.h> #include <objects/Random.h>
@ -75,4 +70,6 @@
#include <objects/Proxy.h> #include <objects/Proxy.h>
#include <objects/ConnectedCoder.h> #include <objects/ConnectedCoder.h>
#include <objects/Invocation.h>
#endif /* __objects_h_OBJECTS_INCLUDE */ #endif /* __objects_h_OBJECTS_INCLUDE */

View file

@ -73,7 +73,7 @@ objects_@XX@_set_name (objects_@XX@_t *xx, const char *name)
{ {
/* Figure out how much space we need. */ /* Figure out how much space we need. */
size_t len = strlen (name); size_t len = strlen (name);
char *old_name = xx->name; const char *old_name = xx->name;
/* Allocate space for the new name. (Don't forget the extra space /* Allocate space for the new name. (Don't forget the extra space
* for the terminating `NUL'. */ * for the terminating `NUL'. */
@ -148,7 +148,7 @@ objects_@XX@_set_extra_callbacks (objects_@XX@_t *xx, objects_callbacks_t callba
xx->extra_callbacks = callbacks; xx->extra_callbacks = callbacks;
/* Release the old contents. */ /* Release the old contents. */
objects_release (old_callbacks, xx->extra, xx); objects_release (old_callbacks, (void*)xx->extra, xx);
/* Set the contents to something noticible. */ /* Set the contents to something noticible. */
xx->extra = (xx->extra_callbacks).not_an_item_marker; xx->extra = (xx->extra_callbacks).not_an_item_marker;
@ -166,7 +166,7 @@ objects_@XX@_extra_callbacks (objects_@XX@_t *xx, objects_callbacks_t callbacks)
/* Returns XX's ``extra'', a little extra space that each Libobjects /* Returns XX's ``extra'', a little extra space that each Libobjects
* structure carries around with it. Its use is * structure carries around with it. Its use is
* implementation-dependent. */ * implementation-dependent. */
void * const void *
objects_@XX@_extra (objects_@XX@_t *xx) objects_@XX@_extra (objects_@XX@_t *xx)
{ {
return xx->extra; return xx->extra;
@ -174,15 +174,15 @@ objects_@XX@_extra (objects_@XX@_t *xx)
/* Sets XX's ``extra'', a little extra space that each Libobjects structure /* Sets XX's ``extra'', a little extra space that each Libobjects structure
* carries around with it. Its use is implementation-dependent. */ * carries around with it. Its use is implementation-dependent. */
void * const void *
objects_@XX@_set_extra (objects_@XX@_t *xx, void *extra) objects_@XX@_set_extra (objects_@XX@_t *xx, const void *extra)
{ {
void *old_extra; const void *old_extra;
/* Out with the old, and in with the new. */ /* Out with the old, and in with the new. */
old_extra = xx->extra; old_extra = xx->extra;
xx->extra = objects_retain (xx->extra_callbacks, extra, xx); xx->extra = objects_retain (xx->extra_callbacks, extra, xx);
objects_release (xx->extra_callbacks, old_extra, xx); objects_release (xx->extra_callbacks, (void*)old_extra, xx);
return old_extra; return old_extra;
} }
@ -192,7 +192,7 @@ void
objects_@XX@_unset_extra (objects_@XX@_t *xx) objects_@XX@_unset_extra (objects_@XX@_t *xx)
{ {
/* Release XX's extra. */ /* Release XX's extra. */
objects_release (xx->extra_callbacks, xx->extra, xx); objects_release (xx->extra_callbacks, (void*)xx->extra, xx);
/* Reset XX's extra. */ /* Reset XX's extra. */
xx->extra = (xx->extra_callbacks).not_an_item_marker; xx->extra = (xx->extra_callbacks).not_an_item_marker;

View file

@ -47,7 +47,7 @@ objects_@YY@_key_callbacks (objects_@YY@_t * yy)
} }
/* Returns the ``bogus'' marker associated with YY's keys. */ /* Returns the ``bogus'' marker associated with YY's keys. */
void * const void *
objects_@YY@_not_a_key_marker (objects_@YY@_t *yy) objects_@YY@_not_a_key_marker (objects_@YY@_t *yy)
{ {
return (yy->key_callbacks).not_an_item_marker; return (yy->key_callbacks).not_an_item_marker;
@ -61,7 +61,7 @@ objects_@YY@_value_callbacks (objects_@YY@_t *yy)
} }
/* Returns the ``bogus'' marker associated with YY's values. */ /* Returns the ``bogus'' marker associated with YY's values. */
void * const void *
objects_@YY@_not_a_value_marker (objects_@YY@_t *yy) objects_@YY@_not_a_value_marker (objects_@YY@_t *yy)
{ {
return (yy->value_callbacks).not_an_item_marker; return (yy->value_callbacks).not_an_item_marker;
@ -79,7 +79,7 @@ objects_@YY@_element_callbacks (objects_@YY@_t *yy)
} }
/* Returns the ``bogus'' marker associated with YY's elements. */ /* Returns the ``bogus'' marker associated with YY's elements. */
void * const void *
objects_@YY@_not_an_element_marker (objects_@YY@_t *yy) objects_@YY@_not_an_element_marker (objects_@YY@_t *yy)
{ {
return (yy->callbacks).not_an_item_marker; return (yy->callbacks).not_an_item_marker;