OSDN Git Service

[Refactor] #4155 enum class SortKind を作り、関数ポインタをなくした
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 25 May 2024 13:31:55 +0000 (22:31 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sun, 26 May 2024 01:22:49 +0000 (10:22 +0900)
src/target/grid-selector.cpp
src/target/target-preparation.cpp
src/util/sort.cpp
src/util/sort.h

index 344afc2..f697804 100644 (file)
@@ -82,7 +82,7 @@ static void tgt_pt_prepare(PlayerType *player_ptr, std::vector<POSITION> &ys, st
         }
     }
 
-    ang_sort(player_ptr, ys, xs, size(ys), ang_sort_comp_distance);
+    ang_sort(player_ptr, ys, xs, SortKind::DISTANCE);
 }
 
 /*!
index f50f118..ced2a67 100644 (file)
@@ -162,9 +162,9 @@ void target_set_prepare(PlayerType *player_ptr, std::vector<POSITION> &ys, std::
     }
 
     if (mode & (TARGET_KILL)) {
-        ang_sort(player_ptr, ys, xs, size(ys), ang_sort_comp_distance);
+        ang_sort(player_ptr, ys, xs, SortKind::DISTANCE);
     } else {
-        ang_sort(player_ptr, ys, xs, size(ys), ang_sort_comp_importance);
+        ang_sort(player_ptr, ys, xs, SortKind::IMPORTANCE);
     }
 
     // 乗っているモンスターがターゲットリストの先頭にならないようにする調整。
index 45fc005..2ccd1f1 100644 (file)
@@ -22,7 +22,7 @@
  * @param ang_sort_comp 比較用の関数ポインタ
  * @param ang_sort_swap スワップ用の関数ポインタ
  */
-static void exe_ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, int p, int q, bool (*ang_sort_comp)(PlayerType *, std::vector<int> &, std::vector<int> &, int, int))
+static void exe_ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, int p, int q, SortKind kind)
 {
     if (p >= q) {
         return;
@@ -33,14 +33,42 @@ static void exe_ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vect
     int b = q;
     while (true) {
         /* Slide i2 */
-        while (!(*ang_sort_comp)(player_ptr, ys, xs, b, z)) {
-            b--;
-        }
+        auto is_less_i2 = false;
+        do {
+            switch (kind) {
+            case SortKind::DISTANCE:
+                is_less_i2 = ang_sort_comp_distance(player_ptr, ys, xs, b, z);
+                break;
+            case SortKind::IMPORTANCE:
+                is_less_i2 = ang_sort_comp_importance(player_ptr, ys, xs, b, z);
+                break;
+            default:
+                THROW_EXCEPTION(std::logic_error, "Invalid Sort Kind was specified!");
+            }
+
+            if (!is_less_i2) {
+                b--;
+            }
+        } while (!is_less_i2);
 
         /* Slide i1 */
-        while (!(*ang_sort_comp)(player_ptr, ys, xs, z, a)) {
-            a++;
-        }
+        auto is_less_i1 = false;
+        do {
+            switch (kind) {
+            case SortKind::DISTANCE:
+                is_less_i1 = ang_sort_comp_distance(player_ptr, ys, xs, z, a);
+                break;
+            case SortKind::IMPORTANCE:
+                is_less_i1 = ang_sort_comp_importance(player_ptr, ys, xs, z, a);
+                break;
+            default:
+                THROW_EXCEPTION(std::logic_error, "Invalid Sort Kind was specified!");
+            }
+
+            if (!is_less_i1) {
+                a++;
+            }
+        } while (!is_less_i1);
 
         if (a >= b) {
             break;
@@ -52,10 +80,10 @@ static void exe_ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vect
     }
 
     /* Recurse left side */
-    exe_ang_sort(player_ptr, ys, xs, p, b, ang_sort_comp);
+    exe_ang_sort(player_ptr, ys, xs, p, b, kind);
 
     /* Recurse right side */
-    exe_ang_sort(player_ptr, ys, xs, b + 1, q, ang_sort_comp);
+    exe_ang_sort(player_ptr, ys, xs, b + 1, q, kind);
 }
 
 /*
@@ -67,9 +95,9 @@ static void exe_ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vect
  * @param ang_sort_comp 比較用の関数ポインタ
  * @param ang_sort_swap スワップ用の関数ポインタ
  */
-void ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, int n, bool (*ang_sort_comp)(PlayerType *, std::vector<int> &, std::vector<int> &, int, int))
+void ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, SortKind kind)
 {
-    exe_ang_sort(player_ptr, ys, xs, 0, n - 1, ang_sort_comp);
+    exe_ang_sort(player_ptr, ys, xs, 0, std::ssize(ys) - 1, kind);
 }
 
 /*
index d29a773..bfdeafe 100644 (file)
@@ -2,7 +2,12 @@
 
 #include <vector>
 
+enum class SortKind {
+    DISTANCE,
+    IMPORTANCE,
+};
+
 class PlayerType;
-void ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, int n, bool (*ang_sort_comp)(PlayerType *, std::vector<int> &, std::vector<int> &, int, int));
+void ang_sort(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, SortKind kind);
 bool ang_sort_comp_distance(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, int a, int b);
 bool ang_sort_comp_importance(PlayerType *player_ptr, std::vector<int> &ys, std::vector<int> &xs, int a, int b);