==> 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}