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