+struct pxd_object *
+caseproto_save (const struct caseproto *proto, struct pxd *pxd)
+{
+ if (proto->pxd == NULL)
+ {
+ struct pxd_builder b;
+ size_t i;
+
+ pxd_builder_init (&b, pxd);
+
+ pxd_builder_put_size_t (&b, proto->n_widths);
+ for (i = 0; i < proto->n_widths; i++)
+ pxd_builder_put_s16 (&b, proto->widths[i]);
+
+ CONST_CAST (struct caseproto *, proto)->pxd = pxd_builder_commit (&b);
+ }
+ return pxd_object_ref (proto->pxd);
+}
+
+struct caseproto *
+caseproto_load (struct pxd_object *object, const struct pxd *pxd)
+{
+ struct caseproto *proto;
+ struct pxd_parser p;
+ size_t n, i;
+
+ pxd_parser_init (&p, object, pxd);
+
+ n = pxd_parser_get_size_t (&p);
+ proto = caseproto_reserve (caseproto_create (), n);
+
+ for (i = 0; i < n; i++)
+ proto = caseproto_add_width (proto, pxd_parser_get_s16 (&p));
+
+ pxd_parser_destroy (&p);
+
+ return proto;
+}
+