00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef dvector_INCLUDED
00037 #define dvector_INCLUDED
00038 #ifdef __cplusplus
00039 extern "C" {
00040 #endif
00041
00042
00201 #ifndef ND_RCS_ID
00202 #define ND_RCS_ID
00203 #ifdef _KEEP_RCS_ID
00204 static char *dvector_rcs_id = "$Source: /scratch/mee/2.4-65/kpro64-pending/be/com/SCCS/s.dvector.h $ $Revision: 1.2 $";
00205 #endif
00206 #endif
00207
00208 #include "defs.h"
00209 #include "errors.h"
00210 #include "mempool.h"
00211
00212
00213 typedef enum {
00214 DIR_POS=1,
00215 DIR_NEG=2,
00216 DIR_EQ=4,
00217 DIR_POSNEG=3,
00218 DIR_POSEQ=5,
00219 DIR_NEGEQ=6,
00220 DIR_STAR=7
00221 } DIRECTION;
00222
00223
00224
00225
00226
00227 typedef mINT16 DEP;
00228
00229 #define DISTANCE_FLAG_PRIVATE 0x8000
00230 #define DISTANCE_MASK_PRIVATE 0x0FFF
00231 #define DISTANCE_OFFSET_PRIVATE 2048
00232 #define DIRECTION_MASK_PRIVATE 0x7000
00233 #define MAX_BOUND_PRIVATE 4095
00234 #define MAX_DISTANCE_PRIVATE 2047
00235 #define MIN_DISTANCE_PRIVATE -2048
00236
00237 extern DEP DEP_SetDistance(INT32 distance);
00238 extern void DEP_Lex_Pos_Decompose(DEP dep,MEM_POOL *pool,DEP **pos,
00239 DEP **neg, BOOL keep_pos_equals,BOOL keep_neg_equals) ;
00240
00241 extern DEP DEP_Lex_Pos_Compose(DEP *pos, DEP *neg, BOOL *pos_has_eq,
00242 BOOL *neg_has_eq);
00243
00244 inline BOOL DEP_IsDistance(DEP dep)
00245 {
00246 return(dep & DISTANCE_FLAG_PRIVATE);
00247 }
00248
00249 inline INT32 DEP_Distance(DEP dep)
00250 {
00251 Is_True(DEP_IsDistance(dep),("DEP_Distance called on non-constant dist."));
00252 return(((INT32) (dep & DISTANCE_MASK_PRIVATE)) - DISTANCE_OFFSET_PRIVATE);
00253 }
00254
00255 inline UINT32 DEP_DistanceBound(DEP dep)
00256 {
00257 return(((UINT32) (dep & DISTANCE_MASK_PRIVATE)) - DISTANCE_OFFSET_PRIVATE);
00258 }
00259
00260 inline DIRECTION DEP_Direction(DEP dep)
00261 {
00262 return((DIRECTION) ((dep & DIRECTION_MASK_PRIVATE) >> 12));
00263 }
00264
00265 inline DEP DEP_MAKE_DIST_CONST_PRIVATE(DEP dep)
00266 {
00267 return (dep | DISTANCE_FLAG_PRIVATE);
00268 }
00269
00270 inline DEP DEP_MAKE_DIST_NON_CONST_PRIVATE(DEP dep)
00271 {
00272 return( dep & (~DISTANCE_FLAG_PRIVATE));
00273 }
00274
00275
00276 inline DEP DEP_SET_DIR_PRIVATE(DEP dep,DIRECTION direction)
00277 {
00278 dep &= (~DIRECTION_MASK_PRIVATE);
00279 dep |= ((mINT16) direction) << 12;
00280 return (dep);
00281 }
00282
00283
00284
00285 inline DEP DEP_SET_DIST_PRIVATE(DEP dep,INT32 distance)
00286 {
00287 dep &= (~DISTANCE_MASK_PRIVATE);
00288 dep = (mINT16) (dep | (distance + DISTANCE_OFFSET_PRIVATE));
00289 return (dep);
00290 }
00291
00292
00293
00294
00295
00296
00297
00298 typedef DEP DEPV;
00299
00300
00301 #define DEPV_Dep(depv,i) depv[i]
00302
00303
00304 inline void DEPV_Free(MEM_POOL *mem_pool,DEPV *depv)
00305 {
00306 MEM_POOL_FREE(mem_pool,depv);
00307 }
00308
00309 extern DEP DEP_SetDirection(DIRECTION direction);
00310 extern DEP DEP_UnionDirection(DEP dep,DIRECTION direction);
00311 extern DEP DEP_Negate(DEP dep);
00312 extern void DIRECTION_Print(DIRECTION dir,FILE *fp);
00313 extern void DEP_Print(const DEP dep,FILE *fp);
00314 extern void DEP_PrintBound(const DEP dep,FILE *fp);
00315 extern DEPV *DEPV_Create(MEM_POOL *mem_pool,UINT8 num_dim);
00316 extern DEPV *DEPV_CreateStar(MEM_POOL *mem_pool,UINT8 num_dim);
00317 extern DEPV *DEPV_CreateEqual(MEM_POOL *mem_pool,UINT8 num_dim);
00318 extern DEPV *DEPV_Copy(MEM_POOL *mem_pool, DEPV *depv, UINT8 num_dim);
00319 extern void DEPV_Print(const DEPV *depv,FILE *fp, UINT8 num_dim);
00320 extern void DEPV_PrintBound(const DEPV *depv,FILE *fp, UINT8 num_dim);
00321
00322 #ifdef __cplusplus
00323 }
00324 #endif
00325
00326 #endif
00327
00328
00329