skip to content
==> src/place_spec.c <==
1/* manifest.rs Place: region arithmetic. */
2#include "mesh/place_spec.h"
3#include "mesh/mt.h"
4
5#include <stdlib.h>
6#include <string.h>
7
8static mps_region *copy(const mps_region *r, size_t n) {
9    mps_region *c = mt_alloc((n ? n : 1) * sizeof *c);
10    if (n) memcpy(c, r, n * sizeof *c);
11    return c;
12}
13
14mps_spec mps_new(uint32_t cap, const mps_region *state, size_t nstate, uint32_t frame, const mps_region *out, size_t nout, uint32_t show, uint32_t fanout) {
15    return (mps_spec){cap, copy(state, nstate), nstate, frame, copy(out, nout), nout, show, fanout};
16}
17
18mps_spec mps_clone(const mps_spec *s) { return mps_new(s->cap, s->state, s->nstate, s->frame, s->out, s->nout, s->show, s->fanout); }
19
20void mps_free(mps_spec *s) {
21    free(s->state);
22    free(s->out);
23    *s = (mps_spec){0};
24}
25
26size_t mps_state_bytes(const mps_spec *s) {
27    size_t n = 0;
28    for (size_t i = 0; i < s->nstate; i++) n += s->state[i].len;
29    return n;
30}
31
32uint32_t mps_out_bytes(const mps_spec *s) {
33    uint32_t n = 0;
34    for (size_t i = 0; i < s->nout; i++) n += s->out[i].len;
35    return n;
36}
37
38size_t mps_part_bytes(const mps_spec *s) { return (size_t)(mps_out_bytes(s) / s->fanout); }
39
40void mps_part(const mps_spec *s, uint32_t b, mps_region *out) {
41    for (size_t i = 0; i < s->nout; i++) {
42        uint32_t n = s->out[i].len / s->fanout;
43        out[i] = (mps_region){s->out[i].off + b * n, n};
44    }
45}
46
47void mps_part_in_buffer(const mps_spec *s, uint32_t b, mps_region *out) {
48    uint32_t at = 0;
49    for (size_t i = 0; i < s->nout; i++) {
50        uint32_t n = s->out[i].len / s->fanout;
51        out[i] = (mps_region){at + b * n, n};
52        at += s->out[i].len;
53    }
54}