11#ifndef ASRT_COLLECT_PROTO_H
12#define ASRT_COLLECT_PROTO_H
19#include "./flat_tree.h"
22enum asrt_collect_message_id_e
24 ASRT_COLLECT_MSG_READY = 0x01,
25 ASRT_COLLECT_MSG_READY_ACK = 0x02,
26 ASRT_COLLECT_MSG_APPEND = 0x03,
27 ASRT_COLLECT_MSG_ERROR = 0x04,
29typedef uint8_t asrt_collect_message_id;
32#define ASRT_COLLECT_NONE_ID ( (asrt_flat_id) 0 )
34enum asrt_collect_err_e
36 ASRT_COLLECT_ERR_NONE = 0x00,
37 ASRT_COLLECT_ERR_APPEND_FAILED = 0x01,
40typedef enum asrt_status ( *asrt_collect_msg_callback )(
void* ptr,
struct asrt_span* buff );
42static inline struct asrt_send_req* asrt_msg_ctor_collect_ready(
45 asrt_flat_id next_node_id )
47 uint8_t* p = ready_msg->buff;
48 *p++ = ASRT_COLLECT_MSG_READY;
49 asrt_add_u32( &p, root_id );
50 asrt_add_u32( &p, next_node_id );
53 .e = ready_msg->buff +
sizeof ready_msg->buff,
57 return &ready_msg->req;
60static inline struct asrt_send_req* asrt_msg_rtoc_collect_ready_ack(
63 ready_ack_msg->buff[0] = ASRT_COLLECT_MSG_READY_ACK;
65 .
b = ready_ack_msg->buff,
66 .e = ready_ack_msg->buff + 1,
70 return &ready_ack_msg->req;
81static inline struct asrt_send_req* asrt_msg_rtoc_collect_append(
83 asrt_flat_id parent_id,
92 uint8_t* vp = val_buf;
93 *vp++ = (uint8_t) value->type;
95 struct asrt_span* key_span = &msg->span[0];
96 struct asrt_span* val_span = &msg->span[1];
99 if ( value->type == ASRT_FLAT_STYPE_STR ) {
101 size_t slen = strlen( value->data.s.str_val );
102 memcpy( msg->val_buff, val_buf, (
size_t) ( vp - val_buf ) );
104 .b = msg->val_buff, .e = msg->val_buff + (size_t) ( vp - val_buf ) };
106 .
b = (uint8_t*) value->data.s.str_val,
107 .e = (uint8_t*) value->data.s.str_val + slen + 1 };
109 }
else if ( value->type == ASRT_FLAT_CTYPE_OBJECT || value->type == ASRT_FLAT_CTYPE_ARRAY ) {
110 memcpy( msg->val_buff, val_buf, (
size_t) ( vp - val_buf ) );
112 .b = msg->val_buff, .e = msg->val_buff + (size_t) ( vp - val_buf ) };
115 asrt_flat_value_write( &vp, *value );
116 memcpy( msg->val_buff, val_buf, (
size_t) ( vp - val_buf ) );
118 .b = msg->val_buff, .e = msg->val_buff + (size_t) ( vp - val_buf ) };
124 size_t klen = strlen( key );
126 (
struct asrt_span ){ .b = (uint8_t*) key, .
e = (uint8_t*) key + klen + 1 };
128 static uint8_t
const nul =
'\0';
129 *key_span = (
struct asrt_span ){ .b = (uint8_t*) &nul, .
e = (uint8_t*) &nul + 1 };
133 uint8_t* h = msg->hdr;
134 *h++ = ASRT_COLLECT_MSG_APPEND;
135 asrt_add_u32( &h, parent_id );
136 asrt_add_u32( &h, node_id );
139 .e = msg->hdr +
sizeof msg->hdr,
147static inline struct asrt_send_req* asrt_msg_ctor_collect_error(
149 enum asrt_collect_err_e error_code )
151 err_msg->buff[0] = ASRT_COLLECT_MSG_ERROR;
152 err_msg->buff[1] = (uint8_t) error_code;
155 .e = err_msg->buff +
sizeof err_msg->buff,
159 return &err_msg->req;
Definition: collect_proto.h:74
Definition: flat_tree.h:90
An outgoing message request placed in a module's send queue.
Definition: chann.h:64
struct asrt_span_span buff
Message payload (scatter-gather).
Definition: chann.h:65
Scatter-gather buffer: a primary byte range [b, e) followed by rest_count additional spans.
Definition: span.h:37
uint32_t rest_count
Number of entries in rest.
Definition: span.h:41
uint8_t * b
Primary buffer start.
Definition: span.h:38
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee ...
Definition: span.h:23
uint8_t * b
Pointer to the first byte.
Definition: span.h:24
uint8_t * e
One-past-the-end pointer.
Definition: span.h:25