ソースを参照

Merge pull request #2 from locriacyber/master

Add += operator and alike for vectors
Steven Schveighoffer 3 年 前
コミット
6c09d906bb
1 ファイル変更20 行追加0 行削除
  1. 20 0
      source/raymathext.d

+ 20 - 0
source/raymathext.d

@@ -137,6 +137,13 @@ mixin template Linear()
             enum fragment = [FieldNameTuple!T].map!(field => field ~ op ~ "rhs." ~ field).join(",");
             return mixin("T(" ~ fragment ~ ")");
         }
+
+        ref T opOpAssign(string op)(inout T rhs) if (["+", "-"].canFind(op))
+        {
+            static foreach (field; [FieldNameTuple!T])
+                mixin(field ~ op ~ "= rhs." ~ field ~ ";");
+            return this;
+        }
     }
 
     inout T opBinary(string op)(inout float rhs) if (["+", "-", "*", "/"].canFind(op))
@@ -150,6 +157,13 @@ mixin template Linear()
         enum fragment = [FieldNameTuple!T].map!(field => "lhs" ~ op ~ field).join(",");
         return mixin("T(" ~ fragment ~ ")");
     }
+
+    ref T opOpAssign(string op)(inout float rhs) if (["+", "-", "*", "/"].canFind(op))
+    {
+        static foreach (field; [FieldNameTuple!T])
+            mixin(field ~ op ~ "= rhs;");
+        return this;
+    }
 }
 
 unittest
@@ -163,6 +177,12 @@ unittest
     Assert.equal(c, Vector3(4, 6, 18));
     Assert.equal(4.0f - Vector2.zero, Vector2(4, 4));
     Assert.equal(Vector2.one - 3.0f, Vector2(-2, -2));
+    a += 5;
+    Assert.equal(a, Vector3(6, 7, 14));
+    a *= 0.5;
+    Assert.equal(a, Vector3(3, 3.5, 7));
+    a += Vector3(3, 2.5, -1);
+    Assert.equal(a, Vector3(6, 6, 6));
 }
 
 import std.traits : FieldNameTuple;