/* * $Id: tmsubject.h,v 1.2 2004/12/11 17:08:13 jan Exp $ * * Copyright (c) 2002 Jan Algermissen * See the file "COPYING" for copying permission. * */ #ifndef TM_SUBJECT_H #define TM_SUBJECT_H #ifdef __cplusplus extern "C" { #endif enum { TM_TVAL_TOPIC = 1, TM_TVAL_SUBJECT, TM_TVAL_SYMBOL }; /** \defgroup TMSubject * \ingroup AbstractDataTypes * * @{ */ /** TMSubject data type. * A subject is a collection of property/value pairs. */ typedef struct TMSubject *TMSubject; #include "tmvaluetype.h" #include "tmproperty.h" struct TMSubject { TMTopic topic; char *symbol; int N; struct { TMProperty prop; void *value; int vflags; } props[TM_MAXPROPERTIES]; }; /** \def TM_STATIC_SUBJECT_N1(var,model,prop,value) * Create a static subject variable with one property as specified * by the arguments. * * FIXME: static is missing now to allow importing of subjects into other TMAs. */ /* #define TM_STATIC_SUBJECT_N1( var , model , prop , value ) \ struct TMSubject var = { 1, { { NULL,model,prop,value,NULL} } } */ /** \def TM_INIT_SUBJECT(s) * Assign one property to the TMSubject given by \a s */ #define TM_INIT_SUBJECT(s) \ do { \ (s)->topic = 0; \ (s)->symbol = NULL; \ (s)->N = 0; \ } while(0) /** \def TM_INIT_SUBJECT_N1(s,p,v,f) * Assign one property to the TMSubject given by \a s */ #define TM_INIT_SUBJECT_N1(s,p,v,f) \ do { \ (s)->topic = 0; \ (s)->symbol = NULL; \ (s)->N = 1; \ (s)->props[0].prop = (p); \ (s)->props[0].value = (v); \ (s)->props[0].vflags = (f); \ } while(0) /** \def TM_INIT_SUBJECT_N2(s, p1,v1,f1, p2,v2,f2) * Assign two properties to the TMSubject given by \a s */ #define TM_INIT_SUBJECT_N2(s, p1,v1,f1, p2,v2,f2) \ do { \ (s)->topic = 0; \ (s)->symbol = NULL; \ (s)->N = 2; \ (s)->props[0].prop = (p1); \ (s)->props[0].value = (v1); \ (s)->props[0].vflags = (f1); \ (s)->props[1].prop = (p2); \ (s)->props[1].value = (v2); \ (s)->props[1].vflags = (f2); \ } while(0) /** \def TM_SUBJECT_ADD(s,p,v,f) * Add a property to the TMSubject given by \a s */ #define TM_SUBJECT_ADD(s,p,v,f) \ do { \ (s)->props[(s)->N].prop = (p); \ (s)->props[(s)->N].value = (v); \ (s)->props[(s)->N].vflags = (f); \ (s)->N++; \ } while(0) #define TM_SUBJECT_COPY_PROPS(dest,source) do { \ int i; \ for(i=0;i<(source)->N;i++) { \ (dest)->props[i].prop = (source)->props[i].prop; \ (dest)->props[i].value = (source)->props[i].value; \ (dest)->props[i].vflags = (source)->props[i].vflags; \ }\ (dest)->N = (source)->N; \ } while(0) TM_API(int) tm_subject_get_value(TMSubject self,const char *propname, void **value); TM_API(int) tm_subject_replace_value(TMSubject self,const char *propname, void *value, int vflags); TM_API(void) tm_subject_free_values(TMPool pool,TMSubject sbj); /** @} */ #ifdef __cplusplus } // extern C #endif #endif