#ifndef PIPELINE_H_ #define PIPELINE_H_ #include "status.h" #include #include enum ec3_pipeline_stage_type_id { EC3_PIPELINE_NONE = 0, EC3_PIPELINE_AES256, EC3_PIPELINE_ZSTD, EC3_PIPELINE_FILE, }; enum ec3_pipeline_stage_type_flags { EC3_PIPELINE_F_NONE = 0x00u, EC3_PIPELINE_F_BUFFERED = 0x01u, }; struct ec3_pipeline_stage; struct ec3_pipeline_stage_type { enum ec3_pipeline_stage_type_id t_id; enum ec3_pipeline_stage_type_flags t_flags; enum ec3_status (*t_data_in)( struct ec3_pipeline_stage *, const void *, void *, size_t *); enum ec3_status (*t_data_out)( struct ec3_pipeline_stage *, const void *, size_t, void *, size_t *); }; struct ec3_pipeline_stage { const struct ec3_pipeline_stage_type *s_type; void *s_buf; void *s_arg; b_queue_entry s_entry; }; struct ec3_pipeline_stage_args { enum ec3_pipeline_stage_type_id type; void *arg; }; struct ec3_pipeline { b_queue p_stages; }; extern enum ec3_status ec3_pipeline_create( struct ec3_pipeline_stage_args stages[], size_t nr_stages, size_t cluster_size, struct ec3_pipeline **out); extern void ec3_pipeline_destroy(struct ec3_pipeline *p); extern enum ec3_status ec3_pipeline_data_out( struct ec3_pipeline *pipeline, void *p, size_t len, size_t *nr_written); extern enum ec3_status ec3_pipeline_data_in( struct ec3_pipeline *pipeline, void *p, size_t max, size_t *nr_read); #endif