end
-- fn prefixes
+local struct_prefix = "__attribute__((packed)) "
local export_prefix = ""
local local_prefix = "__attribute__((unused)) static inline "
typedef struct {
size_t siz;
unsigned char *data;
-} Blob;
+} ]] .. struct_prefix .. [[Blob;
]]
)
-- numeric types
+local numeric_types = {}
+
local function emit_vector(type, l)
local name = "v" .. l .. type
local box = "aabb" .. l .. type
existing_types[box] = true
has_deallocator[box] = false
- local typedef, equals, add, clamp, cmp, scale, mix, write, read, send, recv =
- "", "", "", "", "", "", "", "", "", "", ""
-
- typedef = typedef .. "\t" .. type .. " "
- equals = equals .. "\treturn "
- add = add .. "\treturn (" .. name .. ") {"
- clamp = clamp .. "\treturn (" .. name .. ") {"
- cmp = cmp .. "\tint i;\n"
- scale = scale .. "\treturn (" .. name .. ") {"
- mix = mix .. "\treturn (" .. name .. ") {"
+ local typedef, equals, add, sub, clamp, cmp, scale, mix, write, read, send, recv =
+ "", "", "", "", "", "", "", "", "", "", "", ""
for i, c in ipairs(vector_components[l]) do
local last = i == l
or ", "
)
+ sub = sub
+ .. "a." .. c .. " - "
+ .. "b." .. c ..
+ (last
+ and "};\n"
+ or ", "
+ )
+
clamp = clamp
.. type .. "_clamp("
.. "val." .. c .. ", "
.. "\tif (!" .. type .. "_recv(peer, &val->" .. c .. "))\n\t\treturn false;\n"
end
- emit_h("typedef struct {\n" .. typedef .. "} " .. name .. ";\n")
+ emit_h("typedef struct {\n\t" .. type .. " " .. typedef .. "} " .. struct_prefix .. name .. ";\n")
- emit(export_prefix .. "bool " .. name .. "_equals(" .. name .. " a, " .. name .. " b)", "{\n" .. equals .. "}\n\n")
- emit(export_prefix .. name .. " " .. name .. "_add(" .. name .. " a, " .. name .. " b)", "{\n" .. add .. "}\n\n")
- emit(export_prefix .. name .. " " .. name .. "_clamp(" .. name .. " val, " .. name .. " min, " .. name .. " max)", "{\n" .. clamp .. "}\n\n")
- emit(export_prefix .. "int " .. name .. "_cmp(const void *a, const void *b)", "{\n" .. cmp .. "\treturn 0;\n}\n\n")
- emit(export_prefix .. name .. " " .. name .. "_scale(" .. name .. " v, " .. type .. " s)", "{\n" .. scale .. "}\n\n")
+ emit(export_prefix .. "bool " .. name .. "_equals(" .. name .. " a, " .. name .. " b)", "{\n\treturn " .. equals .. "}\n\n")
+ emit(export_prefix .. name .. " " .. name .. "_add(" .. name .. " a, " .. name .. " b)", "{\n\treturn (" .. name .. ") {" .. add .. "}\n\n")
+ emit(export_prefix .. name .. " " .. name .. "_sub(" .. name .. " a, " .. name .. " b)", "{\n\treturn (" .. name .. ") {" .. add .. "}\n\n")
+ emit(export_prefix .. name .. " " .. name .. "_clamp(" .. name .. " val, " .. name .. " min, " .. name .. " max)", "{\n\treturn (" .. name .. ") {" .. clamp .. "}\n\n")
+ emit(export_prefix .. "int " .. name .. "_cmp(const void *a, const void *b)", "{\n\tint i;\n" .. cmp .. "\treturn 0;\n}\n\n")
+ emit(export_prefix .. name .. " " .. name .. "_scale(" .. name .. " v, " .. type .. " s)", "{\n\treturn (" .. name .. ") {" .. scale .. "}\n\n")
if type:sub(1, 1) == "f" then
- emit(export_prefix .. name .. " " .. name .. "_mix(" .. name .. " a, " .. name .. " b, " .. type .. " f)", "{\n" .. mix .. "}\n\n")
+ emit(export_prefix .. name .. " " .. name .. "_mix(" .. name .. " a, " .. name .. " b, " .. type .. " f)", "{\n\treturn (" .. name .. ") {" .. mix .. "}\n\n")
end
emit(export_prefix .. "void " .. name .. "_write(Blob *buffer, " .. name .. " *val)", "{\n" .. write .. "}\n\n")
emit_h("\n")
- emit_h("typedef struct {\n\t" .. name .. " min, max;\n} " .. box .. ";\n")
+ emit_h("typedef struct {\n\t" .. name .. " min, max;\n} " .. struct_prefix .. box .. ";\n")
emit(export_prefix .. "void " .. box .. "_write(Blob *buffer, " .. box .. " *val)", "{\n\t" .. name .. "_write(buffer, &val->min);\n\t" .. name .. "_write(buffer, &val->max);\n}\n\n")
emit(export_prefix .. "bool " .. box .. "_read(Blob *buffer, " .. box .. " *val)", "{\n\tif (!" .. name .. "_read(buffer, &val->min))\n\t\treturn false;\n\tif (!" .. name .. "_read(buffer, &val->max))\n\t\treturn false;\n\treturn true;\n}\n\n")
local function emit_numeric(class, bits, alias)
local name = class .. bits
+ table.insert(numeric_types, name)
existing_types[name] = true
has_deallocator[name] = false
end
end
+local converters = {}
+
+for l = 2, 4 do
+ converters[l] = ""
+
+ for i, c in ipairs(vector_components[l]) do
+ converters[l] = converters[l]
+ .. "v." .. c ..
+ ((i == l)
+ and "};\n"
+ or ", "
+ )
+ end
+end
+
+for _, from in ipairs(numeric_types) do
+ for _, to in ipairs(numeric_types) do
+ if from ~= to then
+ for i = 2, 4 do
+ local v_from = "v" .. i .. from
+ local v_to = "v" .. i .. to
+
+ emit(export_prefix .. v_to .. " " .. v_from .. "_to_" .. to .. "(" .. v_from .. " v)", "{\n\treturn (" .. v_to .. ") {" .. converters[i] .. "}\n\n")
+ end
+ end
+ end
+end
+
+emit_h("\n")
+
-- string
existing_types.String = true
) .. ")\n" .. indent .. "\treturn false;\n"
end
- emit_h("typedef struct {\n" .. typedef .. "} " .. t.name .. ";\n")
+ emit_h("typedef struct {\n" .. typedef .. "} " .. struct_prefix .. t.name .. ";\n")
if has_deallocator[t.name] then
emit(export_prefix .. "void " .. t.name .. "_free(" .. t.name .. " *val)", "{\n" .. free .. "}\n\n")