Index: trunk/psLib/src/collections/psMetadata.c
===================================================================
--- trunk/psLib/src/collections/psMetadata.c	(revision 3286)
+++ trunk/psLib/src/collections/psMetadata.c	(revision 3341)
@@ -12,6 +12,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.52 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-02-18 22:17:20 $
+*  @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-28 23:34:10 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -80,5 +80,5 @@
     psFree(metadataItem->name);
     psFree(metadataItem->comment);
-    if (type != PS_META_PRIMITIVE) {
+    if (! PS_META_IS_PRIMITIVE(type)) {
         psFree(metadataItem->data.V);
     }
@@ -98,5 +98,5 @@
 /*****************************************************************************/
 
-psMetadataItem* psMetadataItemAlloc(const char *name, psElemType pType, psMetadataType type,
+psMetadataItem* psMetadataItemAlloc(const char *name, psMetadataType type,
                                     const char *comment, ...)
 {
@@ -108,5 +108,5 @@
 
     // Call metadata item allocation
-    metadataItem = psMetadataItemAllocV(name, pType, type, comment, argPtr);
+    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
 
     // Clean up stack after variable arguement has been used
@@ -116,5 +116,19 @@
 }
 
-psMetadataItem* psMetadataItemAllocV(const char *name, psElemType pType, psMetadataType type,
+#define METADATAITEM_ALLOC_TYPE(NAME,TYPE,METATYPE) \
+psMetadataItem* psMetadataItemAlloc##NAME(const char* name, \
+        const char* comment, \
+        TYPE value) \
+{ \
+    return psMetadataItemAlloc(name, METATYPE, comment, value); \
+}
+
+METADATAITEM_ALLOC_TYPE(Str,const char*,PS_META_STR)
+METADATAITEM_ALLOC_TYPE(F32,psF32,PS_META_F32)
+METADATAITEM_ALLOC_TYPE(F64,psF64,PS_META_F64)
+METADATAITEM_ALLOC_TYPE(S32,psS32,PS_META_S32)
+METADATAITEM_ALLOC_TYPE(Bool,psBool,PS_META_BOOL)
+
+psMetadataItem* psMetadataItemAllocV(const char *name, psMetadataType type,
                                      const char *comment, va_list argPtr)
 {
@@ -145,5 +159,4 @@
     // Set metadata item type
     metadataItem->type = type;
-    metadataItem->pType = pType;
 
     // Allocate and set metadata item name
@@ -153,23 +166,15 @@
     // Set metadata item value
     switch(type) {
-    case PS_META_PRIMITIVE:
-        switch(pType) {
-        case PS_TYPE_BOOL:
-            metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
-            break;
-        case PS_TYPE_S32:
-            metadataItem->data.S32 = (psS32)va_arg(argPtr, psS32);
-            break;
-        case PS_TYPE_F32:
-            metadataItem->data.F32 = (psF32)va_arg(argPtr, psF64);
-            break;
-        case PS_TYPE_F64:
-            metadataItem->data.F64 = (psF64)va_arg(argPtr, psF64);
-            break;
-        default:
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
-            psFree(metadataItem);
-            metadataItem = NULL;
-        }
+    case PS_META_BOOL:
+        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
+        break;
+    case PS_META_S32:
+        metadataItem->data.S32 = (psS32)va_arg(argPtr, psS32);
+        break;
+    case PS_META_F32:
+        metadataItem->data.F32 = (psF32)va_arg(argPtr, psF64);
+        break;
+    case PS_META_F64:
+        metadataItem->data.F64 = (psF64)va_arg(argPtr, psF64);
         break;
     case PS_META_STR:
@@ -186,5 +191,5 @@
     case PS_META_UNKNOWN:
         // Copy of input data not performed due to variability of data types
-        metadataItem->data.V = va_arg(argPtr, psPtr);
+        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
         break;
     default:
@@ -256,5 +261,5 @@
 
             // Leaf node replaces another leaf. Make new folder node and add leaves.
-            newFolderEntry = psMetadataItemAlloc(key, PS_TYPE_PTR, PS_META_LIST, NULL, NULL);
+            newFolderEntry = psMetadataItemAlloc(key, PS_META_LIST, NULL, NULL);
             newFolderEntry->data.list = psListAlloc(NULL);
 
@@ -328,5 +333,5 @@
 }
 
-psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name, psElemType pType,
+psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name,
                      psMetadataType type, const char *comment, ...)
 {
@@ -335,5 +340,5 @@
 
     va_start(argPtr, comment);
-    metadataItem = psMetadataItemAllocV(name, pType, type, comment, argPtr);
+    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
     va_end(argPtr);
 
@@ -348,4 +353,21 @@
     return true;
 }
+
+#define METADATA_ADD_TYPE(NAME,TYPE,METATYPE) \
+psBool psMetadataAdd##NAME(psMetadata* md, psS32 where, const char* name, \
+                           const char* comment, TYPE value) { \
+    return psMetadataAdd(md,where,name, METATYPE,comment,value); \
+}
+
+METADATA_ADD_TYPE(S32,psS32,PS_META_S32)
+METADATA_ADD_TYPE(F32,psF32,PS_META_F32)
+METADATA_ADD_TYPE(F64,psF64,PS_META_F64)
+METADATA_ADD_TYPE(List,psList*,PS_META_LIST)
+METADATA_ADD_TYPE(Str,const char*,PS_META_STR)
+METADATA_ADD_TYPE(Vector,psVector*,PS_META_VEC)
+METADATA_ADD_TYPE(Image,psImage*,PS_META_IMG)
+METADATA_ADD_TYPE(Hash,psHash*,PS_META_HASH)
+METADATA_ADD_TYPE(LookupTable,psLookupTable*,PS_META_LOOKUPTABLE)
+METADATA_ADD_TYPE(Unknown,void*,PS_META_UNKNOWN)
 
 psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
@@ -435,12 +457,11 @@
     }
 
