aboutsummaryrefslogtreecommitdiff
path: root/nexgb/xgbgen/size.go
diff options
context:
space:
mode:
Diffstat (limited to 'nexgb/xgbgen/size.go')
-rw-r--r--nexgb/xgbgen/size.go31
1 files changed, 31 insertions, 0 deletions
diff --git a/nexgb/xgbgen/size.go b/nexgb/xgbgen/size.go
new file mode 100644
index 0000000..6e49371
--- /dev/null
+++ b/nexgb/xgbgen/size.go
@@ -0,0 +1,31 @@
+package main
+
+// Size corresponds to an expression that represents the number of bytes
+// in some *thing*. Generally, sizes are used to allocate buffers and to
+// inform X how big requests are.
+// Size is basically a thin layer over an Expression that yields easy methods
+// for adding and multiplying sizes.
+type Size struct {
+ Expression
+ exact bool
+}
+
+// newFixedSize creates a new Size with some fixed and known value.
+func newFixedSize(fixed uint, exact bool) Size {
+ return Size{&Value{v: int(fixed)}, exact}
+}
+
+// newExpressionSize creates a new Size with some expression.
+func newExpressionSize(variable Expression, exact bool) Size {
+ return Size{variable, exact}
+}
+
+// Add adds s1 and s2 and returns a new Size.
+func (s1 Size) Add(s2 Size) Size {
+ return Size{newBinaryOp("+", s1, s2), s1.exact && s2.exact}
+}
+
+// Multiply mupltiplies s1 and s2 and returns a new Size.
+func (s1 Size) Multiply(s2 Size) Size {
+ return Size{newBinaryOp("*", s1, s2), s1.exact && s2.exact}
+}