1 2 /* 3 * bltVector.h -- 4 * 5 * Copyright 1993-2000 Lucent Technologies, Inc. 6 * 7 * Permission to use, copy, modify, and distribute this software and 8 * its documentation for any purpose and without fee is hereby 9 * granted, provided that the above copyright notice appear in all 10 * copies and that both that the copyright notice and warranty 11 * disclaimer appear in supporting documentation, and that the names 12 * of Lucent Technologies any of their entities not be used in 13 * advertising or publicity pertaining to distribution of the software 14 * without specific, written prior permission. 15 * 16 * Lucent Technologies disclaims all warranties with regard to this 17 * software, including all implied warranties of merchantability and 18 * fitness. In no event shall Lucent Technologies be liable for any 19 * special, indirect or consequential damages or any damages 20 * whatsoever resulting from loss of use, data or profits, whether in 21 * an action of contract, negligence or other tortuous action, arising 22 * out of or in connection with the use or performance of this 23 * software. 24 */ 25 26 #ifndef _BLT_VECTOR_H 27 #define _BLT_VECTOR_H 28 29 typedef enum { 30 BLT_VECTOR_NOTIFY_UPDATE = 1, /* The vector's values has been updated */ 31 BLT_VECTOR_NOTIFY_DESTROY /* The vector has been destroyed and the client 32 * should no longer use its data (calling 33 * Blt_FreeVectorId) */ 34 } Blt_VectorNotify; 35 36 typedef struct Blt_VectorIdStruct *Blt_VectorId; 37 38 typedef void (Blt_VectorChangedProc) _ANSI_ARGS_((Tcl_Interp *interp, 39 ClientData clientData, Blt_VectorNotify notify)); 40 41 typedef struct { 42 double *valueArr; /* Array of values (possibly malloc-ed) */ 43 int numValues; /* Number of values in the array */ 44 int arraySize; /* Size of the allocated space */ 45 double min, max; /* Minimum and maximum values in the vector */ 46 int dirty; /* Indicates if the vector has been updated */ 47 int reserved; /* Reserved for future use */ 48 } Blt_Vector; 49 50 typedef double (Blt_VectorIndexProc) _ANSI_ARGS_((Blt_Vector * vecPtr)); 51 52 typedef enum { 53 BLT_MATH_FUNC_SCALAR = 1, /* The function returns a single double 54 * precision value. */ 55 BLT_MATH_FUNC_VECTOR, /* The function processes the entire vector. */ 56 BLT_MATH_FUNC_MATRIX /* The function processes as a matrix. */ 57 } Blt_MathFuncType; 58 59 /* 60 * To be safe, use the macros below, rather than the fields of the 61 * structure directly. 62 * 63 * The Blt_Vector is basically an opaque type. But it's also the 64 * actual memory address of the vector itself. I wanted to make the 65 * API as unobtrusive as possible. So instead of giving you a copy of 66 * the vector, providing various functions to access and update the 67 * vector, you get your hands on the actual memory (array of doubles) 68 * shared by all the vector's clients. 69 * 70 * The trade-off for speed and convenience is safety. You can easily 71 * break things by writing into the vector when other clients are 72 * using it. Use Blt_ResetVector to get around this. At least the 73 * macros are a reminder it isn't really safe to reset the data 74 * fields, except by the API routines. 75 */ 76 #define Blt_VecData(v) ((v)->valueArr) 77 #define Blt_VecLength(v) ((v)->numValues) 78 #define Blt_VecSize(v) ((v)->arraySize) 79 #define Blt_VecDirty(v) ((v)->dirty) 80 81 #ifndef USE_BLT_STUBS 82 83 EXTERN double Blt_VecMin _ANSI_ARGS_((Blt_Vector *vPtr)); 84 EXTERN double Blt_VecMax _ANSI_ARGS_((Blt_Vector *vPtr)); 85 86 EXTERN Blt_VectorId Blt_AllocVectorId _ANSI_ARGS_((Tcl_Interp *interp, 87 char *vecName)); 88 89 EXTERN void Blt_SetVectorChangedProc _ANSI_ARGS_((Blt_VectorId clientId, 90 Blt_VectorChangedProc * proc, ClientData clientData)); 91 92 EXTERN void Blt_FreeVectorId _ANSI_ARGS_((Blt_VectorId clientId)); 93 94 EXTERN int Blt_GetVectorById _ANSI_ARGS_((Tcl_Interp *interp, 95 Blt_VectorId clientId, Blt_Vector **vecPtrPtr)); 96 97 EXTERN char *Blt_NameOfVectorId _ANSI_ARGS_((Blt_VectorId clientId)); 98 99 EXTERN char *Blt_NameOfVector _ANSI_ARGS_((Blt_Vector *vecPtr)); 100 101 EXTERN int Blt_VectorNotifyPending _ANSI_ARGS_((Blt_VectorId clientId)); 102 103 EXTERN int Blt_CreateVector _ANSI_ARGS_((Tcl_Interp *interp, char *vecName, 104 int size, Blt_Vector ** vecPtrPtr)); 105 106 EXTERN int Blt_CreateVector2 _ANSI_ARGS_((Tcl_Interp *interp, char *vecName, 107 char *cmdName, char *varName, int size, Blt_Vector ** vecPtrPtr)); 108 109 EXTERN int Blt_GetVector _ANSI_ARGS_((Tcl_Interp *interp, char *vecName, 110 Blt_Vector **vecPtrPtr)); 111 112 EXTERN int Blt_VectorExists _ANSI_ARGS_((Tcl_Interp *interp, char *vecName)); 113 114 EXTERN int Blt_ResetVector _ANSI_ARGS_((Blt_Vector *vecPtr, double *dataArr, 115 int nValues, int arraySize, Tcl_FreeProc *freeProc)); 116 117 EXTERN int Blt_ResizeVector _ANSI_ARGS_((Blt_Vector *vecPtr, int nValues)); 118 119 EXTERN int Blt_DeleteVectorByName _ANSI_ARGS_((Tcl_Interp *interp, 120 char *vecName)); 121 122 EXTERN int Blt_DeleteVector _ANSI_ARGS_((Blt_Vector *vecPtr)); 123 124 EXTERN int Blt_ExprVector _ANSI_ARGS_((Tcl_Interp *interp, char *expression, 125 Blt_Vector *vecPtr)); 126 127 EXTERN void Blt_InstallIndexProc _ANSI_ARGS_((Tcl_Interp *interp, 128 char *indexName, Blt_VectorIndexProc * procPtr)); 129 130 #else 131 #include "bltDecls.h" 132 #endif /* USE_BLT_STUBS */ 133 #endif /* _BLT_VECTOR_H */ 134