| 2 | |
| 3 | |
| 4 | class Swizzler: |
| 5 | def __init__(self, swiz, vecName="GenericVector"): |
| 6 | self.swiz = "".join(swiz) |
| 7 | self.vec_name = vecName |
| 8 | |
| 9 | def getter_definition(self): |
| 10 | # "LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE GenericVector<Scalar, 2> xy() const;" |
| 11 | return f"LIBRAPID_NODISCARD LIBRAPID_ALWAYS_INLINE {self.vec_name}<Scalar, {len(self.swiz)}> {self.swiz}() const;" |
| 12 | |
| 13 | def setter_definition(self): |
| 14 | # "LIBRAPID_ALWAYS_INLINE void xy(const GenericVector<Scalar, 2> &v);" |
| 15 | return f"LIBRAPID_ALWAYS_INLINE void {self.swiz}(const {self.vec_name}<Scalar, {len(self.swiz)}> &v);" |
| 16 | |
| 17 | def getter_implementation(self): |
| 18 | """ |
| 19 | template<typename Scalar, int64_t Dims> |
| 20 | auto GenericVector<Scalar, Dims>::xy() const -> GenericVector<Scalar, 2> { |
| 21 | return {x(), y()}; |
| 22 | } |
| 23 | """ |
| 24 | |
| 25 | params = ", ".join([x + "()" for x in self.swiz]) |
| 26 | return f"template<typename Scalar, int64_t Dims>\nauto {self.vec_name}<Scalar, Dims>::{self.swiz}() const -> {self.vec_name}<Scalar, {len(self.swiz)}> {{\n return {{{params}}};\n}}" |
| 27 | |
| 28 | def setter_implementation(self): |
| 29 | """ |
| 30 | template<typename Scalar, int64_t Dims> |
| 31 | void GenericVector<Scalar, Dims>::xy(const GenericVector<Scalar, 2> &v) { |
| 32 | x(v.x()); |
| 33 | y(v.y()); |
| 34 | } |
| 35 | """ |
| 36 | |
| 37 | assignments = "" |
| 38 | for a, b in zip(self.swiz, list("xyzw")): |
| 39 | assignments += f"{a}(v.{b}());\n" |
| 40 | return f"template<typename Scalar, int64_t Dims>\nvoid {self.vec_name}<Scalar, Dims>::{self.swiz}(const {self.vec_name}<Scalar, {len(self.swiz)}> &v) {{\n{assignments}}}" |
| 41 | |
| 42 | def test_getter(self): |
| 43 | """ |
| 44 | REQUIRE(testC.xy() == lrc::Vec2d(1, 2)); |
| 45 | """ |
| 46 | tmpArgs = {"x": "1", "y": "2", "z": "3", "w": "4"} |
| 47 | return f"REQUIRE(testC.{self.swiz}() == lrc::Vec{len(self.swiz)}d({', '.join([tmpArgs[v] for v in self.swiz])}));" |
| 48 | |
| 49 | def test_setter(self): |
| 50 | """ |
| 51 | testC.xy(lrc::Vec2d(1, 2)); |
| 52 | REQUIRE(testC.x() == 1); |
| 53 | REQUIRE(testC.y() == 2); |
| 54 | """ |
| 55 | tmpArgs = {"x": "1", "y": "2", "z": "3", "w": "4"} |
| 56 | return f"testC.{self.swiz}(lrc::Vec{len(self.swiz)}d({', '.join([tmpArgs[v] for v in self.swiz])}));\n" + "\n".join( |
| 57 | [f"REQUIRE(testC.{v}() == {tmpArgs[v]});" for v in self.swiz]) |
| 58 | |
| 59 | |
| 60 | to_swizzle = ["xy", "xz", "yz", "xyz", "xyw", "xzw", "yzw", "xyzw"] |