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     } 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     //struct s_aggregate *(*create_aggregate_zwei)(char *aggregator, struct s_aggregate *aggr);
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 

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