set.c revision ef42202ac8ed27e7ff1fc90ef8bc2590046dff25
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt/***
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt This file is part of systemd.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt Copyright 2010 Lennart Poettering
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt systemd is free software; you can redistribute it and/or modify it
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt under the terms of the GNU Lesser General Public License as published by
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt the Free Software Foundation; either version 2.1 of the License, or
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt (at your option) any later version.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt systemd is distributed in the hope that it will be useful, but
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt WITHOUT ANY WARRANTY; without even the implied warranty of
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt Lesser General Public License for more details.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt You should have received a copy of the GNU Lesser General Public License
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt along with systemd; If not, see <http://www.gnu.org/licenses/>.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt***/
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#include <stdlib.h>
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#include "set.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "hashmap.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#define MAKE_SET(h) ((Set*) (h))
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#define MAKE_HASHMAP(s) ((Hashmap*) (s))
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt/* For now this is not much more than a wrapper around a hashmap */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik FlyktSet *set_new(hash_func_t hash_func, compare_func_t compare_func) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt return MAKE_SET(hashmap_new(hash_func, compare_func));
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktvoid set_free(Set* s) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt hashmap_free(MAKE_HASHMAP(s));
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktvoid set_free_free(Set *s) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt hashmap_free_free(MAKE_HASHMAP(s));
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktint set_ensure_allocated(Set **s, hash_func_t hash_func, compare_func_t compare_func) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt return hashmap_ensure_allocated((Hashmap**) s, hash_func, compare_func);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktint set_put(Set *s, void *value) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt return hashmap_put(MAKE_HASHMAP(s), value, value);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktint set_consume(Set *s, void *value) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt int r = set_put(s, value);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (r < 0)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt free(value);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt return r;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flyktint set_replace(Set *s, void *value) {
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt return hashmap_replace(MAKE_HASHMAP(s), value, value);
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt}
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flyktvoid *set_get(Set *s, void *value) {
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt return hashmap_get(MAKE_HASHMAP(s), value);
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt}
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flyktbool set_contains(Set *s, void *value) {
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt return hashmap_contains(MAKE_HASHMAP(s), value);
c6affce8740bb0cee42eebf6d1d44dd518035e88Patrik Flykt}
c6affce8740bb0cee42eebf6d1d44dd518035e88Patrik Flykt
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flyktvoid *set_remove(Set *s, void *value) {
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt return hashmap_remove(MAKE_HASHMAP(s), value);
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt}
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flyktint set_remove_and_put(Set *s, void *old_value, void *new_value) {
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt return hashmap_remove_and_put(MAKE_HASHMAP(s), old_value, new_value, new_value);
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt}
631bbe71298ec892f77f44f94feb612646fe6853Patrik Flykt
631bbe71298ec892f77f44f94feb612646fe6853Patrik Flyktunsigned set_size(Set *s) {
return hashmap_size(MAKE_HASHMAP(s));
}
bool set_isempty(Set *s) {
return hashmap_isempty(MAKE_HASHMAP(s));
}
void *set_iterate(Set *s, Iterator *i) {
return hashmap_iterate(MAKE_HASHMAP(s), i, NULL);
}
void *set_iterate_backwards(Set *s, Iterator *i) {
return hashmap_iterate_backwards(MAKE_HASHMAP(s), i, NULL);
}
void *set_iterate_skip(Set *s, void *value, Iterator *i) {
return hashmap_iterate_skip(MAKE_HASHMAP(s), value, i);
}
void *set_steal_first(Set *s) {
return hashmap_steal_first(MAKE_HASHMAP(s));
}
void* set_first(Set *s) {
return hashmap_first(MAKE_HASHMAP(s));
}
void* set_last(Set *s) {
return hashmap_last(MAKE_HASHMAP(s));
}
int set_merge(Set *s, Set *other) {
return hashmap_merge(MAKE_HASHMAP(s), MAKE_HASHMAP(other));
}
void set_move(Set *s, Set *other) {
return hashmap_move(MAKE_HASHMAP(s), MAKE_HASHMAP(other));
}
int set_move_one(Set *s, Set *other, void *value) {
return hashmap_move_one(MAKE_HASHMAP(s), MAKE_HASHMAP(other), value);
}
Set* set_copy(Set *s) {
return MAKE_SET(hashmap_copy(MAKE_HASHMAP(s)));
}
void set_clear(Set *s) {
hashmap_clear(MAKE_HASHMAP(s));
}
void set_clear_free(Set *s) {
hashmap_clear_free(MAKE_HASHMAP(s));
}
char **set_get_strv(Set *s) {
return hashmap_get_strv(MAKE_HASHMAP(s));
}