1
#ifndef __FWEELIN_DATATYPES_H
2
#define __FWEELIN_DATATYPES_H
15
CoreDataType GetCoreDataType(char *name);
19
Range(int lo, int hi) : lo(lo), hi(hi) {};
25
// Flexible data type configuration variable-
26
// Used in parsing and evaluating expressions from config file
28
#define CFG_VAR_SIZE 16 // Number of data bytes in one variable
32
UserVariable() : name(0), value(data), next(0) {};
38
// Ensures that the precision of this variable is at least that of src
39
// If not, reconfigures this variable to match src..
40
// For ex, if this is T_char and src is T_float, this becomes T_float
41
void RaisePrecision (UserVariable &src) {
47
int tmp = (int) *this;
53
if (type == T_char || type == T_int) {
54
long tmp = (long) *this;
60
if (type == T_char || type == T_int || type == T_long) {
61
float tmp = (float) *this;
71
char operator == (UserVariable &cmp) {
73
// Special case if one variable is range and one is scalar-- then
74
// we check if the scalar is within the range
75
if (type == T_range && cmp.type != T_range) {
77
Range r(*((int *) value),*(((int *) value)+1));
78
return (v >= r.lo && v <= r.hi);
80
if (cmp.type == T_range && type != T_range) {
82
Range r(*((int *) cmp.value),*(((int *) cmp.value)+1));
83
return (v >= r.lo && v <= r.hi);
87
return (*((char *) value) == (char) cmp);
89
return (*((int *) value) == (int) cmp);
91
return (*((long *) value) == (long) cmp);
93
return (*((float *) value) == (float) cmp);
96
Range r = (Range) cmp;
97
return (*((int *) value) == r.lo &&
98
*(((int *) value)+1) == r.hi);
102
printf(" UserVariable: WARNING: Compare T_variable or T_variableref "
103
" not implemented!\n");
106
printf(" UserVariable: WARNING: Can't compare invalid variable!\n");
113
char operator != (UserVariable &cmp) {
114
return !(operator == (cmp));
117
void operator += (UserVariable &src) {
121
*((char *) value) += (char) src;
124
*((int *) value) += (int) src;
127
*((long *) value) += (long) src;
130
*((float *) value) += (float) src;
134
Range r = (Range) src;
135
*((int *) value) += r.lo;
136
*(((int *) value)+1) += r.hi;
141
printf(" UserVariable: WARNING: Algebra on T_variable or T_variableref "
145
printf(" UserVariable: WARNING: Can't operate on invalid variable!\n");
150
void operator -= (UserVariable &src) {
154
*((char *) value) -= (char) src;
157
*((int *) value) -= (int) src;
160
*((long *) value) -= (long) src;
163
*((float *) value) -= (float) src;
167
Range r = (Range) src;
168
*((int *) value) -= r.lo;
169
*(((int *) value)+1) -= r.hi;
174
printf(" UserVariable: WARNING: Algebra on T_variable or T_variableref "
178
printf(" UserVariable: WARNING: Can't operate on invalid variable!\n");
183
void operator *= (UserVariable &src) {
187
*((char *) value) *= (char) src;
190
*((int *) value) *= (int) src;
193
*((long *) value) *= (long) src;
196
*((float *) value) *= (float) src;
200
Range r = (Range) src;
201
*((int *) value) *= r.lo;
202
*(((int *) value)+1) *= r.hi;
207
printf(" UserVariable: WARNING: Algebra on T_variable or T_variableref "
211
printf(" UserVariable: WARNING: Can't operate on invalid variable!\n");
216
void operator /= (UserVariable &src) {
223
// Special case- when dividing a scalar by another scalar, the
224
// result is always evaluated to a float!!
225
float t = (float) src;
227
// Convert this variable to a float
229
*((float *) value) = (float) *this / t;
236
Range r = (Range) src;
238
*((int *) value) /= r.lo;
240
*(((int *) value)+1) /= r.hi;
245
printf(" UserVariable: WARNING: Algebra on T_variable or T_variableref "
249
printf(" UserVariable: WARNING: Can't operate on invalid variable!\n");
254
UserVariable & operator = (char src) {
255
*((char *) value) = src;
258
UserVariable & operator = (int src) {
259
*((int *) value) = src;
262
UserVariable & operator = (long src) {
263
*((long *) value) = src;
266
UserVariable & operator = (float src) {
267
*((float *) value) = src;
270
UserVariable & operator = (Range src) {
271
*((int *) value) = src.lo;
272
*(((int *) value)+1) = src.hi;
278
case T_char : return *((char *) value);
279
case T_int : return (char) *((int *) value);
280
case T_long : return (char) *((long *) value);
281
case T_float : return (char) *((float *) value);
283
printf(" UserVariable: WARNING: Can't convert range to scalar!\n");
287
printf(" UserVariable: WARNING: Can't convert T_variable or "
291
printf(" UserVariable: WARNING: Can't convert invalid variable!\n");
297
case T_char : return (int) *((char *) value);
298
case T_int : return *((int *) value);
299
case T_long : return (int) *((long *) value);
300
case T_float : return (int) *((float *) value);
302
printf(" UserVariable: WARNING: Can't convert range to scalar!\n");
306
printf(" UserVariable: WARNING: Can't convert T_variable or "
310
printf(" UserVariable: WARNING: Can't convert invalid variable!\n");
316
case T_char : return (long) *((char *) value);
317
case T_int : return (long) *((int *) value);
318
case T_long : return *((long *) value);
319
case T_float : return (long) *((float *) value);
321
printf(" UserVariable: WARNING: Can't convert range to scalar!\n");
325
printf(" UserVariable: WARNING: Can't convert T_variable or "
329
printf(" UserVariable: WARNING: Can't convert invalid variable!\n");
335
case T_char : return (float) *((char *) value);
336
case T_int : return (float) *((int *) value);
337
case T_long : return (float) *((long *) value);
338
case T_float : return *((float *) value);
340
printf(" UserVariable: WARNING: Can't convert range to scalar!\n");
344
printf(" UserVariable: WARNING: Can't convert T_variable or "
348
printf(" UserVariable: WARNING: Can't convert invalid variable!\n");
356
case T_char : return Range(*((char *) value), *((char *) value));
357
case T_int : return Range(*((int *) value), *((int *) value));
358
case T_long : return Range(*((long *) value), *((long *) value));
359
case T_float : return Range((int) *((float *) value),
360
(int) *((float *) value));
361
case T_range : return Range(*((int *) value),*(((int *) value)+1));
364
printf(" UserVariable: WARNING: Can't convert T_variable or "
368
printf(" UserVariable: WARNING: Can't convert invalid variable!\n");
373
void operator = (UserVariable &src) {
374
// Assignment operator does not copy name to avoid memory alloc
377
memcpy(data,src.data,CFG_VAR_SIZE);
378
if (src.value == src.data)
381
value = src.value; // System variable, copy data ptr directly
384
// Sets this UserVariable from src, converting from src type to this
385
void SetFrom(UserVariable &src) {
405
printf(" UserVariable: WARNING: Can't set from invalid variable!\n");
410
// Dump UserVariable to string str (maxlen is maximum length)
411
// or stdout if str = 0
412
void Print(char *str = 0, int maxlen = 0);
414
char IsSystemVariable() { return (value != data); };
418
char data[CFG_VAR_SIZE];
420
// System variables are a special type of variable that is created by the
421
// core FreeWheeling system and not the user.
423
// A system variable is essentially a pointer to an internal data value
424
// inside FreeWheeling. It can be read by the configuration system like
425
// any other user variable, but it accesses directly into FreeWheeling's
426
// internal memory and so it has a mind of its own
428
// If value points to the data array, this is a user variable
429
// If value does not point to data, this is a system variable