00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUOO_LAYOUT_H
00019 #define CUOO_LAYOUT_H
00020
00021 #include <cuoo/fwd.h>
00022 #include <cuoo/hcobj.h>
00023 #include <cu/conf.h>
00024 #include <cu/inherit.h>
00025 #include <stdio.h>
00026
00027 CU_BEGIN_DECLARATIONS
00028
00029
00030
00031 struct cuoo_layout
00032 {
00033 CUOO_HCOBJ
00034 cuoo_layout_t prefix;
00035 cu_word_t alloc_mask;
00036 unsigned short bitalign;
00037 unsigned short max_free_width;
00038 cu_offset_t bitoffset;
00039 };
00040 extern cuoo_type_t cuooP_layout_type;
00041 #define cuoo_layout_type() cuooP_layout_type
00042
00043 #define cuoo_layout_prefix(oml) ((oml)->prefix)
00044 #define cuoo_layout_bits_alloc_mask(oml) ((oml)->alloc_mask)
00045
00046
00047
00048
00049
00050 cuoo_layout_t cuoo_layout_pack_bits(cuoo_layout_t prefix,
00051 cu_offset_t bitsize, cu_offset_t bitalign,
00052 cu_offset_t *bitoffset);
00053
00054
00055 cuoo_layout_t cuoo_layout_product(cuoo_layout_t lyo0, cuoo_layout_t lyo1,
00056 cu_offset_t *bitoffset);
00057
00058
00059
00060 cuoo_layout_t cuoo_layout_union(cuoo_layout_t lyo0, cuoo_layout_t lyo1);
00061
00062 #if 0
00063
00064
00065 cuoo_layout_t cuoo_layout_append_bits(cuoo_layout_t prefix,
00066 cu_offset_t bitsize, cu_offset_t bitalign,
00067 cu_offset_t *bitoffset);
00068
00069
00070 cuoo_layout_t cuoo_layout_append(cuoo_layout_t prefix,
00071 cuoo_layout_t member,
00072 cu_offset_t *bitoffset);
00073 #endif
00074
00075
00076
00077 cu_offset_t cuoo_layout_size(cuoo_layout_t layout);
00078
00079
00080 cu_offset_t cuoo_layout_bitsize(cuoo_layout_t lyo);
00081
00082
00083 CU_SINLINE cu_offset_t cuoo_layout_align(cuoo_layout_t layout)
00084 { return layout? (layout->bitalign + 7)/8 : 1; }
00085
00086
00087
00088 CU_SINLINE cu_offset_t cuoo_layout_bitalign(cuoo_layout_t layout)
00089 { return layout? layout->bitalign : 1; }
00090
00091 extern cuoo_layout_t cuooP_layout_ptr;
00092 extern cuoo_layout_t cuooP_layout_void;
00093
00094
00095 CU_SINLINE cuoo_layout_t cuoo_layout_ptr()
00096 { return cuooP_layout_ptr; }
00097
00098
00099 CU_SINLINE cuoo_layout_t cuoo_layout_void()
00100 { return cuooP_layout_void; }
00101
00102
00103 void cuoo_layout_dump(cuoo_layout_t lyo, FILE *out);
00104
00105
00106 CU_END_DECLARATIONS
00107
00108 #endif