MCPcopy Create free account
hub / github.com/LibRapid/librapid / Swizzler

Class Swizzler

scripts/vecSwizzle.py:4–57  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2
3
4class 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
60to_swizzle = ["xy", "xz", "yz", "xyz", "xyw", "xzw", "yzw", "xyzw"]

Callers 1

vecSwizzle.pyFile · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected