git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 25/27] [GSOC] ref-filter: use switch case instread of if else

From
ZheNing Hu via GitGitGadget <gitgitgadget@gmail.com>
Date
Aug 13, 2021, 08:23 UTC
Message-ID
<fc87a6c84a36c0da39a419aec0edf0e40dc54474.1628842990.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1016.git.1628842990.gitgitgadget@gmail.com>
From: ZheNing Hu <adlternative@gmail.com>

In the original code, the check of the atom type is through if/else conditional check, using switch/case can allow the compiler to reduce unnecessary branch checks and increase the readability of the code.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Hariom Verma <hariom18599@gmail.com>
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
 ref-filter.c | 163 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 109 insertions(+), 54 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index a0de5f21ff5..6fbf38f1375 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1126,9 +1126,11 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
 		struct atom_value *v = &val[i];
 		if (!!deref != used_atom[i].deref)
 			continue;
-		if (atom_type == ATOM_OBJECTTYPE)
+		switch (atom_type) {
+		case ATOM_OBJECTTYPE : {
 			v->s = xstrdup(type_name(oi->type));
-		else if (atom_type == ATOM_OBJECTSIZE) {
+			break;
+		} case ATOM_OBJECTSIZE : {
 			if (used_atom[i].u.objectsize.option == O_SIZE_DISK) {
 				v->value = oi->disk_size;
 				v->s = xstrfmt_len(&v->s_size, "%"PRIuMAX, (uintmax_t)oi->disk_size);
@@ -1136,10 +1138,20 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
 				v->value = oi->size;
 				v->s = xstrfmt_len(&v->s_size, "%"PRIuMAX , (uintmax_t)oi->size);
 			}
-		} else if (atom_type == ATOM_DELTABASE)
+			break;
+		}
+		case ATOM_DELTABASE: {
 			v->s = xstrdup(oid_to_hex(&oi->delta_base_oid));
-		else if (atom_type == ATOM_OBJECTNAME && deref) {
-			v->s = xstrdup(do_grab_oid("objectname", &oi->oid, &used_atom[i]));
+			break;
+		}
+		case ATOM_OBJECTNAME: {
+			if (deref)
+				v->s = xstrdup(do_grab_oid("objectname", &oi->oid, &used_atom[i]));
+			break;
+		}
+		default: {
+			break;
+		}
 		}
 	}
 }
@@ -1154,13 +1166,22 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob
 		enum atom_type atom_type = used_atom[i].atom_type;
 		struct atom_value *v = &val[i];
 		if (!!deref != used_atom[i].deref)
-			continue;
-		if (atom_type == ATOM_TAG)
+			break;
+		switch (atom_type) {
+		case ATOM_TAG:
 			v->s = xstrdup(tag->tag);
-		else if (atom_type == ATOM_TYPE && tag->tagged)
-			v->s = xstrdup(type_name(tag->tagged->type));
-		else if (atom_type == ATOM_OBJECT && tag->tagged)
-			v->s = xstrdup(oid_to_hex(&tag->tagged->oid));
+			break;
+		case ATOM_TYPE:
+			if (tag->tagged)
+				v->s = xstrdup(type_name(tag->tagged->type));
+			break;
+		case ATOM_OBJECT:
+			if (tag->tagged)
+				v->s = xstrdup(oid_to_hex(&tag->tagged->oid));
+			break;
+		default:
+			break;
+		}
 	}
 }
 
