serialize: add serialize_bool_elide() helper

In many case we serialize into objects that have been zero-initialized.
To save some time and resources when there are a lot of booleans, add a
helper that serializes only when the boolean is true.
This commit is contained in:
Luca Boccassi
2023-07-29 11:25:05 +01:00
parent 598d2428e1
commit 942c40c64c
2 changed files with 10 additions and 3 deletions
+3
View File
@@ -19,6 +19,9 @@ int serialize_strv(FILE *f, const char *key, char **l);
static inline int serialize_bool(FILE *f, const char *key, bool b) {
return serialize_item(f, key, yes_no(b));
}
static inline int serialize_bool_elide(FILE *f, const char *key, bool b) {
return b ? serialize_item(f, key, yes_no(b)) : 0;
}
int deserialize_usec(const char *value, usec_t *timestamp);
int deserialize_dual_timestamp(const char *value, dual_timestamp *t);
+7 -3
View File
@@ -22,19 +22,23 @@ TEST(serialize_item) {
assert_se(serialize_item(f, "a", NULL) == 0);
assert_se(serialize_item(f, "a", "bbb") == 1);
assert_se(serialize_item(f, "a", "bbb") == 1);
assert_se(serialize_bool_elide(f, "c", true) == 1);
assert_se(serialize_bool_elide(f, "d", false) == 0);
assert_se(serialize_item(f, "a", long_string) == -EINVAL);
assert_se(serialize_item(f, long_string, "a") == -EINVAL);
assert_se(serialize_item(f, long_string, long_string) == -EINVAL);
rewind(f);
_cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
_cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL;
assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
assert_se(streq(line1, "a=bbb"));
assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
assert_se(streq(line2, "a=bbb"));
assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
assert_se(streq(line3, ""));
assert_se(read_line(f, LONG_LINE_MAX, &line3) > 0);
assert_se(streq(line3, "c=yes"));
assert_se(read_line(f, LONG_LINE_MAX, &line4) == 0);
assert_se(streq(line4, ""));
}
TEST(serialize_item_escaped) {