00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CU_BOOL_H
00019 #define CU_BOOL_H
00020
00021 #include <cu/fwd.h>
00022
00023 CU_BEGIN_DECLARATIONS
00024
00025
00026
00027
00028 typedef enum {
00029 CU_BOOL1F_FALSE = 0x0,
00030 CU_BOOL1F_TRUE = 0x3,
00031 CU_BOOL1F_IDENT = 0x2,
00032 CU_BOOL1F_NOT = 0x1,
00033 } cu_bool1f_t;
00034
00035
00036 CU_SINLINE int
00037 cu_bool_cmp(cu_bool_t x, cu_bool_t y)
00038 { return x? (y? 0 : 1) : (y? -1 : 0); }
00039
00040
00041
00042 cu_bool1f_t cu_bool1f_from_func(cu_bool_t (*f)(cu_bool_t));
00043
00044
00045
00046 cu_bool_t (*cu_bool1f_to_func(cu_bool1f_t f))(cu_bool_t);
00047
00048
00049 CU_SINLINE cu_bool_t
00050 cu_bool1f_apply(cu_bool1f_t f, cu_bool_t x)
00051 { return (f >> !!x) & 1; }
00052
00053
00054 CU_SINLINE cu_bool1f_t
00055 cu_bool1f_konst(cu_bool_t x)
00056 { return (cu_bool1f_t)(3*!!x); }
00057
00058
00059 CU_SINLINE cu_bool1f_t
00060 cu_bool1f_not(cu_bool1f_t f)
00061 { return (cu_bool1f_t)(~f & 0x3); }
00062
00063
00064 CU_SINLINE cu_bool1f_t
00065 cu_bool1f_compose(cu_bool1f_t f, cu_bool1f_t g)
00066 { return (cu_bool1f_t)((3*(f & 1) & ~g) | (3*((f & 2) >> 1) & g)); }
00067
00068
00069
00070 typedef enum {
00071
00072
00073 CU_BOOL2F_FALSE = 0x0,
00074 CU_BOOL2F_TRUE = 0xf,
00075
00076
00077 CU_BOOL2F_LEFT = 0xa,
00078 CU_BOOL2F_RIGHT = 0xc,
00079 CU_BOOL2F_NOT_LEFT = 0x5,
00080 CU_BOOL2F_NOT_RIGHT = 0x3,
00081
00082
00083 CU_BOOL2F_NOR = 0x1,
00084 CU_BOOL2F_XOR = 0x6,
00085 CU_BOOL2F_NAND = 0x7,
00086 CU_BOOL2F_AND = 0x8,
00087 CU_BOOL2F_IFF = 0x9,
00088 CU_BOOL2F_OR = 0xe,
00089
00090
00091 CU_BOOL2F_AND_NOT = 0x2,
00092 CU_BOOL2F_NOT_AND = 0x4,
00093 CU_BOOL2F_OR_NOT = 0xb,
00094 CU_BOOL2F_NOT_OR = 0xd,
00095
00096 } cu_bool2f_t;
00097
00098
00099
00100 cu_bool2f_t cu_bool2f_from_func(cu_bool_t (*f)(cu_bool_t, cu_bool_t));
00101
00102
00103 cu_bool_t (*cu_bool2f_to_func(cu_bool2f_t f))(cu_bool_t, cu_bool_t);
00104
00105
00106 CU_SINLINE cu_bool_t
00107 cu_bool2f_apply(cu_bool2f_t f, cu_bool_t x, cu_bool_t y)
00108 {
00109 return (f >> ((!!x) | (2*!!y))) & 1;
00110 }
00111
00112
00113 CU_SINLINE cu_bool1f_t
00114 cu_bool2f_apply_left(cu_bool2f_t f, cu_bool_t x)
00115 {
00116 int i = f >> !!x;
00117 return (cu_bool1f_t)((i & 1) | ((i >> 1) & 2));
00118 }
00119
00120
00121 CU_SINLINE cu_bool1f_t
00122 cu_bool2f_apply_right(cu_bool2f_t f, cu_bool_t y)
00123 {
00124 return (cu_bool1f_t)((f >> (2*!!y)) & 3);
00125 }
00126
00127
00128 CU_SINLINE cu_bool2f_t
00129 cu_bool2f_konst(cu_bool_t v)
00130 {
00131 return (cu_bool2f_t)(v? 15 : 0);
00132 }
00133
00134
00135 CU_SINLINE cu_bool2f_t
00136 cu_bool2f_not(cu_bool2f_t f)
00137 {
00138 return (cu_bool2f_t)(~f & 0xf);
00139 }
00140
00141 CU_SINLINE cu_bool2f_t
00142 cu_bool2f_not_left(cu_bool2f_t f)
00143 {
00144 return (cu_bool2f_t)(((f & 5) << 1) | ((f & 10) >> 1));
00145 }
00146
00147 CU_SINLINE cu_bool2f_t
00148 cu_bool2f_not_right(cu_bool2f_t f)
00149 {
00150 return (cu_bool2f_t)((f >> 2) | ((f & 3) << 2));
00151 }
00152
00153
00154 CU_SINLINE cu_bool2f_t
00155 cu_bool2f_swap(cu_bool2f_t f)
00156 {
00157 return (cu_bool2f_t)((f & 9) | ((f & 2) << 1) | ((f & 4) >> 1));
00158 }
00159
00160
00161
00162 CU_SINLINE cu_bool2f_t
00163 cu_bool2f_compose(cu_bool1f_t f, cu_bool2f_t g)
00164 {
00165 return (cu_bool2f_t)((15*(f & 1) & ~g) | (15*((f & 2) >> 1) & g));
00166 }
00167
00168
00169
00170 CU_SINLINE cu_bool2f_t
00171 cu_bool2f_compose_left(cu_bool2f_t f, cu_bool1f_t g)
00172 {
00173 int gg = g | (g << 2);
00174 int fL = f & 5;
00175 int fH = (f >> 1) & 5;
00176 return (cu_bool2f_t)((3*fL & ~gg) | (3*fH & gg));
00177 }
00178
00179
00180
00181 CU_SINLINE cu_bool2f_t
00182 cu_bool2f_compose_right(cu_bool2f_t f, cu_bool1f_t g)
00183 {
00184 int gg = 3*(g + (g & 2));
00185 int fL = f & 3;
00186 int fH = f >> 2;
00187 return (cu_bool2f_t)((5*fL & ~gg) | (5*fH & gg));
00188 }
00189
00190
00191 CU_END_DECLARATIONS
00192
00193 #endif