@@ -1175,15 +1196,17 @@ static void grab_commit_values(struct atom_value *val, int deref, struct object
 		struct atom_value *v = &val[i];
 		if (!!deref != used_atom[i].deref)
 			continue;
-		if (atom_type == ATOM_TREE) {
+		switch (atom_type) {
+		case ATOM_TREE: {
 			v->s = xstrdup(do_grab_oid("tree", get_commit_tree_oid(commit), &used_atom[i]));
-			continue;
+			break;
 		}
-		if (atom_type == ATOM_NUMPARENT) {
+		case ATOM_NUMPARENT: {
 			v->value = commit_list_count(commit->parents);
 			v->s = xstrfmt_len(&v->s_size, "%lu", (unsigned long)v->value);
+			break;
 		}
-		else if (atom_type == ATOM_PARENT) {
+		case ATOM_PARENT: {
 			struct commit_list *parents;
 			struct strbuf s = STRBUF_INIT;
 			for (parents = commit->parents; parents; parents = parents->next) {
@@ -1193,6 +1216,11 @@ static void grab_commit_values(struct atom_value *val, int deref, struct object
 				strbuf_addstr(&s, do_grab_oid("parent", oid, &used_atom[i]));
 			}
 			v->s = strbuf_detach(&s, NULL);
+			break;
+		}
+		default: {
+			break;
+		}
 		}
 	}
 }
@@ -1900,24 +1928,40 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
 		v->handler = append_atom;
 		v->atom = atom;
 
-		if (atom_type == ATOM_REFNAME)
+		switch (atom_type) {
+		case ATOM_REFNAME: {
 			refname = get_refname(atom, ref);
-		else if (atom_type == ATOM_WORKTREEPATH) {
+			if (!deref)
+				v->s = xstrdup(refname);
+			else
+				v->s = xstrfmt_len(&v->s_size, "%s^{}", refname);
+			free((char *)refname);
+			break;
+		}
+		case ATOM_WORKTREEPATH: {
 			if (ref->kind == FILTER_REFS_BRANCHES)
 				v->s = get_worktree_path(atom, ref);
 			else
 				v->s = ref_filter_slopbuf;
-			continue;
+			break;
 		}
-		else if (atom_type == ATOM_SYMREF)
+		case ATOM_SYMREF: {
 			refname = get_symref(atom, ref);
-		else if (atom_type == ATOM_UPSTREAM) {
+			if (!deref)
+				v->s = xstrdup(refname);
+			else
+				v->s = xstrfmt_len(&v->s_size, "%s^{}", refname);
+			if (refname != ref_filter_slopbuf)
+				free((char *)refname);
+			break;
+		}
+		case ATOM_UPSTREAM: {
 			const char *branch_name;
 			/* only local branches may have an upstream */
 			if (!skip_prefix(ref->refname, "refs/heads/",
 					 &branch_name)) {
 				v->s = ref_filter_slopbuf;
-				continue;
+			break;
 			}
 			branch = branch_get(branch_name);
 
@@ -1926,13 +1970,17 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
 				fill_remote_ref_details(atom, refname, branch, v);
 			else
 				v->s = ref_filter_slopbuf;
-			continue;
-		} else if (atom_type == ATOM_PUSH && atom->u.remote_ref.push) {
+			break;
+		}
+		case ATOM_PUSH: {
 			const char *branch_name;
+
+			if (!atom->u.remote_ref.push)
+				break;
 			v->s = ref_filter_slopbuf;
 			if (!skip_prefix(ref->refname, "refs/heads/",
 					 &branch_name))
-				continue;
+				break;
 			branch = branch_get(branch_name);
 
 			if (atom->u.remote_ref.push_remote)
@@ -1940,14 +1988,16 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
 			else {
 				refname = branch_get_push(branch, NULL);
 				if (!refname)
-					continue;
+					break;
 			}
 			fill_remote_ref_details(atom, refname, branch, v);
-			continue;
-		} else if (atom_type == ATOM_COLOR) {
+			break;
+		}
+		case ATOM_COLOR: {
 			v->s = xstrdup(atom->u.color);
 			continue;
-		} else if (atom_type == ATOM_FLAG) {
+		}
+		case ATOM_FLAG: {
 			char buf[256], *cp = buf;
 			if (ref->flag & REF_ISSYMREF)
 				cp = copy_advance(cp, ",symref");
@@ -1959,54 +2009,59 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
 				*cp = '\0';
 				v->s = xstrdup(buf + 1);
 			}
-			continue;
-		} else if (!deref && atom_type == ATOM_OBJECTNAME) {
-			   v->s = xstrdup(do_grab_oid("objectname", &ref->objectname, atom));
-			   continue;
-		} else if (atom_type == ATOM_HEAD) {
+			break;
+		}
+		case ATOM_OBJECTNAME: {
+			if (!deref)
+				v->s = xstrdup(do_grab_oid("objectname", &ref->objectname, atom));
+			break;
+		}
+		case ATOM_HEAD: {
 			if (atom->u.head && !strcmp(ref->refname, atom->u.head))
 				v->s = xstrdup("*");
 			else
 				v->s = xstrdup(" ");
-			continue;
-		} else if (atom_type == ATOM_ALIGN) {
+			break;
+		}
+		case ATOM_ALIGN: {
 			v->handler = align_atom_handler;
 			v->s = ref_filter_slopbuf;
-			continue;
-		} else if (atom_type == ATOM_END) {
+			break;
+		}
+		case ATOM_END: {
 			v->handler = end_atom_handler;
 			v->s = ref_filter_slopbuf;
-			continue;
-		} else if (atom_type == ATOM_IF) {
+			break;
+		}
+		case ATOM_IF: {
 			const char *s;
 			if (skip_prefix(name, "if:", &s))
 				v->s = xstrdup(s);
 			else
 				v->s = ref_filter_slopbuf;
 			v->handler = if_atom_handler;
-			continue;
-		} else if (atom_type == ATOM_THEN) {
+			break;
+		}
+		case ATOM_THEN: {
 			v->handler = then_atom_handler;
 			v->s = ref_filter_slopbuf;
-			continue;
-		} else if (atom_type == ATOM_ELSE) {
+			break;
+		}
+		case ATOM_ELSE: {
 			v->handler = else_atom_handler;
 			v->s = ref_filter_slopbuf;
-			continue;
-		} else if (atom_type == ATOM_REST) {
+			break;
+		}
+		case ATOM_REST: {
 			if (ref->rest)
 				v->s = xstrdup(ref->rest);
 			else
 				v->s = ref_filter_slopbuf;
-			continue;
-		} else
-			continue;
-
-		if (!deref)
-			v->s = xstrdup(refname);
-		else
-			v->s = xstrfmt_len(&v->s_size, "%s^{}", refname);
-		free((char *)refname);
+			break;
+		}
+		default:
+			break;
+		}
 	}
 
 	for (i = 0; i < used_atom_cnt; i++) {
-- 
gitgitgadget
Previous: ZheNing Hu via GitGitGadgetNext: ZheNing Hu via GitGitGadget
Message 26 of 28 in “[GSOC] [RFC] cat-file: reuse ref-filter logic”
  1. 00/27 [GSOC] [RFC] cat-file: reuse ref-filter logicZheNing Hu via GitGitGadget, Aug 13, 2021
  2. 02/27 [GSOC] ref-filter: add %(raw) atomZheNing Hu via GitGitGadget, Aug 13, 2021
  3. 01/27 [GSOC] ref-filter: add obj-type check in grab contentsZheNing Hu via GitGitGadget, Aug 13, 2021
  4. 03/27 [GSOC] ref-filter: --format=%(raw) support --perlZheNing Hu via GitGitGadget, Aug 13, 2021
  5. 04/27 [GSOC] ref-filter: use non-const ref_format in *_atom_parser()ZheNing Hu via GitGitGadget, Aug 13, 2021
  6. 07/27 [GSOC] ref-filter: introduce free_ref_array_item_value() functionZheNing Hu via GitGitGadget, Aug 13, 2021
  7. 05/27 [GSOC] ref-filter: add %(rest) atomZheNing Hu via GitGitGadget, Aug 13, 2021
  8. 06/27 [GSOC] ref-filter: pass get_object() return value to their callersZheNing Hu via GitGitGadget, Aug 13, 2021
  9. 08/27 [GSOC] ref-filter: add cat_file_mode to ref_formatZheNing Hu via GitGitGadget, Aug 13, 2021
  10. 10/27 [GSOC] cat-file: add has_object_file() checkZheNing Hu via GitGitGadget, Aug 13, 2021
  11. 09/27 [GSOC] ref-filter: modify the error message and value in get_objectZheNing Hu via GitGitGadget, Aug 13, 2021
  12. 11/27 [GSOC] cat-file: change batch_objects parameter nameZheNing Hu via GitGitGadget, Aug 13, 2021
  13. 12/27 [GSOC] cat-file: create p1006-cat-file.shZheNing Hu via GitGitGadget, Aug 13, 2021
  14. 13/27 [GSOC] cat-file: reuse ref-filter logicZheNing Hu via GitGitGadget, Aug 13, 2021
  15. 14/27 [GSOC] cat-file: reuse err buf in batch_object_write()ZheNing Hu via GitGitGadget, Aug 13, 2021
  16. 15/27 [GSOC] cat-file: re-implement --textconv, --filters optionsZheNing Hu via GitGitGadget, Aug 13, 2021
  17. 16/27 [GSOC] ref-filter: remove grab_oid() functionZheNing Hu via GitGitGadget, Aug 13, 2021
  18. 17/27 [GSOC] ref-filter: performance optimization by skip parse_object_bufferZheNing Hu via GitGitGadget, Aug 13, 2021
  19. 18/27 [GSOC] ref-filter: use atom_type and merge two for loop in grab_personZheNing Hu via GitGitGadget, Aug 13, 2021
  20. 19/27 [GSOC] ref-filter: remove strlen from find_subposZheNing Hu via GitGitGadget, Aug 13, 2021
  21. 20/27 [GSOC] ref-filter: introducing xstrvfmt_len() and xstrfmt_len()ZheNing Hu via GitGitGadget, Aug 13, 2021
  22. 21/27 [GSOC] ref-filter: remove second parsing in format_ref_array_itemZheNing Hu via GitGitGadget, Aug 13, 2021
  23. 22/27 [GSOC] ref-filter: introduction ref_filter_slopbufZheNing Hu via GitGitGadget, Aug 13, 2021
  24. 23/27 [GSOC] ref-filter: add deref member to struct used_atomZheNing Hu via GitGitGadget, Aug 13, 2021
  25. 24/27 [GSOC] ref-filter: introduce symref_atom_parser()ZheNing Hu via GitGitGadget, Aug 13, 2021
  26. 25/27 [GSOC] ref-filter: use switch case instread of if elseZheNing Hu via GitGitGadget, Aug 13, 2021
  27. 27/27 [GSOC] ref-filter: add need_get_object_info flag to struct expand_dataZheNing Hu via GitGitGadget, Aug 13, 2021
  28. 26/27 [GSOC] ref-filter: reuse finnal buffer if no stack needZheNing Hu via GitGitGadget, Aug 13, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.