summaryrefslogtreecommitdiffstats
path: root/tkblt/src/tkbltVector.h
blob: e6ee3b3629d00b573361ac250727ea7310da8628 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA
 * This code has been modified under the terms listed below and is made
 * available under the same terms.
 */

/*
 *	Copyright 1993-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.
 */

#ifndef _BLT_VECTOR_H
#define _BLT_VECTOR_H

#include <tcl.h>

typedef enum {
  BLT_VECTOR_NOTIFY_UPDATE = 1, /* The vector's values has been updated */
  BLT_VECTOR_NOTIFY_DESTROY	/* The vector has been destroyed and the client
				 * should no longer use its data (calling
				 * Blt_FreeVectorId) */
} Blt_VectorNotify;

typedef struct _Blt_VectorId *Blt_VectorId;

typedef void (Blt_VectorChangedProc)(Tcl_Interp* interp, ClientData clientData,
				     Blt_VectorNotify notify);

typedef struct {
  double *valueArr;		/* Array of values (possibly malloc-ed) */
  int numValues;		/* Number of values in the array */
  int arraySize;		/* Size of the allocated space */
  double min, max;		/* Minimum and maximum values in the vector */
  int dirty;			/* Indicates if the vector has been updated */
  int reserved;		/* Reserved for future use */

} Blt_Vector;

typedef double (Blt_VectorIndexProc)(Blt_Vector * vecPtr);

typedef enum {
  BLT_MATH_FUNC_SCALAR = 1,	/* The function returns a single double
				 * precision value. */
  BLT_MATH_FUNC_VECTOR	/* The function processes the entire vector. */
} Blt_MathFuncType;

/*
 * To be safe, use the macros below, rather than the fields of the
 * structure directly.
 *
 * The Blt_Vector is basically an opaque type.  But it's also the
 * actual memory address of the vector itself.  I wanted to make the
 * API as unobtrusive as possible.  So instead of giving you a copy of
 * the vector, providing various functions to access and update the
 * vector, you get your hands on the actual memory (array of doubles)
 * shared by all the vector's clients.
 *
 * The trade-off for speed and convenience is safety.  You can easily
 * break things by writing into the vector when other clients are
 * using it.  Use Blt_ResetVector to get around this.  At least the
 * macros are a reminder it isn't really safe to reset the data
 * fields, except by the API routines.  
 */
#define Blt_VecData(v)		((v)->valueArr)
#define Blt_VecLength(v)	((v)->numValues)
#define Blt_VecSize(v)		((v)->arraySize)
#define Blt_VecDirty(v)		((v)->dirty)

#ifdef __cplusplus
extern "C" {
#endif
  int Blt_CreateVector(Tcl_Interp* interp, const char *vecName, 
		       int size, Blt_Vector** vecPtrPtr);
  int Blt_CreateVector2(Tcl_Interp* interp, const char *vecName, 
			const char *cmdName, const char *varName, 
			int initialSize, Blt_Vector **vecPtrPtr);
  int Blt_DeleteVectorByName(Tcl_Interp* interp, const char *vecName);
  int Blt_DeleteVector(Blt_Vector *vecPtr);
  int Blt_GetVector(Tcl_Interp* interp, const char *vecName, 
		    Blt_Vector **vecPtrPtr);
  int Blt_GetVectorFromObj(Tcl_Interp* interp, Tcl_Obj *objPtr, 
			   Blt_Vector **vecPtrPtr);
  int Blt_ResetVector(Blt_Vector *vecPtr, double *dataArr, int n, 
		      int arraySize, Tcl_FreeProc *freeProc);
  int Blt_ResizeVector(Blt_Vector *vecPtr, int n);
  int Blt_VectorExists(Tcl_Interp* interp, const char *vecName);
  int Blt_VectorExists2(Tcl_Interp* interp, const char *vecName);
  Blt_VectorId Blt_AllocVectorId(Tcl_Interp* interp, const char *vecName);
  int Blt_GetVectorById(Tcl_Interp* interp, Blt_VectorId clientId, 
			Blt_Vector **vecPtrPtr);
  void Blt_SetVectorChangedProc(Blt_VectorId clientId, 
				Blt_VectorChangedProc *proc, 
				ClientData clientData);
  void Blt_FreeVectorId(Blt_VectorId clientId);
  const char *Blt_NameOfVectorId(Blt_VectorId clientId);
  const char *Blt_NameOfVector(Blt_Vector *vecPtr);
  int Blt_ExprVector(Tcl_Interp* interp, char *expr, Blt_Vector *vecPtr);
  void Blt_InstallIndexProc(Tcl_Interp* interp, const char *indexName, 
			    Blt_VectorIndexProc * procPtr);
  double Blt_VecMin(Blt_Vector *vPtr);
  double Blt_VecMax(Blt_Vector *vPtr);
#ifdef __cplusplus
}
#endif

#include "tkbltDecls.h"

#endif /* _BLT_VECTOR_H */