Change from last version: Since used_atom obtains the index from valid_atom as its atom_type after init in parse_ref_filter_atom(), here is the only place where used_atom is initialized in the global, ATOM_INVALID and ATOM_UNKNOWN seem to cause unnecessary trouble. So remove ATOM_INVALID and ATOM_UNKNOWN, Use the original method of traversing valid_atom. ZheNing Hu (2): [GSOC] ref-filter: add objectsize to used_atom [GSOC] ref-filter: introduce enum atom_type ref-filter.c | 214 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 140 insertions(+), 74 deletions(-) base-commit: 7e391989789db82983665667013a46eabc6fc570 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-951%2Fadlternative%2Fref-filter-atom-type-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-951/adlternative/ref-filter-atom-type-v3 Pull-Request: https://github.com/gitgitgadget/git/pull/951 Range-diff vs v2: 1: 91ca57c9d04a = 1: 91ca57c9d04a [GSOC] ref-filter: add objectsize to used_atom 2: a1f70b39b7ef ! 2: 43400cac58e7 [GSOC] ref-filter: introduce enum atom_type @@ Commit message `used_atom.atom_type` will record corresponding enum value from valid_atom entry index, and then in specific reference attribute filling step, only need to compare the value of - the `used_atom.atom_type` to judge the atom type. - - the enum value of `ATOM_UNKNOWN` is equals to zero, which - could ensure that we can easily distinguish such a struct - where the atom_type is known from such a struct where it - is unknown yet. - - the enum value of `ATOM_INVALID` is equals to the size of - valid_atom array, which could help us iterate over - valid_atom array using something like: - - for (i = ATOM_UNKNOWN + 1; i < ATOM_INVALID; i++) - /* do something with valid_atom[i] */; + the `used_atom[i].atom_type` to judge the atom type. + Helped-by: Junio C Hamano <gitster@xxxxxxxxx> + Helped-by: Christian Couder <christian.couder@xxxxxxxxx> Signed-off-by: ZheNing Hu <adlternative@xxxxxxxxx> ## ref-filter.c ## @@ ref-filter.c: static struct ref_to_worktree_map { + * In the atom parsing stage, it will be passed to used_atom.atom_type + * as the identifier of the atom type. We can judge the type of used_atom + * entry by `if (used_atom[i].atom_type == ATOM_*)`. -+ * -+ * ATOM_UNKNOWN equals to 0, used as an enumeration value of uninitialized -+ * atom_type. -+ * ATOM_INVALID equals to the size of valid_atom array, which could help us -+ * iterate over valid_atom array like this: -+ * -+ * for (i = ATOM_UNKNOWN + 1; i < ATOM_INVALID; i++) { -+ * int len = strlen(valid_atom[i].name); -+ * if (len == atom_len && !memcmp(valid_atom[i].name, sp, len)) -+ * break; -+ * } + */ +enum atom_type { -+ATOM_UNKNOWN, -+ATOM_REFNAME, -+ATOM_OBJECTTYPE, -+ATOM_OBJECTSIZE, -+ATOM_OBJECTNAME, -+ATOM_DELTABASE, -+ATOM_TREE, -+ATOM_PARENT, -+ATOM_NUMPARENT, -+ATOM_OBJECT, -+ATOM_TYPE, -+ATOM_TAG, -+ATOM_AUTHOR, -+ATOM_AUTHORNAME, -+ATOM_AUTHOREMAIL, -+ATOM_AUTHORDATE, -+ATOM_COMMITTER, -+ATOM_COMMITTERNAME, -+ATOM_COMMITTEREMAIL, -+ATOM_COMMITTERDATE, -+ATOM_TAGGER, -+ATOM_TAGGERNAME, -+ATOM_TAGGEREMAIL, -+ATOM_TAGGERDATE, -+ATOM_CREATOR, -+ATOM_CREATORDATE, -+ATOM_SUBJECT, -+ATOM_BODY, -+ATOM_TRAILERS, -+ATOM_CONTENTS, -+ATOM_UPSTREAM, -+ATOM_PUSH, -+ATOM_SYMREF, -+ATOM_FLAG, -+ATOM_HEAD, -+ATOM_COLOR, -+ATOM_WORKTREEPATH, -+ATOM_ALIGN, -+ATOM_END, -+ATOM_IF, -+ATOM_THEN, -+ATOM_ELSE, -+ATOM_INVALID, ++ ATOM_REFNAME, ++ ATOM_OBJECTTYPE, ++ ATOM_OBJECTSIZE, ++ ATOM_OBJECTNAME, ++ ATOM_DELTABASE, ++ ATOM_TREE, ++ ATOM_PARENT, ++ ATOM_NUMPARENT, ++ ATOM_OBJECT, ++ ATOM_TYPE, ++ ATOM_TAG, ++ ATOM_AUTHOR, ++ ATOM_AUTHORNAME, ++ ATOM_AUTHOREMAIL, ++ ATOM_AUTHORDATE, ++ ATOM_COMMITTER, ++ ATOM_COMMITTERNAME, ++ ATOM_COMMITTEREMAIL, ++ ATOM_COMMITTERDATE, ++ ATOM_TAGGER, ++ ATOM_TAGGERNAME, ++ ATOM_TAGGEREMAIL, ++ ATOM_TAGGERDATE, ++ ATOM_CREATOR, ++ ATOM_CREATORDATE, ++ ATOM_SUBJECT, ++ ATOM_BODY, ++ ATOM_TRAILERS, ++ ATOM_CONTENTS, ++ ATOM_UPSTREAM, ++ ATOM_PUSH, ++ ATOM_SYMREF, ++ ATOM_FLAG, ++ ATOM_HEAD, ++ ATOM_COLOR, ++ ATOM_WORKTREEPATH, ++ ATOM_ALIGN, ++ ATOM_END, ++ ATOM_IF, ++ ATOM_THEN, ++ ATOM_ELSE, +}; + /* @@ ref-filter.c: static struct { /* * Please update $__git_ref_fieldlist in git-completion.bash * when you add new atoms -@@ ref-filter.c: static int parse_ref_filter_atom(const struct ref_format *format, - atom_len = (arg ? arg : ep) - sp; - - /* Is the atom a valid one? */ -- for (i = 0; i < ARRAY_SIZE(valid_atom); i++) { -+ for (i = ATOM_UNKNOWN + 1; i < ATOM_INVALID; i++) { - int len = strlen(valid_atom[i].name); - if (len == atom_len && !memcmp(valid_atom[i].name, sp, len)) - break; - } - -- if (ARRAY_SIZE(valid_atom) <= i) -+ if (i == ATOM_INVALID) - return strbuf_addf_ret(err, -1, _("unknown field name: %.*s"), - (int)(ep-atom), atom); - if (valid_atom[i].source != SOURCE_NONE && !have_git_dir()) @@ ref-filter.c: static int parse_ref_filter_atom(const struct ref_format *format, at = used_atom_cnt; used_atom_cnt++; -- gitgitgadget