/* SPDX-License-Identifier: LGPL-2.1-only */ /* Copyright (C) 2020 Gediminas Jakutis */ #ifndef ALGOS_DEFS_H_INCLUDED #define ALGOS_DEFS_H_INCLUDED #include #include #include #define try_s(a,l) do {\ if(a) {\ goto l;\ }} while (0); #define try(a,l,e) do {\ if(a) {\ ret = e;\ goto l;\ }} while (0); #define get(in, idx, data) (in->cached ? in->get_element_cache(in, idx, data) | in->get_element(in, idx, data)) #define put(in, idx, data) (in->cached ? in->put_element_cache(in, idx, data) | in->put_element(in, idx, data)) /* for array implementation */ struct entry { uint64_t val; }; /* for linked list implementation */ struct entry_l { struct entry; int32_t next; /* """pointer""" to the next element. */ int32_t prev; /* """pointer""" to the previous element. */ }; enum opmode { mode_normal, mode_fetch, mode_generate }; enum accessmode { cached, direct }; enum dataformat { array, list }; struct stream { size_t n; ssize_t prev_idx; int fd; int out; int cached; char *name; struct entry_l *cache; int (*get_element)(struct stream * const restrict, size_t, struct entry_l *); int (*put_element)(struct stream * const restrict, size_t, struct entry_l *); int (*get_element_cache)(struct stream * const restrict, size_t, struct entry_l *); int (*put_element_cache)(struct stream * const restrict, size_t, struct entry_l *); }; struct settings { size_t ss; size_t to; size_t stride; char *filein; char *fileout; enum opmode opmode; enum dataformat format; enum accessmode access; }; #endif /* ALGOS_DEFS_H_INCLUDED */