From: = <=> Date: Tue, 16 Dec 2025 12:22:41 +0000 (+0100) Subject: Fixes and moved typedefs for splitsort to header X-Git-Url: https://git.uwuaxy.net/?a=commitdiff_plain;h=a7f37d542d31d11d5a1f6c6f098ef897a4f8cb92;p=axy%2Fft%2Fpushswap.git Fixes and moved typedefs for splitsort to header --- diff --git a/algorithm_splitsort.c b/algorithm_splitsort.c index f6fe542..236e3cb 100644 --- a/algorithm_splitsort.c +++ b/algorithm_splitsort.c @@ -6,25 +6,11 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/11 12:45:16 by agilliar #+# #+# */ -/* Updated: 2025/12/16 01:54:24 by agilliar ### ########.fr */ +/* Updated: 2025/12/16 12:55:57 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ -#include "pushswap.h" - -typedef struct s_splitsort -{ - const t_stacks *stacks; - t_closure cb; - size_t blocks; -} t_splitsort; - -typedef struct s_iter -{ - t_list range; - size_t blocks; - bool rev; -} t_iter; +#include "splitsort.h" static t_iter iter_new(t_list range, size_t blocks, bool rev) { @@ -83,22 +69,12 @@ static t_iter iter_splitoff(t_iter *self, size_t n) return (res); } -typedef struct s_part -{ - t_list top; - t_list bottom; - bool rev; - bool mirror; -} t_part; - static void splitsort_part_once(t_part self, t_splitsort sort, size_t count) { const t_stack *src; t_psval val; - size_t rb; src = stacks_geta(sort.stacks, self.mirror); - rb = 0; while (count--) { if (self.rev) @@ -107,28 +83,15 @@ static void splitsort_part_once(t_part self, t_splitsort sort, size_t count) if (list_get_sorted(self.top, val) != -1) { closure_callm(sort.cb, OP_PB, self.mirror); - rb++; - continue ; - } - while (rb--) closure_callm(sort.cb, OP_RB, self.mirror); - rb = 0; - if (list_get_sorted(self.bottom, val) != -1) + } + else if (list_get_sorted(self.bottom, val) != -1) closure_callm(sort.cb, OP_PB, self.mirror); else if (!self.rev) closure_callm(sort.cb, OP_RA, self.mirror); } - while (rb--) - closure_callm(sort.cb, OP_RB, self.mirror); } -typedef enum e_mode -{ - MODE_A, - MODE_A_WRAP, - MODE_B, -} t_mode; - static void splitsort_part(t_splitsort sort, t_list range, t_mode mode) { t_iter topi; @@ -178,7 +141,6 @@ void splitsort_final_simple(t_splitsort sort, t_list range) leaf_top_b_a(sort.stacks, sort.cb, range.len); } - // Parts range elements from stack a (which is in ascending order) onto stack b // in descending order static void splitsort_part_a(t_splitsort sort, t_list range) @@ -200,8 +162,6 @@ static void splitsort_part_b(t_splitsort sort, t_list range) splitsort_part(sort, range, MODE_B); } -typedef void (t_layer_func) (t_splitsort, t_list); - static t_layer_func *layer_from_info(size_t depth, size_t blocks, size_t len) { size_t i; @@ -222,14 +182,6 @@ static t_layer_func *layer_from_info(size_t depth, size_t blocks, size_t len) return (&splitsort_part_b); } -typedef struct s_visit -{ - t_list range; - size_t depth; - t_layer_func *cb; - bool rev; -} t_visit; - static void splitsort_visit_layer(t_visit self, t_splitsort sort) { t_iter iter; diff --git a/main_pushswap.c b/main_pushswap.c index 6f7ba89..f8028e4 100644 --- a/main_pushswap.c +++ b/main_pushswap.c @@ -6,7 +6,7 @@ /* By: clefrere +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/02 22:15:12 by agilliar #+# #+# */ -/* Updated: 2025/12/11 19:22:20 by agilliar ### ########.fr */ +/* Updated: 2025/12/16 13:03:28 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,23 +49,17 @@ int main(int argc, char **argv) t_args args; t_ops ops; t_optimizer opt; + int i; args.state = stacks_new(); args.bench = false; args.algo = NULL; - for (int i = 1; i < argc; i++) - arg_step(argv[i], &args); - output_str("\na:\n"); - stack_output(args.state.a); - output_str("\nb:\n"); - stack_output(args.state.b); + i = 1; + while (i < argc) + arg_step(argv[i++], &args); ops = ops_compose(ops_stackops(), ops_optimizer(ops_output(), &opt)); stacks_apply(&args.state, &ops, args.algo); ops_optimizer_commit(&opt, &args.state); - output_str("\na:\n"); - stack_output(args.state.a); - output_str("\nb:\n"); - stack_output(args.state.b); output_flush(); cheatexit(!stacks_is_solved(&args.state)); } diff --git a/op_output.c b/op_output.c index ddfec29..30569e4 100644 --- a/op_output.c +++ b/op_output.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/03 12:28:28 by agilliar #+# #+# */ -/* Updated: 2025/12/08 18:40:54 by agilliar ### ########.fr */ +/* Updated: 2025/12/16 12:48:13 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,8 +20,8 @@ static void op_output_inner(const char *data, t_stack *stack) t_closure op_output(t_op op) { - t_closure res; - static char *ops[11] = { + t_closure res; + const char *const ops[11] = { "sa", "sb", "ss", @@ -35,7 +35,7 @@ t_closure op_output(t_op op) "rrr", }; - res.data = ops[op]; + res.data = (void *) ops[op]; res.func = &op_output_inner; return (res); } diff --git a/ops_optimizer.c b/ops_optimizer.c index 6181157..2daa66f 100644 --- a/ops_optimizer.c +++ b/ops_optimizer.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/12/08 17:54:20 by agilliar #+# #+# */ -/* Updated: 2025/12/15 17:21:43 by agilliar ### ########.fr */ +/* Updated: 2025/12/16 13:11:01 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -72,15 +72,20 @@ static void ops_optimizer_commit_end(t_optimizer *data, t_stacks *stacks) int64_t *counter; cb = data->commit.ops[OP_RA]; - if (data->b > 0) - cb = data->commit.ops[OP_RB]; if (data->a < 0) cb = data->commit.ops[OP_RRA]; + counter = &data->a; + if (*counter > 0) + *counter *= -1; + while (*counter != 0) + { + (cb.func)(cb.data, stacks); + (*counter)++; + } + cb = data->commit.ops[OP_RB]; if (data->b < 0) cb = data->commit.ops[OP_RRB]; - counter = &data->a; - if (data->b != 0) - counter = &data->b; + counter = &data->b; if (*counter > 0) *counter *= -1; while (*counter != 0) @@ -95,10 +100,18 @@ void ops_optimizer_commit(t_optimizer *data, t_stacks *stacks) t_closure cb; cb = data->commit.ops[OP_RR]; - while (data->a > 0 && data->b > 0 && data->a-- && data->b--) + while (data->a > 0 && data->b > 0) + { + data->a--; + data->b--; (cb.func)(cb.data, stacks); + } cb = data->commit.ops[OP_RRR]; - while (data->a < 0 && data->b < 0 && data->a++ && data->b++) + while (data->a < 0 && data->b < 0) + { + data->a++; + data->b++; (cb.func)(cb.data, stacks); + } ops_optimizer_commit_end(data, stacks); } diff --git a/splitsort.h b/splitsort.h new file mode 100644 index 0000000..29d67b2 --- /dev/null +++ b/splitsort.h @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* splitsort.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/12/16 12:54:11 by agilliar #+# #+# */ +/* Updated: 2025/12/16 12:56:36 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SPLITSORT_H +# define SPLITSORT_H + +# include "pushswap.h" + +typedef struct s_splitsort +{ + const t_stacks *stacks; + t_closure cb; + size_t blocks; +} t_splitsort; + +typedef struct s_iter +{ + t_list range; + size_t blocks; + bool rev; +} t_iter; + +typedef struct s_part +{ + t_list top; + t_list bottom; + bool rev; + bool mirror; +} t_part; + +typedef enum e_mode +{ + MODE_A, + MODE_A_WRAP, + MODE_B, +} t_mode; + +typedef void (t_layer_func) (t_splitsort, t_list); + +typedef struct s_visit +{ + t_list range; + size_t depth; + t_layer_func *cb; + bool rev; +} t_visit; + +#endif diff --git a/splitsort_iter.c b/splitsort_iter.c new file mode 100644 index 0000000..2b6e345 --- /dev/null +++ b/splitsort_iter.c @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* splitsort_iter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/12/16 12:57:22 by agilliar #+# #+# */ +/* Updated: 2025/12/16 12:57:29 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "splitsort.h"