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
00093 #define INIT(X)
00094 #endif
00095 CDECL EXPORT EXTERN CALLBACKS *callback INIT(NULL);
00096 #undef INIT
00097 #undef EXTERN
00098
00099
00100
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
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
00149
00152
00155 #define PADDR(X) ((char*)&(this->X)-(char*)this)
00156
00157
00158
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
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
00261
00273 #define gl_malloc (*callback->malloc)
00274
00276
00277
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
00307
00319 #define gl_register_class (*callback->register_class)
00320
00322
00323
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
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
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
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
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
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