00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUEX_LTREE_H
00019 #define CUEX_LTREE_H
00020
00021 #include <cuex/opn.h>
00022 #include <cuex/oprdefs.h>
00023 #include <cufo/fwd.h>
00024
00025 CU_BEGIN_DECLARATIONS
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #define CUEX_LTREE_LOG2_FANOUT 2
00038 #define CUEX_LTREE_FANOUT (1 << CUEX_LTREE_LOG2_FANOUT)
00039 #define CUEX_LTREE_FANOUT_MASK (CUEX_LTREE_FANOUT - 1)
00040 #define CUEXP_OXR_LTREE(depth, arity) \
00041 (CUEXP_OR_LTREE(arity) | CUEXP_OA_LTREE_DEPTH(depth))
00042 #define CUEXP_OA_LTREE_DEPTH_MAXP (1 << CUEXP_OA_LTREE_DEPTH_WIDTH)
00043
00044
00045 #define CUEX_LTREE_END PTRDIFF_MAX
00046
00047 CU_SINLINE cu_bool_t
00048 cuex_is_oR_ltree(cuex_meta_t opr)
00049 {
00050 return cuex_opr_sans_arity(cuexP_og_ltree_strip(opr)) == CUEXP_OR_LTREE(0);
00051 }
00052
00053 struct cuex_ltree_node
00054 {
00055 CUOO_HCOBJ
00056 cuex_t sub[CUEX_LTREE_FANOUT];
00057 };
00058
00059
00060 CU_SINLINE cuex_t cuex_ltree_empty() { return NULL; }
00061
00062
00063 CU_SINLINE cu_bool_t cuex_ltree_is_empty(cuex_t tree) { return tree == NULL; }
00064
00065 CU_SINLINE cu_bool_t cuex_ltree_is_singleton(cuex_t tree)
00066 { return tree != NULL && !cuex_is_oR_ltree(cuex_meta(tree)); }
00067
00068 CU_SINLINE cu_bool_t cuex_ltree_is_composite(cuex_t tree)
00069 { return tree != NULL && cuex_is_oR_ltree(cuex_meta(tree)); }
00070
00071 CU_SINLINE cu_bool_t cuexP_is_ltree_node(cuex_t tree)
00072 { return cuex_is_oR_ltree(cuex_meta(tree)); }
00073
00074
00075
00076 cuex_t cuex_ltree_at(cuex_t tree, ptrdiff_t i);
00077
00078
00079
00080 cuex_t cuex_ltree_last(cuex_t tree);
00081
00082
00083 cuex_t cuex_ltree_concat(cuex_t tree0, cuex_t tree1);
00084
00085
00086
00087 cuex_t cuex_ltree_slice(cuex_t tree, ptrdiff_t start, ptrdiff_t end);
00088
00089
00090 size_t cuex_ltree_size(cuex_t tree);
00091
00092
00093
00094 cu_bool_t cuex_ltree_forall(cu_clop(f, cu_bool_t, cuex_t), cuex_t tree);
00095
00096
00097
00098 struct cuex_ltree_itr
00099 {
00100 size_t i_cur;
00101 size_t i_end;
00102 cuex_t stack[CUEXP_OA_LTREE_DEPTH_MAXP];
00103 };
00104 typedef struct cuex_ltree_itr cuex_ltree_itr_t;
00105
00106
00107 void cuex_ltree_itr_init_full(cuex_ltree_itr_t *itr, cuex_t tree);
00108
00109
00110
00111 void cuex_ltree_itr_init_slice(cuex_ltree_itr_t *itr, cuex_t tree,
00112 ptrdiff_t start, ptrdiff_t end);
00113
00114
00115 CU_SINLINE cu_bool_t cuex_ltree_itr_is_end(cuex_ltree_itr_t *itr)
00116 { return itr->i_cur == itr->i_end; }
00117
00118
00119
00120 cuex_t cuex_ltree_itr_get(cuex_ltree_itr_t *itr);
00121
00122 cu_ptr_source_t cuex_ltree_full_source(cuex_t x);
00123
00124 cu_ptr_source_t cuex_ltree_slice_source(cuex_t x, ptrdiff_t i, ptrdiff_t j);
00125
00126 cuex_t cuex_ltree_from_valist(va_list vl);
00127
00128 cuex_t cuex_ltree_from_source(cu_ptr_source_t source);
00129
00130 cuex_t cuex_ltree_from_array(cuex_t *elt_array, size_t elt_count);
00131
00132 cuex_t cuex_ltree_append_from_source(cuex_t tree0, cu_ptr_source_t source1);
00133
00134 cuex_t cuex_ltree_append_from_array(cuex_t tree0, cuex_t *arr, size_t cnt);
00135
00136 void cuex_ltree_fprint(FILE *out, cuex_t ltree,
00137 char const *fmt_init, char const *fmt_cont);
00138
00139 void cuex_ltree_foprint(cufo_stream_t fos, cuex_t ltree,
00140 char const *fmt_init, char const *fmt_cont);
00141
00142
00143 CU_END_DECLARATIONS
00144
00145 #endif