core/class.h

Go to the documentation of this file.
00001 
00007 #ifndef _CLASS_H
00008 #define _CLASS_H
00009 
00010 #include <stdarg.h>
00011 #include <stdlib.h>
00012 #include <stdio.h>
00013 #include <string.h>
00014 #include <errno.h>
00015 #include <time.h>
00016 
00017 #include "platform.h"
00018 #include "complex.h"
00019 #include "unit.h"
00020 
00021 typedef struct s_class_list CLASS;
00022 
00023 /* Valid GridLAB data types */
00024 typedef char char1024[1025]; 
00025 typedef char char256[257]; 
00026 typedef char char32[33]; 
00027 typedef char char8[9]; 
00028 typedef char int8; 
00029 typedef short int16; 
00030 typedef int int32; /* 32-bit integers */
00031 typedef long enumeration; /* enumerations (any one of a list of values) */
00032 typedef struct s_object_list* object; /* GridLAB objects */
00033 typedef unsigned int64 set; /* sets (each of up to 64 values may be defined) */
00034 typedef double triplet[3];
00035 typedef complex triplex[3];
00036 
00037 #ifndef __cplusplus
00038 typedef unsigned char bool;
00039 #define true (1)
00040 #define false (0)
00041 #endif
00042 
00043 
00044 /* delegated types allow module to keep all type operations private
00045  * this includes convert operations and allocation/deallocation
00046  */
00047 typedef struct s_delegatedtype
00048 {
00049     char32 type; 
00050     CLASS *oclass; 
00051     int (*from_string)(void *addr, char *value); 
00052     int (*to_string)(void *addr, char *value, int size); 
00053 } DELEGATEDTYPE; 
00054 typedef struct s_delegatedvalue
00055 {
00056     char *data; 
00057     DELEGATEDTYPE *type; 
00058 } DELEGATEDVALUE; 
00059 typedef DELEGATEDVALUE* delegated; /* delegated data type */
00060 
00061 /* int64 is already defined in platform.h */
00062 typedef enum {_PT_FIRST=-1, 
00063     PT_void, 
00064     PT_double, 
00065     PT_complex, 
00066     PT_enumeration, 
00067     PT_set, 
00068     PT_int16, 
00069     PT_int32, 
00070     PT_int64, 
00071     PT_char8, 
00072     PT_char32, 
00073     PT_char256, 
00074     PT_char1024, 
00075     PT_object, 
00076     PT_delegated, 
00077     PT_bool, 
00078     PT_timestamp, 
00079     PT_double_array, 
00080     PT_complex_array, 
00081 /*  PT_object_array, */ 
00082 #ifdef USE_TRIPLETS
00083     PT_triple, 
00084     PT_triplex, 
00085 #endif
00086     _PT_LAST, 
00087     /* never put these before _PT_LAST they have special uses */
00088     PT_AGGREGATE, /* internal use only */
00089     PT_KEYWORD, /* used to add an enum/set keyword definition */
00090     PT_ACCESS, /* used to specify property access rights */
00091     PT_SIZE, /* used to setup arrayed properties */
00092     PT_FLAGS, /* used to indicate property flags next */
00093 } PROPERTYTYPE; 
00094 typedef char CLASSNAME[32]; 
00095 typedef unsigned short OBJECTTYPE; 
00096 typedef void* PROPERTYADDR; 
00097 typedef char PROPERTYNAME[64]; 
00098 typedef char FUNCTIONNAME[64]; 
00099 typedef enum {
00100     PA_PUBLIC, 
00101     PA_REFERENCE, 
00102     PA_PROTECTED, 
00103     PA_PRIVATE, 
00104 } PROPERTYACCESS; 
00105 typedef int64 (*FUNCTIONADDR)(void*,...); 
00107 /* pass configuration */
00108 typedef unsigned char PASSCONFIG; 
00109 #define PC_NOSYNC 0x00 
00110 #define PC_PRETOPDOWN 0x01 
00111 #define PC_BOTTOMUP 0x02 
00112 #define PC_POSTTOPDOWN 0x04 
00114 typedef enum {
00115     NM_PREUPDATE = 0, 
00116     NM_POSTUPDATE = 1, 
00117     NM_RESET = 2,
00118 } NOTIFYMODULE; 
00120 typedef struct s_keyword {
00121     char name[32];
00122     unsigned long value;
00123     struct s_keyword *next;
00124 } KEYWORD;
00125 
00126 typedef unsigned long PROPERTYFLAGS;
00127 #define PF_RECALC   0x0001 
00128 #define PF_CHARSET  0x0002 
00130 typedef struct s_property_map {
00131     OBJECTTYPE otype; 
00132     PROPERTYNAME name; 
00133     PROPERTYTYPE ptype; 
00134     unsigned long size; 
00135     PROPERTYACCESS access; 
00136     UNIT *unit; 
00137     PROPERTYADDR addr; 
00138     DELEGATEDTYPE *delegation; 
00139     KEYWORD *keywords; 
00140     struct s_property_map *next; 
00141     PROPERTYFLAGS flags; 
00142 } PROPERTY; 
00144 typedef struct s_function_map {
00145     OBJECTTYPE otype;
00146     FUNCTIONNAME name;
00147     FUNCTIONADDR addr;
00148     struct s_function_map *next;
00149 } FUNCTION;
00150 
00151 /* Set operations */
00152 #define SET_MASK 0xffff
00153 #define SET_ADD(set,value) (set = set | value )
00154 #define SET_DEL(set,value) (set = (value^SET_MASK)&set)//SET_HAS(set,value)?set^value:set)
00155 #define SET_CLEAR(set) (set = 0)
00156 #define SET_HAS(set,value) (set & value)
00157 
00158 #define _MODULE_DEFINED_
00159 typedef struct s_module_list MODULE;
00160 struct s_class_list {
00161     OBJECTTYPE type;
00162     CLASSNAME name;
00163     MODULE *module; 
00164     PROPERTY *pmap;
00165     FUNCTION *fmap;
00166     FUNCTIONADDR create;
00167     FUNCTIONADDR init;
00168     FUNCTIONADDR sync;
00169     FUNCTIONADDR notify;
00170     FUNCTIONADDR isa;
00171     FUNCTIONADDR plc;
00172     PASSCONFIG passconfig;
00173     FUNCTIONADDR recalc;
00174     struct {
00175         int32 numobjs;
00176         int64 clocks;
00177         int32 count;
00178     } profiler;
00179     struct s_class_list *next;
00180 }; /* CLASS */
00181 
00182 #ifdef __cplusplus
00183 extern "C" {
00184 #endif
00185 
00186 PROPERTY *class_get_first_property(CLASS *oclass);
00187 PROPERTY *class_get_next_property(PROPERTY *prop);
00188 PROPERTY *class_find_property(CLASS *oclass, PROPERTYNAME name);
00189 PROPERTYTYPE class_get_propertytype_from_typename(char *name);
00190 int class_string_to_property(PROPERTY *prop, void *addr, char *value);
00191 int class_property_to_string(PROPERTY *prop, void *addr, char *value, int size);
00192 CLASS *class_get_first_class(void);
00193 CLASS *class_get_last_class(void);
00194 CLASS *class_get_class_from_classname(char *name);
00195 CLASS *class_get_class_from_classname_in_module(char *name, MODULE *mod);
00196 char *class_get_property_typename(PROPERTYTYPE type);
00197 int class_saveall(FILE *fp);
00198 int class_saveall_xml(FILE *fp);
00199 unsigned int class_get_count(void);
00200 void class_profiles(void);
00201 int class_get_xsd(CLASS *oclass, char *buffer, size_t len);
00202 
00203 CLASS *class_register(MODULE *module,CLASSNAME classname,PASSCONFIG passconfig);
00204 int class_define_map(CLASS *oclass, ...);
00205 int class_define_enumeration_member(CLASS *oclass,char *property_name,char *member,enumeration value);
00206 int class_define_set_member(CLASS *oclass,char *property_name,char *member,unsigned long value);
00207 FUNCTION *class_define_function(CLASS *oclass, FUNCTIONNAME functionname, FUNCTIONADDR call);
00208 DELEGATEDTYPE *class_register_type(CLASS *oclass, char *type,int (*from_string)(void*,char*),int (*to_string)(void*,char*,int));
00209 int class_define_type(CLASS *oclass, DELEGATEDTYPE *delegation, ...);
00210 
00211 unsigned long property_size(PROPERTY *prop);
00212 
00213 #ifdef __cplusplus
00214 }
00215 #endif
00216 
00217 #endif
00218 
00219 /* EOF */

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