From 1cd22a9454e283e3b3ff6681815f57698d38e83a Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 9 Nov 2015 08:12:28 -0500 Subject: [PATCH] core/set: Add functions for reading and writing sets Signed-off-by: Anna Schumaker --- core/set.c | 20 ++++++++++++++++++++ include/core/set.h | 7 +++++++ tests/core/set.c | 19 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/core/set.c b/core/set.c index f72e0127..ad401f75 100644 --- a/core/set.c +++ b/core/set.c @@ -21,3 +21,23 @@ void set_inline_intersect(const struct set *lhs, struct set *rhs) g_hash_table_iter_remove(&it_rhs.it_iter); } } + +void set_read(struct file *file, struct set *set) +{ + unsigned int num, val, i; + + file_readf(file, "%u ", &num); + for (i = 0; i < num; i++) { + file_readf(file, "%u ", &val); + set_insert(set, val); + } +} + +void set_write(struct file *file, struct set *set) +{ + struct set_iter it; + + file_writef(file, "%u ", set_size(set)); + set_for_each(set, &it) + file_writef(file, "%u ", it.it_val); +} diff --git a/include/core/set.h b/include/core/set.h index 28b9b9eb..e4a497d5 100644 --- a/include/core/set.h +++ b/include/core/set.h @@ -4,6 +4,7 @@ #ifndef OCARINA_CORE_SET_H #define OCARINA_CORE_SET_H +#include #include #include @@ -60,6 +61,12 @@ void set_copy(const struct set *, struct set *); /* Remove values from set2 that are not also in set1. */ void set_inline_intersect(const struct set *, struct set *); +/* Read values from file. */ +void set_read(struct file *, struct set *); + +/* Write values to file. */ +void set_write(struct file *, struct set *); + static inline bool set_iter_next(struct set_iter *it) { diff --git a/tests/core/set.c b/tests/core/set.c index d0b16d9d..7eff18f3 100644 --- a/tests/core/set.c +++ b/tests/core/set.c @@ -7,6 +7,7 @@ void test_set() { + struct file f = FILE_INIT("set", 0); struct set set = SET_INIT(); unsigned int i, N = 10; struct set_iter it; @@ -37,9 +38,27 @@ void test_set() i += 2; } test_loop_passed(); + file_open(&f, OPEN_WRITE); + set_write(&f, &set); + file_close(&f); + set_clear(&set); test_equal(set_size(&set), 0); + file_open(&f, OPEN_READ); + set_read(&f, &set); + test_equal(set_size(&set), N / 2); + file_close(&f); + + /* Check values. */ + for (i = 0; i < N; i++) { + if (i % 2) { /* Odd values. */ + test_loop_equal(set_has(&set, i), (bool)true, i); + } else { /* Even values. */ + test_loop_equal(set_has(&set, i), (bool)false, i); + } + } test_loop_passed(); + set_deinit(&set); }