00001
00007 #ifndef _OBJECT_H
00008 #define _OBJECT_H
00009
00010 #include "complex.h"
00011 #include "timestamp.h"
00012 #include "class.h"
00013 #include "aggregate.h"
00014 #include "exception.h"
00015 #include "globals.h"
00016 #include "random.h"
00017
00018
00019 typedef unsigned int OBJECTRANK;
00020 typedef unsigned short OBJECTSIZE;
00021 typedef unsigned int OBJECTNUM;
00022 typedef char * OBJECTNAME;
00024
00025 #define OF_NONE 0x0000
00026 #define OF_HASPLC 0x0001
00027 #define OF_LOCKED 0x0002
00028 #define OF_RECALC 0x0008
00029 #define OF_RERANK 0x4000
00031 typedef struct s_object_list {
00032 OBJECTSIZE size;
00033 OBJECTNUM id;
00034 CLASS *oclass;
00035 struct s_object_list *next;
00036 struct s_object_list *parent;
00037 OBJECTRANK rank;
00038 TIMESTAMP clock;
00039 double latitude, longitude;
00040 TIMESTAMP in_svc,
00041 out_svc;
00042 OBJECTNAME name;
00043 unsigned long flags;
00044
00045 } OBJECT;
00047
00048
00049
00050 typedef struct s_callbacks {
00051 TIMESTAMP *global_clock;
00052 int (*output_verbose)(char *format, ...);
00053 int (*output_message)(char *format, ...);
00054 int (*output_warning)(char *format, ...);
00055 int (*output_error)(char *format, ...);
00056 int (*output_debug)(char *format, ...);
00057 int (*output_test)(char *format, ...);
00058 CLASS *(*register_class)(MODULE *,CLASSNAME,PASSCONFIG);
00059 OBJECT *(*create_single)(CLASS*,OBJECTSIZE);
00060 OBJECT *(*create_array)(CLASS*,OBJECTSIZE,unsigned int);
00061 int (*define_map)(CLASS*,...);
00062 FUNCTION *(*define_function)(CLASS*,FUNCTIONNAME,FUNCTIONADDR);
00063 int (*define_enumeration_member)(CLASS*,char*,char*,enumeration);
00064 int (*define_set_member)(CLASS*,char*,char*,unsigned long);
00065 int (*set_dependent)(OBJECT*,OBJECT*);
00066 int (*set_parent)(OBJECT*,OBJECT*);
00067 int (*set_rank)(OBJECT*,unsigned int);
00068 struct {
00069 PROPERTY *(*get_property)(OBJECT*,PROPERTYNAME);
00070 int (*set_value_by_addr)(OBJECT *, void*, char*,PROPERTY*);
00071 int (*get_value_by_addr)(OBJECT *, void*, char*, int size,PROPERTY*);
00072 int (*set_value_by_name)(OBJECT *, char*, char*);
00073 int (*get_value_by_name)(OBJECT *, char*, char*, int size);
00074 } properties;
00075 struct s_findlist *(*find_objects)(struct s_findlist *,...);
00076 OBJECT *(*find_next)(struct s_findlist *,OBJECT *obj);
00077 void *(*malloc)(size_t);
00078 void (*free)(void*);
00079 struct s_aggregate *(*create_aggregate)(char *aggregator, char *group_expression);
00080
00081 double (*run_aggregate)(struct s_aggregate *aggregate);
00082 double *(*get_module_var)(MODULE *module_name, char *varname);
00083 struct {
00084 double (*uniform)(double a, double b);
00085 double (*normal)(double m, double s);
00086 double (*bernoulli)(double p);
00087 double (*pareto)(double m, double a);
00088 double (*lognormal)(double m, double s);
00089 double (*sampled)(unsigned int n, double *x);
00090 double (*exponential)(double l);
00091 RANDOMTYPE (*type)(char *name);
00092 double (*value)(RANDOMTYPE type, ...);
00093 } random;
00094 int (*object_isa)(OBJECT *obj, char *type);
00095 DELEGATEDTYPE* (*register_type)(CLASS *oclass, char *type,int (*from_string)(void*,char*),int (*to_string)(void*,char*,int));
00096 int (*define_type)(CLASS*,DELEGATEDTYPE*,...);
00097 struct {
00098 TIMESTAMP (*mkdatetime)(DATETIME *dt);
00099 int (*strdatetime)(DATETIME *t, char *buffer, int size);
00100 double (*timestamp_to_days)(TIMESTAMP t);
00101 double (*timestamp_to_hours)(TIMESTAMP t);
00102 double (*timestamp_to_minutes)(TIMESTAMP t);
00103 double (*timestamp_to_seconds)(TIMESTAMP t);
00104 int (*local_datetime)(TIMESTAMP ts, DATETIME *dt);
00105 TIMESTAMP (*convert_to_timestamp)(char *value);
00106 } time;
00107 int (*unit_convert)(char *from, char *to, double *value);
00108 int (*unit_convert_ex)(UNIT *pFrom, UNIT *pTo, double *pValue);
00109 struct {
00110 EXCEPTIONHANDLER *(*create_exception_handler)();
00111 void (*delete_exception_handler)(EXCEPTIONHANDLER *ptr);
00112 void (*throw_exception)(char *msg, ...);
00113 char *(*exception_msg)(void);
00114 } exception;
00115 struct {
00116 GLOBALVAR *(*create)(char *name, ...);
00117 STATUS (*setvar)(char *def,...);
00118 char *(*getvar)(char *name, char *buffer, int size);
00119 GLOBALVAR *(*find)(char *name);
00120 } global;
00121 #ifndef NOLOCKS
00122 int64 *lock_count, *lock_spin;
00123 #endif
00124 struct {
00125 char *(*find_file)(char *name, char *path, int mode);
00126 } file;
00127 struct s_objvar_struct {
00128 complex *(*complex_var)(OBJECT *obj, PROPERTY *prop);
00129 int16 *(*int16_var)(OBJECT *obj, PROPERTY *prop);
00130 int32 *(*int32_var)(OBJECT *obj, PROPERTY *prop);
00131 int64 *(*int64_var)(OBJECT *obj, PROPERTY *prop);
00132 double *(*double_var)(OBJECT *obj, PROPERTY *prop);
00133 char *(*string_var)(OBJECT *obj, PROPERTY *prop);
00134 OBJECT *(*object_var)(OBJECT *obj, PROPERTY *prop);
00135 } objvar;
00136 struct s_objvar_name_struct {
00137 complex *(*complex_var)(OBJECT *obj, char *name);
00138 int16 *(*int16_var)(OBJECT *obj, char *name);
00139 int32 *(*int32_var)(OBJECT *obj, char *name);
00140 int64 *(*int64_var)(OBJECT *obj, char *name);
00141 double *(*double_var)(OBJECT *obj, char *name);
00142 char *(*string_var)(OBJECT *obj, char *name);
00143 } objvarname;
00144 struct {
00145 int (*string_to_property)(PROPERTY *prop, void *addr, char *value);
00146 int (*property_to_string)(PROPERTY *prop, void *addr, char *value, int size);
00147 } convert;
00148 MODULE *(*module_find)(char *name);
00149 OBJECT *(*get_object)(char *name);
00150 int (*get_oflags)(KEYWORD **extflags);
00151 } CALLBACKS;
00153 #ifdef __cplusplus
00154 extern "C" {
00155 #endif
00156
00157 OBJECT *object_create_single(CLASS *oclass, OBJECTSIZE size);
00158 OBJECT *object_create_array(CLASS *oclass, OBJECTSIZE size, unsigned int n_objects);
00159 OBJECT *object_remove_by_id(OBJECTNUM id);
00160 int object_init(OBJECT *obj);
00161 int object_set_dependent(OBJECT *obj, OBJECT *dependent);
00162 int object_set_parent(OBJECT *obj, OBJECT *parent);
00163 void *object_get_addr(OBJECT *obj, char *name);
00164 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00165 int object_set_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value);
00166 int object_set_value_by_addr(OBJECT *obj, void *addr, char *value, PROPERTY *prop);
00167 int object_set_double_by_name(OBJECT *obj, PROPERTYNAME name, double value);
00168 int object_get_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value, int size);
00169 int object_get_value_by_addr(OBJECT *obj, void *addr, char *value, int size, PROPERTY *prop);
00170 int object_isa(OBJECT *obj, char *type);
00171 void object_set_name(OBJECT *obj, OBJECTNAME name);
00172 OBJECT *object_find_name(OBJECTNAME name);
00173
00174 int object_get_oflags(KEYWORD **extflags);
00175
00176 TIMESTAMP object_sync(OBJECT *obj, TIMESTAMP to,PASSCONFIG pass);
00177 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00178 OBJECT *object_get_object(OBJECT *obj, PROPERTY *prop);
00179 int16 *object_get_int16(OBJECT *obj, PROPERTY *prop);
00180 int16 *object_get_int16_by_name(OBJECT *obj, char *name);
00181 int32 *object_get_int32(OBJECT *obj, PROPERTY *prop);
00182 int32 *object_get_int32_by_name(OBJECT *obj, char *name);
00183 int64 *object_get_int64(OBJECT *obj, PROPERTY *prop);
00184 int64 *object_get_int64_by_name(OBJECT *obj, char *name);
00185 double *object_get_double(OBJECT *pObj, PROPERTY *prop);
00186 double *object_get_double_by_name(OBJECT *pObj, char *name);
00187 complex *object_get_complex(OBJECT *pObj, PROPERTY *prop);
00188 complex *object_get_complex_by_name(OBJECT *pObj, char *name);
00189 double *object_get_double_quick(OBJECT *pObj, PROPERTY *prop);
00190 complex *object_get_complex_quick(OBJECT *pObj, PROPERTY *prop);
00191 char *object_get_string(OBJECT *pObj, PROPERTY *prop);
00192 char *object_get_string_by_name(OBJECT *obj, char *name);
00193 FUNCTIONADDR object_get_function(CLASSNAME classname, FUNCTIONNAME functionname);
00194 char *object_property_to_string(OBJECT *obj, char *name);
00195 int object_set_rank(OBJECT *obj, OBJECTRANK rank);
00196
00197 OBJECT *object_find_by_id(OBJECTNUM id);
00198 OBJECT *object_get_first();
00199 OBJECT *object_get_next(OBJECT *obj);
00200 unsigned int object_get_count(void);
00201 int object_dump(char *buffer, int size, OBJECT *obj);
00202 int object_saveall(FILE *fp);
00203 int object_saveall_xml(FILE *fp);
00204
00205 char *object_name(OBJECT *obj);
00206 int convert_from_latitude(double,void*,int);
00207 int convert_from_longitude(double,void*,int);
00208 double convert_to_latitude(char *buffer);
00209 double convert_to_longitude(char *buffer);
00210
00211 PROPERTY *object_flag_property(void);
00212
00213 #ifdef __cplusplus
00214 }
00215 #endif
00216
00217
00218 #define object_size(X) ((X)?(X)->size:-1)
00219 #define object_id(X) ((X)?(X)->id:-1)
00220 #define object_parent(X) ((X)?(X)->parent:NULL)
00221 #define object_rank(X) ((X)?(X)->name:-1)
00223 #define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL))
00224 #define GETADDR(O,P) (O?((void*)((char*)(O+1)+(unsigned int64)((P)->addr))):NULL)
00225 #define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL)
00226 #define MYPARENT ((((OBJECT*)this)-1)->parent)
00228 #endif
00229