]> git.seodisparate.com - RockPaperScissorsDuel/commitdiff
Use std::function instead of pointer to avoid ub
authorStephen Seo <seo.disparate@gmail.com>
Mon, 23 Jan 2023 05:44:40 +0000 (14:44 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Mon, 23 Jan 2023 05:44:40 +0000 (14:44 +0900)
src/3d/anims.cc
src/3d/anims.h

index e9ef0b7a2cb33f9efa9ea92bbbd8de2bcbb164a2..79de7e9ed5b190f9a283a058a8be08c77c51b4a1 100644 (file)
@@ -5,7 +5,7 @@ Anims::Anims(Model *model, A3F pos, A4C color)
       color(color),
       model(model),
       userdata(nullptr),
-      function_ptr(nullptr),
+      function(std::nullopt),
       is_done_finished(false) {}
 
 bool Anims::is_done() {
@@ -14,8 +14,8 @@ bool Anims::is_done() {
   }
   bool result = is_done_impl();
   if (result) {
-    if (function_ptr) {
-      function_ptr(userdata);
+    if (function.has_value()) {
+      function.value()(userdata);
     }
     is_done_finished = true;
   }
@@ -26,5 +26,5 @@ void Anims::reset_is_done() { is_done_finished = false; }
 
 void Anims::set_end_callback(Anims::FP fp, void *ud) {
   userdata = ud;
-  function_ptr = fp;
+  function = fp;
 }
index 4af1c7a0b795715b25616dfca1a021a390716bb1..53540f72c1c51deb55b2d97b585e97db518ad986 100644 (file)
@@ -2,7 +2,9 @@
 #define ROCK_PAPER_SCISSORS_DUEL_3D_ANIMS_H_
 
 // standard library includes
+#include <functional>
 #include <memory>
+#include <optional>
 
 // local includes
 #include "arrays.h"
@@ -15,7 +17,7 @@ class Anims {
   using UPtr = std::unique_ptr<Anims>;
   using SPtr = std::shared_ptr<Anims>;
 
-  using FP = void (*)(void *);
+  using FP = std::function<void(void *)>;
 
   Anims(Model *model, A3F pos, A4C color);
   virtual ~Anims() {}
@@ -26,7 +28,7 @@ class Anims {
   virtual void do_update(float dt) = 0;
   virtual void do_draw() = 0;
 
-  void set_end_callback(FP function_ptr, void *ud);
+  void set_end_callback(FP function, void *ud);
 
  protected:
   virtual bool is_done_impl() = 0;
@@ -35,7 +37,7 @@ class Anims {
   A4C color;
   Model *model;
   void *userdata;
-  FP function_ptr;
+  std::optional<FP> function;
   bool is_done_finished;
 };