core/gridlabd.h

Go to the documentation of this file.
00001 
00053 #ifndef _GRIDLABD_H
00054 #define _GRIDLABD_H
00055 
00056 #ifdef HAVE_CONFIG_H
00057 #include "config.h"
00058 #endif
00059 
00060 #ifdef WIN32
00061 #define HAVE_LIBCPPUNIT
00062 #endif
00063 
00064 #ifdef __cplusplus
00065     #ifndef CDECL
00066         #define CDECL extern "C"
00067     #endif
00068 #else
00069     #define CDECL
00070 #endif
00071 
00072 #ifdef WIN32
00073 #ifndef EXPORT
00074 #define EXPORT CDECL __declspec(dllexport)
00075 #endif
00076 #else
00077 #define EXPORT CDECL
00078 #endif
00079 
00080 #include "object.h"
00081 #include "find.h"
00082 #include "random.h"
00083 
00084 #ifdef DLMAIN
00085 #define EXTERN
00086 #define INIT(X) =(X)
00087 #else
00088 #ifdef __cplusplus
00089 #define EXTERN
00090 #else
00091 #define EXTERN extern
00092 #endif /* __cplusplus */
00093 #define INIT(X)
00094 #endif
00095 CDECL EXPORT EXTERN CALLBACKS *callback INIT(NULL);
00096 #undef INIT
00097 #undef EXTERN
00098 
00099 /******************************************************************************
00100  * Variable publishing
00101  */
00130 #define PUBLISH_STRUCT(C,T,N) {struct C _t;if (gl_publish_variable(C##_class,PT_##T,#N,(char*)&_t.N-(char*)&_t,NULL)<1) return NULL;}
00131 
00133 #define PUBLISH_CLASS(C,T,N) {class C _t;if (gl_publish_variable(C##_class,PT_##T,#N,(char*)&_t.N-(char*)&_t,NULL)<1) return NULL;}
00134 
00136 #define PUBLISH_CLASSX(C,T,N,V) {class C _t;if (gl_publish_variable(C##_class,PT_##T,V,(char*)&_t.N-(char*)&_t,NULL)<1) return NULL;}
00137 
00140 //#define PUBLISH_CLASS_UNIT(C,T,N,U) {class C _t;if (gl_publish_variable(C##_class,PT_##T,#N"["U"]",(char*)&_t.N-(char*)&_t,NULL)<1) return NULL;}
00144 #define PUBLISH_DELEGATED(C,T,N) {class C _t;if (gl_publish_variable(C##_class,PT_delegated,T,#N,(char*)&_t.N-(char*)&_t,NULL)<1) return NULL;}
00145 
00148 //#define PUBLISH_ENUM(C,N,E) (*callback->define_enumeration_member)(C##_class,#N,#E,C::E)
00149 
00152 //#define PUBLISH_SET(C,N,E) (*callback->define_set_member)(C##_class,#N,#E,C::E)
00155 #define PADDR(X) ((char*)&(this->X)-(char*)this)
00156 
00157 /******************************************************************************
00158  * Exception handling
00159  */
00199 #define GL_TRY { EXCEPTIONHANDLER *_handler = (*callback->exception.create_exception_handler)(); if (_handler==NULL) (*callback->output_error)("%s(%d): exception handler creation failed",__FILE__,__LINE__); else if (setjmp(_handler->buf)==0) {
00200 
00205 #define GL_THROW (*callback->exception.throw_exception)
00206 
00213 #define GL_CATCH(Msg) } else {Msg = (*callback->exception.exception_msg)();
00214 
00216 #define GL_ENDCATCH } (*callback->exception.delete_exception_handler)(_handler);}
00217 
00219 /******************************************************************************
00220  * Output functions
00221  */
00231 #define gl_verbose (*callback->output_verbose)
00232 
00236 #define gl_output (*callback->output_message)
00237 
00241 #define gl_warning (*callback->output_warning)
00242 
00246 #define gl_error (*callback->output_error)
00247 
00251 #define gl_debug (*callback->output_debug)
00252 
00256 #define gl_testmsg (*callback->output_test)
00257 
00259 /******************************************************************************
00260  * Memory allocation
00261  */
00273 #define gl_malloc (*callback->malloc)
00274 
00276 /******************************************************************************
00277  * Core access
00278  */
00290 #define set_callback(CT) (callback=(CT))
00291 
00295 #define gl_get_module_var (*callback->get_module_var)
00296 
00300 #define gl_findfile (*callback->file.find_file)
00301 
00302 #define gl_find_module (*callback->module_find)
00303 
00305 /******************************************************************************
00306  * Class registration
00307  */
00319 #define gl_register_class (*callback->register_class)
00320 
00322 /******************************************************************************
00323  * Object management
00324  */
00335 #define gl_create_object (*callback->create_single)
00336 
00340 #define gl_create_array (*callback->create_array)
00341 
00348 #ifdef __cplusplus
00349 inline bool gl_object_isa(OBJECT *obj, 
00350                           char *type) 
00351 { return (*callback->object_isa)(obj,type)!=0;}
00352 #else
00353 #define gl_object_isa (*callback->object_isa)
00354 #endif
00355 
00359 #define gl_publish_variable (*callback->define_map)
00360 
00364 #ifdef __cplusplus
00365 inline FUNCTION *gl_publish_function(CLASS *oclass, 
00366                                      FUNCTIONNAME functionname, 
00367                                      FUNCTIONADDR call) 
00368 { return (*callback->define_function)(oclass, functionname, call);}
00369 #else
00370 #define gl_publish_function (*callback->define_function)
00371 #endif
00372 
00379 #ifdef __cplusplus
00380 inline int gl_set_dependent(OBJECT *obj, 
00381                             OBJECT *dep) 
00382 { return (*callback->set_dependent)(obj,dep);}
00383 #else
00384 #define gl_set_dependent (*callback->set_dependent)
00385 #endif
00386 
00395 #ifdef __cplusplus
00396 inline int gl_set_parent(OBJECT *obj, 
00397                          OBJECT *parent) 
00398 { return (*callback->set_parent)(obj,parent);}
00399 #else
00400 #define gl_set_parent (*callback->set_parent)
00401 #endif
00402 
00411 #ifdef __cplusplus
00412 inline int gl_set_rank(OBJECT *obj, 
00413                        int rank)    
00414 { return (*callback->set_rank)(obj,rank);}
00415 #else
00416 #define gl_set_rank (*callback->set_rank)
00417 #endif
00418 
00421 /******************************************************************************
00422  * Property management
00423  */
00435 #define gl_register_type (*callback->register_type)
00436 
00440 #define gl_publish_delegate (*callback->define_type)
00441 
00445 #ifdef __cplusplus
00446 inline PROPERTY *gl_get_property(OBJECT *obj, 
00447                                  PROPERTYNAME name) 
00448 { return (*callback->properties.get_property)(obj,name); }
00449 #else
00450 #define gl_get_property (*callback->properties.get_property)
00451 #endif
00452 
00456 #ifdef __cplusplus
00457 inline int gl_get_value(OBJECT *obj, 
00458                         void *addr, 
00459                         char *value, 
00460                         int size, 
00461                         PROPERTY *prop=NULL) 
00462 { return (*callback->properties.get_value_by_addr)(obj,addr,value,size,prop);}
00463 #else
00464 #define gl_get_value (*callback->properties.get_value_by_addr)
00465 #endif
00466 
00470 #ifdef __cplusplus
00471 inline int gl_set_value(OBJECT *obj, 
00472                         void *addr, 
00473                         char *value, 
00474                         PROPERTY *prop) 
00475 { return (*callback->properties.set_value_by_addr)(obj,addr,value,prop);}
00476 #else
00477 #define gl_set_value (*callback->properties.set_value_by_addr)
00478 #endif
00479 
00483 #define gl_get_reference (*callback->properties.get_reference)
00484 
00488 #ifdef __cplusplus
00489 inline int gl_get_value_by_name(OBJECT *obj, 
00490                                 PROPERTYNAME name, 
00491                                 char *value, 
00492                                 int size)
00493 { return (*callback->properties.get_value_by_name)(obj,name,value,size);}
00494 #else
00495 #define gl_get_value_by_name (*callback->properties.get_value_by_name)
00496 #endif
00497 
00501 #define gl_set_value_by_name (*callback->properties.set_value_by_name)
00502 
00506 #define gl_get_unit (*callback->properties.get_unit)
00507 
00511 #define gl_convert (*callback->unit_convert)
00512 
00516 #define gl_convert_ex (*callback->unit_convert_ex)
00517 
00518 #define gl_get_object (*callback->get_object)
00519 
00520 #define gl_get_object_prop (*callback->objvar.object_var)
00521 
00525 #define gl_get_complex (*callback->objvar.complex_var)
00526 
00527 #define gl_get_complex_by_name (*callback->objvarname.complex_var)
00528 
00529 #define gl_get_int16 (*callback->objvar.int16_var)
00530 
00531 #define gl_get_int16_by_name (*callback->objvarname.int16_var)
00532 
00533 #define gl_get_int32_by_name (*callback->objvarname.int32_var)
00534 
00535 #define gl_get_int32 (*callback->objvar.int32_var)
00536 
00537 #define gl_get_int64_by_name (*callback->objvarname.int64_var)
00538 
00539 #define gl_get_int64 (*callback->objvar.int64_var)
00540 
00541 #define gl_get_double_by_name (*callback->objvarname.double_var)
00542 
00543 #define gl_get_double (*callback->objvar.double_var)
00544 
00545 #define gl_get_string_by_name (*callback->objvarname.string_var)
00546 
00547 #define gl_get_string (*callback->objvar.string_var)
00548 
00551 /******************************************************************************
00552  * Object search
00553  */
00563 #define gl_find_objects (*callback->find_objects)
00564 
00568 #define gl_find_next (*callback->find_next)
00569 
00573 #define gl_free (*callback->free)
00574 
00578 #define gl_create_aggregate (*callback->create_aggregate)
00579 
00583 #define gl_run_aggregate (*callback->run_aggregate)
00584 
00586 /******************************************************************************
00587  * Random number generation
00588  */
00600 #define gl_randomtype (*callback->random.type)
00601 
00605 #define gl_randomvalue (*callback->random.value)
00606 
00610 #define gl_random_uniform (*callback->random.uniform)
00611 
00615 #define gl_random_normal (*callback->random.normal)
00616 
00620 #define gl_random_lognormal (*callback->random.lognormal)
00621 
00625 #define gl_random_bernoulli (*callback->random.bernoulli)
00626 
00630 #define gl_random_pareto (*callback->random.pareto)
00631 
00635 #define gl_random_sampled (*callback->random.sampled)
00636 
00640 #define gl_random_exponential (*callback->random.exponential)
00641 
00643 /******************************************************************************
00644  * Timestamp handling
00645  */
00653 #define gl_parsetime (*callback->time.convert_to_timestamp)
00654 
00658 #define gl_mktime (*callback->time.mkdatetime)
00659 
00663 #define gl_strtime (*callback->time.strdatetime)
00664 
00668 #define gl_todays (*callback->time.timestamp_to_days)
00669 
00673 #define gl_tohours (*callback->time.timestamp_to_hours)
00674 
00678 #define gl_tominutes (*callback->time.timestamp_to_minutes)
00679 
00683 #define gl_toseconds (*callback->time.timestamp_to_seconds)
00684 
00688 #define gl_localtime (*callback->time.local_datetime)
00689 
00690 /******************************************************************************
00691  * Global variables
00692  */
00700 #define gl_global_create (*callback->global.create)
00701 
00705 #define gl_global_setvar (*callback->global.setvar)
00706 
00710 #define gl_global_getvar (*callback->global.getvar)
00711 
00715 #define gl_global_find (*callback->global.find)
00716 
00718 #define gl_get_oflags (*callback->get_oflags)
00719 #ifdef __cplusplus
00720 
00724 inline double clip(double x, 
00725                    double a, 
00726                    double b) 
00727 {
00728     if (x<a) return a;
00729     else if (x>b) return b;
00730     else return x;
00731 }
00732 
00736 inline char bitof(unsigned int64 x,
00737                            bool use_throw=false) 
00738 {
00739     char n=0;
00740     if (x==0)
00741     {
00742         if (use_throw)
00743             throw "bitof empty bit pattern";
00744         return -0x7f;
00745     }
00746     while ((x&1)==0)
00747     {
00748         x>>=1;
00749         n++;
00750     }
00751     if (x!=0)
00752     {
00753         if (use_throw)
00754             throw "bitof found more than one bit";
00755         else
00756             return -n;
00757     }
00758     return n;
00759 }
00760 #endif
00761 
00762 
00764 #endif

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