core/object.h

Go to the documentation of this file.
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 /* this must match property_type list in object.c */
00019 typedef unsigned int OBJECTRANK; 
00020 typedef unsigned short OBJECTSIZE; 
00021 typedef unsigned int OBJECTNUM; 
00022 typedef char * OBJECTNAME; 
00024 /* object flags */
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     /* IMPORTANT: flags must be last */
00045 } OBJECT; 
00047 /* this is the callback table for modules
00048  * the table is initialized in module.cpp
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         OBJECT *(*get_reference)(OBJECT *, char*);
00075         char *(*get_unit)(OBJECT *, char *);
00076     } properties;
00077     struct s_findlist *(*find_objects)(struct s_findlist *,...);
00078     OBJECT *(*find_next)(struct s_findlist *,OBJECT *obj);
00079     void *(*malloc)(size_t);
00080     void (*free)(void*);
00081     struct s_aggregate *(*create_aggregate)(char *aggregator, char *group_expression);
00082     //struct s_aggregate *(*create_aggregate_zwei)(char *aggregator, struct s_aggregate *aggr);
00083     double (*run_aggregate)(struct s_aggregate *aggregate);
00084     double *(*get_module_var)(MODULE *module_name, char *varname);
00085     struct {
00086         double (*uniform)(double a, double b);
00087         double (*normal)(double m, double s);
00088         double (*bernoulli)(double p);
00089         double (*pareto)(double m, double a);
00090         double (*lognormal)(double m, double s);
00091         double (*sampled)(unsigned int n, double *x);
00092         double (*exponential)(double l);
00093         RANDOMTYPE (*type)(char *name);
00094         double (*value)(RANDOMTYPE type, ...);
00095     } random;
00096     int (*object_isa)(OBJECT *obj, char *type);
00097     DELEGATEDTYPE* (*register_type)(CLASS *oclass, char *type,int (*from_string)(void*,char*),int (*to_string)(void*,char*,int));
00098     int (*define_type)(CLASS*,DELEGATEDTYPE*,...);
00099     struct {
00100         TIMESTAMP (*mkdatetime)(DATETIME *dt);
00101         int (*strdatetime)(DATETIME *t, char *buffer, int size);
00102         double (*timestamp_to_days)(TIMESTAMP t);
00103         double (*timestamp_to_hours)(TIMESTAMP t);
00104         double (*timestamp_to_minutes)(TIMESTAMP t);
00105         double (*timestamp_to_seconds)(TIMESTAMP t);
00106         int (*local_datetime)(TIMESTAMP ts, DATETIME *dt);
00107         TIMESTAMP (*convert_to_timestamp)(char *value);
00108     } time;
00109     int (*unit_convert)(char *from, char *to, double *value);
00110     int (*unit_convert_ex)(UNIT *pFrom, UNIT *pTo, double *pValue);
00111     struct {
00112         EXCEPTIONHANDLER *(*create_exception_handler)();
00113         void (*delete_exception_handler)(EXCEPTIONHANDLER *ptr);
00114         void (*throw_exception)(char *msg, ...);
00115         char *(*exception_msg)(void);
00116     } exception;
00117     struct {
00118         GLOBALVAR *(*create)(char *name, ...);
00119         STATUS (*setvar)(char *def,...);
00120         char *(*getvar)(char *name, char *buffer, int size);
00121         GLOBALVAR *(*find)(char *name);
00122     } global;
00123 #ifndef NOLOCKS
00124     int64 *lock_count, *lock_spin;
00125 #endif
00126     struct {
00127         char *(*find_file)(char *name, char *path, int mode);
00128     } file;
00129     struct s_objvar_struct {
00130         complex *(*complex_var)(OBJECT *obj, PROPERTY *prop);
00131         int16 *(*int16_var)(OBJECT *obj, PROPERTY *prop);
00132         int32 *(*int32_var)(OBJECT *obj, PROPERTY *prop);
00133         int64 *(*int64_var)(OBJECT *obj, PROPERTY *prop);
00134         double *(*double_var)(OBJECT *obj, PROPERTY *prop);
00135         char *(*string_var)(OBJECT *obj, PROPERTY *prop);
00136         OBJECT *(*object_var)(OBJECT *obj, PROPERTY *prop);
00137     } objvar;
00138     struct s_objvar_name_struct {
00139         complex *(*complex_var)(OBJECT *obj, char *name);
00140         int16 *(*int16_var)(OBJECT *obj, char *name);
00141         int32 *(*int32_var)(OBJECT *obj, char *name);
00142         int64 *(*int64_var)(OBJECT *obj, char *name);
00143         double *(*double_var)(OBJECT *obj, char *name);
00144         char *(*string_var)(OBJECT *obj, char *name);
00145     } objvarname;
00146     struct {
00147         int (*string_to_property)(PROPERTY *prop, void *addr, char *value);
00148         int (*property_to_string)(PROPERTY *prop, void *addr, char *value, int size);
00149     } convert;
00150     MODULE *(*module_find)(char *name);
00151     OBJECT *(*get_object)(char *name);
00152     int (*get_oflags)(KEYWORD **extflags);
00153 } CALLBACKS; 
00155 #ifdef __cplusplus
00156 extern "C" {
00157 #endif
00158 
00159 OBJECT *object_create_single(CLASS *oclass, OBJECTSIZE size);
00160 OBJECT *object_create_array(CLASS *oclass, OBJECTSIZE size, unsigned int n_objects);
00161 OBJECT *object_remove_by_id(OBJECTNUM id);
00162 int object_init(OBJECT *obj);
00163 int object_set_dependent(OBJECT *obj, OBJECT *dependent);
00164 int object_set_parent(OBJECT *obj, OBJECT *parent);
00165 void *object_get_addr(OBJECT *obj, char *name);
00166 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00167 int object_set_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value);
00168 int object_set_value_by_addr(OBJECT *obj, void *addr, char *value, PROPERTY *prop);
00169 int object_set_double_by_name(OBJECT *obj, PROPERTYNAME name, double value);
00170 int object_get_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value, int size);
00171 int object_get_value_by_addr(OBJECT *obj, void *addr, char *value, int size, PROPERTY *prop);
00172 OBJECT *object_get_reference(OBJECT *obj, char *name);
00173 int object_isa(OBJECT *obj, char *type);
00174 void object_set_name(OBJECT *obj, OBJECTNAME name);
00175 OBJECT *object_find_name(OBJECTNAME name);
00176 
00177 int object_get_oflags(KEYWORD **extflags);
00178 
00179 TIMESTAMP object_sync(OBJECT *obj, TIMESTAMP to,PASSCONFIG pass);
00180 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00181 OBJECT *object_get_object(OBJECT *obj, PROPERTY *prop);
00182 int16 *object_get_int16(OBJECT *obj, PROPERTY *prop);
00183 int16 *object_get_int16_by_name(OBJECT *obj, char *name);
00184 int32 *object_get_int32(OBJECT *obj, PROPERTY *prop);
00185 int32 *object_get_int32_by_name(OBJECT *obj, char *name);
00186 int64 *object_get_int64(OBJECT *obj, PROPERTY *prop);
00187 int64 *object_get_int64_by_name(OBJECT *obj, char *name);
00188 double *object_get_double(OBJECT *pObj, PROPERTY *prop);
00189 double *object_get_double_by_name(OBJECT *pObj, char *name);
00190 complex *object_get_complex(OBJECT *pObj, PROPERTY *prop);
00191 complex *object_get_complex_by_name(OBJECT *pObj, char *name);
00192 double *object_get_double_quick(OBJECT *pObj, PROPERTY *prop);
00193 complex *object_get_complex_quick(OBJECT *pObj, PROPERTY *prop);
00194 char *object_get_string(OBJECT *pObj, PROPERTY *prop);
00195 char *object_get_string_by_name(OBJECT *obj, char *name);
00196 FUNCTIONADDR object_get_function(CLASSNAME classname, FUNCTIONNAME functionname);
00197 char *object_property_to_string(OBJECT *obj, char *name);
00198 char *object_get_unit(OBJECT *obj, char *name);
00199 int object_set_rank(OBJECT *obj, OBJECTRANK rank);
00200 
00201 OBJECT *object_find_by_id(OBJECTNUM id);
00202 OBJECT *object_get_first();
00203 OBJECT *object_get_next(OBJECT *obj);
00204 unsigned int object_get_count(void);
00205 int object_dump(char *buffer, int size, OBJECT *obj);
00206 int object_saveall(FILE *fp);
00207 int object_saveall_xml(FILE *fp);
00208 
00209 char *object_name(OBJECT *obj);
00210 int convert_from_latitude(double,void*,int);
00211 int convert_from_longitude(double,void*,int);
00212 double convert_to_latitude(char *buffer);
00213 double convert_to_longitude(char *buffer);
00214 
00215 PROPERTY *object_flag_property(void);
00216 
00217 #ifdef __cplusplus
00218 }
00219 #endif
00220 
00221 
00222 #define object_size(X) ((X)?(X)->size:-1) 
00223 #define object_id(X) ((X)?(X)->id:-1) 
00224 #define object_parent(X) ((X)?(X)->parent:NULL) 
00225 #define object_rank(X) ((X)?(X)->name:-1) 
00227 #define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL)) 
00228 #define GETADDR(O,P) (O?((void*)((char*)(O+1)+(unsigned int64)((P)->addr))):NULL) 
00229 #define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL) 
00230 #define MYPARENT ((((OBJECT*)this)-1)->parent) 
00232 #endif
00233 

GridLAB-DTM Version 1.0
An open-source project initiated by the US Department of Energy