]> Untitled Git - axy/ft/pushswap.git/commitdiff
Fixes and moved typedefs for splitsort to header
author= <=>
Tue, 16 Dec 2025 12:22:41 +0000 (13:22 +0100)
committer= <=>
Tue, 16 Dec 2025 12:22:41 +0000 (13:22 +0100)
algorithm_splitsort.c
main_pushswap.c
op_output.c
ops_optimizer.c
splitsort.h [new file with mode: 0644]
splitsort_iter.c [new file with mode: 0644]

index f6fe542f8c04cd2f2a45276ddd4e8193066fff17..236e3cbfec0da5ccfd995e6507b91ad79638333e 100644 (file)
@@ -6,25 +6,11 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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;
index 6f7ba8993f8a2ef08ab5bfa6cd650dda73a41278..f8028e4d52d7cd1edc009f12224924758d9bfb1d 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: clefrere <clefrere@student.42.fr>          +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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));
 }
index ddfec2998ba6f4a3bc0963a45b8cfa71437b7da0..30569e407dc8df7a8a7cca3b63d80783ae314d10 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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);
 }
index 6181157b16e1c3e0d01a3d5d0579b148c65b2ab2..2daa66f967cc4d480137c028dc479100eec24f47 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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 (file)
index 0000000..29d67b2
--- /dev/null
@@ -0,0 +1,57 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   splitsort.h                                        :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   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 (file)
index 0000000..2b6e345
--- /dev/null
@@ -0,0 +1,13 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   splitsort_iter.c                                   :+:      :+:    :+:   */
+/*                                                    +:+ +:+         +:+     */
+/*   By: agilliar <marvin@42.fr>                    +#+  +:+       +#+        */
+/*                                                +#+#+#+#+#+   +#+           */
+/*   Created: 2025/12/16 12:57:22 by agilliar          #+#    #+#             */
+/*   Updated: 2025/12/16 12:57:29 by agilliar         ###   ########.fr       */
+/*                                                                            */
+/* ************************************************************************** */
+
+#include "splitsort.h"