1 /** 2 * Copyright: Copyright (C) 2018 Gabriel Gheorghe, All Rights Reserved 3 * Authors: $(Gabriel Gheorghe) 4 * License: $(LINK2 https://www.gnu.org/licenses/gpl-3.0.txt, GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007) 5 * Source: $(LINK2 https://github.com/GabyForceQ/LibertyEngine/blob/master/source/liberty/math/traits.d) 6 * Documentation: 7 * Coverage: 8 **/ 9 module liberty.math.traits; 10 11 import liberty.math.matrix; 12 import liberty.math.quaternion; 13 import liberty.math.box; 14 import liberty.math.vector; 15 import liberty.math.shapes; 16 17 /** 18 * True if T is some kind of Vector. 19 **/ 20 enum isVector(T) = is(T : Vector!U, U...); 21 22 /** 23 * 24 **/ 25 unittest { 26 static assert(isVector!Vector2F); 27 static assert(isVector!Vector3I); 28 static assert(isVector!(Vector4!uint)); 29 static assert(!isVector!real); 30 } 31 32 /** 33 * The numeric type used to measure coordinates of a vector. 34 **/ 35 alias DimensionType(T : Vector!U, U...) = U[0]; 36 37 /** 38 * 39 **/ 40 unittest { 41 static assert(is(DimensionType!Vector2F == float)); 42 static assert(is(DimensionType!Vector3D == double)); 43 static assert(is(DimensionType!Vector4U == uint)); 44 } 45 46 /** 47 * 48 **/ 49 template isMatrixInstance(U) { 50 private static void isMatrix(T, int R, int C)(Matrix!(T, R, C) x) {} 51 enum bool isMatrixInstance = is(typeof(isMatrix(U.init))); 52 } 53 54 /** 55 * 56 **/ 57 template isQuaternionInstance(U) { 58 private static void isQuaternion(T)(Quaternion!T x) {} 59 enum bool isQuaternionInstance = is(typeof(isQuaternion(U.init))); 60 } 61 62 /** 63 * 64 **/ 65 alias DimensionType(T : Box!U, U...) = U[0]; 66 67 /** 68 * 69 **/ 70 unittest { 71 static assert(is(DimensionType!Box2F == float)); 72 static assert(is(DimensionType!Box3D == double)); 73 } 74 75 /** 76 * 77 **/ 78 enum isBox(T) = is(T : Box!U, U...); 79 80 /** 81 * 82 **/ 83 unittest { 84 static assert(isBox!Box2F); 85 static assert(isBox!Box3I); 86 static assert(isBox!(Box!(double, 2))); 87 static assert(!isBox!(Vector!(float, 3))); 88 } 89 90 /** 91 * 92 **/ 93 enum isSegment(T) = is(T : Segment!U, U...); 94 95 /** 96 * 97 **/ 98 enum isTriangle(T) = is(T : Triangle!U, U...); 99 100 /** 101 * 102 **/ 103 enum isSphere(T) = is(T : Sphere!U, U...); 104 105 /** 106 * 107 **/ 108 enum isRay(T) = is(T : Ray!U, U...); 109 110 /** 111 * 112 **/ 113 enum isPlane(T) = is(T : Plane!U, U); 114 115 /** 116 * 117 **/ 118 enum isFrustum(T) = is(T : Frustum!U, U); 119 120 /** 121 * 122 **/ 123 enum isSegment2D(T) = is(T : Segment!(U, 2), U); 124 125 /** 126 * 127 **/ 128 enum isTriangle2D(T) = is(T : Triangle!(U, 2), U); 129 130 /** 131 * 132 **/ 133 enum isSphere2D(T) = is(T : Sphere!(U, 2), U); 134 135 /** 136 * 137 **/ 138 enum isRay2D(T) = is(T : Ray!(U, 2), U); 139 140 /** 141 * 142 **/ 143 enum isSegment3D(T) = is(T : Segment!(U, 3), U); 144 145 /** 146 * 147 **/ 148 enum isTriangle3D(T) = is(T : Triangle!(U, 3), U); 149 150 /** 151 * 152 **/ 153 enum isSphere3D(T) = is(T : Sphere!(U, 3), U); 154 155 /** 156 * 157 **/ 158 enum isRay3D(T) = is(T : Ray!(U, 3), U); 159 160 /** 161 * 162 **/ 163 alias DimensionType(T : Segment!U, U...) = U[0]; 164 165 /** 166 * 167 **/ 168 alias DimensionType(T : Triangle!U, U...) = U[0]; 169 170 /** 171 * 172 **/ 173 alias DimensionType(T : Sphere!U, U...) = U[0]; 174 175 /** 176 * 177 **/ 178 alias DimensionType(T : Ray!U, U...) = U[0]; 179 180 /** 181 * 182 **/ 183 alias DimensionType(T : Plane!U, U) = U; 184 185 /** 186 * 187 **/ 188 alias DimensionType(T : Frustum!U, U) = U; 189 190 /** 191 * 192 **/ 193 unittest { 194 static assert(is(DimensionType!Segment2I == int)); 195 static assert(is(DimensionType!Triangle3F == float)); 196 static assert(is(DimensionType!Sphere2D == double)); 197 static assert(is(DimensionType!Ray3F == float)); 198 static assert(is(DimensionType!PlaneD == double)); 199 static assert(is(DimensionType!(Frustum!float) == float)); 200 }