summaryrefslogtreecommitdiffstats
path: root/src/bltVecInt.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bltVecInt.h')
-rw-r--r--src/bltVecInt.h251
1 files changed, 251 insertions, 0 deletions
diff --git a/src/bltVecInt.h b/src/bltVecInt.h
new file mode 100644
index 0000000..5d30f97
--- /dev/null
+++ b/src/bltVecInt.h
@@ -0,0 +1,251 @@
+
+/*
+ * bltVecInt.h --
+ *
+ * Copyright 1995-2004 George A Howlett.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#include "bltInt.h"
+#include <bltHash.h>
+#include <bltChain.h>
+#include <bltVector.h>
+
+#define VECTOR_THREAD_KEY "BLT Vector Data"
+#define VECTOR_MAGIC ((unsigned int) 0x46170277)
+
+/* These defines allow parsing of different types of indices */
+
+#define INDEX_SPECIAL (1<<0) /* Recognize "min", "max", and "++end" as
+ * valid indices */
+#define INDEX_COLON (1<<1) /* Also recognize a range of indices separated
+ * by a colon */
+#define INDEX_CHECK (1<<2) /* Verify that the specified index or range of
+ * indices are within limits */
+#define INDEX_ALL_FLAGS (INDEX_SPECIAL | INDEX_COLON | INDEX_CHECK)
+
+#define SPECIAL_INDEX -2
+
+#define FFT_NO_CONSTANT (1<<0)
+#define FFT_BARTLETT (1<<1)
+#define FFT_SPECTRUM (1<<2)
+
+typedef struct {
+ Blt_HashTable vectorTable; /* Table of vectors */
+ Blt_HashTable mathProcTable; /* Table of vector math functions */
+ Blt_HashTable indexProcTable;
+ Tcl_Interp *interp;
+ unsigned int nextId;
+} VectorInterpData;
+
+/*
+ * Vector --
+ *
+ * A vector is an array of double precision values. It can be accessed
+ * through a TCL command, a TCL array variable, or C API. The storage for
+ * the array points initially to a statically allocated buffer, but to
+ * malloc-ed memory if more is necessary.
+ *
+ * Vectors can be shared by several clients (for example, two different
+ * graph widgets). The data is shared. When a client wants to use a
+ * vector, it allocates a vector identifier, which identifies the client.
+ * Clients use this ID to specify a callback routine to be invoked
+ * whenever the vector is modified or destroyed. Whenever the vector is
+ * updated or destroyed, each client is notified of the change by their
+ * callback routine.
+ */
+
+typedef struct {
+
+ /*
+ * If you change these fields, make sure you change the definition of
+ * Blt_Vector in bltInt.h and blt.h too.
+ */
+
+ double *valueArr; /* Array of values (malloc-ed) */
+
+ int length; /* Current number of values in the array. */
+
+ int size; /* Maximum number of values that can be stored
+ * in the value array. */
+
+ double min, max; /* Minimum and maximum values in the vector */
+
+ int dirty; /* Indicates if the vector has been updated */
+
+ int reserved;
+
+ /* The following fields are local to this module */
+
+ const char *name; /* The namespace-qualified name of the vector.
+ * It points to the hash key allocated for the
+ * entry in the vector hash table. */
+
+ VectorInterpData *dataPtr;
+ Tcl_Interp *interp; /* Interpreter associated with the
+ * vector */
+
+ Blt_HashEntry *hashPtr; /* If non-NULL, pointer in a hash table to
+ * track the vectors in use. */
+
+ Tcl_FreeProc *freeProc; /* Address of procedure to call to release
+ * storage for the value array, Optionally can
+ * be one of the following: TCL_STATIC,
+ * TCL_DYNAMIC, or TCL_VOLATILE. */
+
+ const char *arrayName; /* The name of the TCL array variable mapped
+ * to the vector (malloc'ed). If NULL,
+ * indicates that the vector isn't mapped to
+ * any variable */
+
+ Tcl_Namespace *nsPtr; /* Namespace context of the vector itself. */
+
+ int offset; /* Offset from zero of the vector's starting
+ * index */
+
+ Tcl_Command cmdToken; /* Token for vector's TCL command. */
+
+ Blt_Chain chain; /* List of clients using this vector */
+
+ int notifyFlags; /* Notification flags. See definitions
+ * below */
+
+ int varFlags; /* Indicate if the variable is global,
+ * namespace, or local */
+
+ int freeOnUnset; /* For backward compatibility only: If
+ * non-zero, free the vector when its variable
+ * is unset. */
+ int flush;
+
+ int first, last; /* Selected region of vector. This is used
+ * mostly for the math routines */
+} Vector;
+
+#define NOTIFY_UPDATED ((int)BLT_VECTOR_NOTIFY_UPDATE)
+#define NOTIFY_DESTROYED ((int)BLT_VECTOR_NOTIFY_DESTROY)
+
+#define NOTIFY_NEVER (1<<3) /* Never notify clients of updates to
+ * the vector */
+#define NOTIFY_ALWAYS (1<<4) /* Notify clients after each update
+ * of the vector is made */
+#define NOTIFY_WHENIDLE (1<<5) /* Notify clients at the next idle point
+ * that the vector has been updated. */
+
+#define NOTIFY_PENDING (1<<6) /* A do-when-idle notification of the
+ * vector's clients is pending. */
+#define NOTIFY_NOW (1<<7) /* Notify clients of changes once
+ * immediately */
+
+#define NOTIFY_WHEN_MASK (NOTIFY_NEVER|NOTIFY_ALWAYS|NOTIFY_WHENIDLE)
+
+#define UPDATE_RANGE (1<<9) /* The data of the vector has changed.
+ * Update the min and max limits when
+ * they are needed */
+
+#define FindRange(array, first, last, min, max) \
+{ \
+ min = max = 0.0; \
+ if (first <= last) { \
+ register int i; \
+ min = max = array[first]; \
+ for (i = first + 1; i <= last; i++) { \
+ if (min > array[i]) { \
+ min = array[i]; \
+ } else if (max < array[i]) { \
+ max = array[i]; \
+ } \
+ } \
+ } \
+}
+
+BLT_EXTERN void Blt_Vec_InstallSpecialIndices(Blt_HashTable *tablePtr);
+
+BLT_EXTERN void Blt_Vec_InstallMathFunctions(Blt_HashTable *tablePtr);
+
+BLT_EXTERN void Blt_Vec_UninstallMathFunctions(Blt_HashTable *tablePtr);
+
+BLT_EXTERN VectorInterpData *Blt_Vec_GetInterpData (Tcl_Interp *interp);
+
+BLT_EXTERN double Blt_Vec_Max(Vector *vecObjPtr);
+BLT_EXTERN double Blt_Vec_Min(Vector *vecObjPtr);
+
+BLT_EXTERN Vector *Blt_Vec_New(VectorInterpData *dataPtr);
+
+BLT_EXTERN int Blt_Vec_Duplicate(Vector *destPtr, Vector *srcPtr);
+
+BLT_EXTERN int Blt_Vec_SetLength(Tcl_Interp *interp, Vector *vPtr,
+ int length);
+
+BLT_EXTERN int Blt_Vec_SetSize(Tcl_Interp *interp, Vector *vPtr,
+ int size);
+
+BLT_EXTERN int Blt_Vec_ChangeLength(Tcl_Interp *interp, Vector *vPtr,
+ int length);
+
+BLT_EXTERN Vector *Blt_Vec_ParseElement(Tcl_Interp *interp,
+ VectorInterpData *dataPtr, const char *start, const char **endPtr,
+ int flags);
+
+BLT_EXTERN void Blt_Vec_Free(Vector *vPtr);
+
+BLT_EXTERN size_t *Blt_Vec_SortMap(Vector **vectors, int nVectors);
+
+BLT_EXTERN int Blt_Vec_LookupName(VectorInterpData *dataPtr,
+ const char *vecName, Vector **vPtrPtr);
+
+BLT_EXTERN Vector *Blt_Vec_Create(VectorInterpData *dataPtr,
+ const char *name, const char *cmdName, const char *varName,
+ int *newPtr);
+
+BLT_EXTERN void Blt_Vec_UpdateRange(Vector *vPtr);
+
+BLT_EXTERN void Blt_Vec_UpdateClients(Vector *vPtr);
+
+BLT_EXTERN void Blt_Vec_FlushCache(Vector *vPtr);
+
+BLT_EXTERN int Blt_Vec_Reset(Vector *vPtr, double *dataArr,
+ int nValues, int arraySize, Tcl_FreeProc *freeProc);
+
+BLT_EXTERN int Blt_Vec_GetIndex(Tcl_Interp *interp, Vector *vPtr,
+ const char *string, int *indexPtr, int flags,
+ Blt_VectorIndexProc **procPtrPtr);
+
+BLT_EXTERN int Blt_Vec_GetIndexRange(Tcl_Interp *interp, Vector *vPtr,
+ const char *string, int flags, Blt_VectorIndexProc **procPtrPtr);
+
+BLT_EXTERN int Blt_Vec_MapVariable(Tcl_Interp *interp, Vector *vPtr,
+ const char *name);
+
+BLT_EXTERN int Blt_Vec_FFT(Tcl_Interp *interp, Vector *realPtr,
+ Vector *phasesPtr, Vector *freqPtr, double delta,
+ int flags, Vector *srcPtr);
+
+BLT_EXTERN int Blt_Vec_InverseFFT(Tcl_Interp *interp, Vector *iSrcPtr,
+ Vector *rDestPtr, Vector *iDestPtr, Vector *srcPtr);
+
+BLT_EXTERN Tcl_ObjCmdProc Blt_Vec_InstCmd;
+
+BLT_EXTERN Tcl_VarTraceProc Blt_Vec_VarTrace;
+
+BLT_EXTERN Tcl_IdleProc Blt_Vec_NotifyClients;
+