-    if(metadataItem->type == PS_META_PRIMITIVE && metadataItem->pType != PS_TYPE_PTR) {
+    if(PS_META_IS_PRIMITIVE(metadataItem->type)) {
         if (status) {
             *status = false;
         }
         psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                PS_ERRORTEXT_psMetadata_METATYPE_MISMATCH,
-                metadataItem->pType,
-                PS_TYPE_PTR);
+                PS_ERRORTEXT_psMetadata_METATYPE_INVALID,
+                metadataItem->type);
         return NULL;
     } else {
@@ -467,31 +488,25 @@
     } \
     \
-    if (metadataItem->type == PS_META_PRIMITIVE) { \
-        switch (metadataItem->pType) { \
-        case PS_TYPE_S32: \
-            value = (ps##TYPE)metadataItem->data.S32; \
-            break; \
-        case PS_TYPE_F32: \
-            value = (ps##TYPE)metadataItem->data.F32; \
-            break; \
-        case PS_TYPE_F64: \
-            value = (ps##TYPE)metadataItem->data.F64; \
-            break; \
-        case PS_TYPE_BOOL: \
-            if (metadataItem->data.B) { \
-                value = 1; \
-            } \
-            break; \
-        default: \
-            /* if you get to this point, the value is not a number. */ \
-            if (status) { \
-                *status = false; \
-            } \
-            break; \
+    switch (metadataItem->type) { \
+    case PS_META_S32: \
+        value = (ps##TYPE)metadataItem->data.S32; \
+        break; \
+    case PS_META_F32: \
+        value = (ps##TYPE)metadataItem->data.F32; \
+        break; \
+    case PS_META_F64: \
+        value = (ps##TYPE)metadataItem->data.F64; \
+        break; \
+    case PS_META_BOOL: \
+        if (metadataItem->data.B) { \
+            value = 1; \
         } \
-    } else { \
+        break; \
+    default: \
+        /* if you get to this point, the value is not a number. */ \
         if (status) { \
             *status = false; \
         } \
+        break; \
     } \
     \
