]> gerrit.simantics Code Review - simantics/fmil.git/blobdiff - org.simantics.fmil.core/native/FMILibrary/src/Util/include/JM/jm_named_ptr.h
Add FMILibrary-2.0.3 to org.simantics.fmil.core\native.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMILibrary / src / Util / include / JM / jm_named_ptr.h
diff --git a/org.simantics.fmil.core/native/FMILibrary/src/Util/include/JM/jm_named_ptr.h b/org.simantics.fmil.core/native/FMILibrary/src/Util/include/JM/jm_named_ptr.h
new file mode 100644 (file)
index 0000000..150e538
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+    Copyright (C) 2012 Modelon AB
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the BSD style license.
+
+     This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    FMILIB_License.txt file for more details.
+
+    You should have received a copy of the FMILIB_License.txt file
+    along with this program. If not, contact Modelon AB <http://www.modelon.com>.
+*/
+
+#ifndef JM_NAMED_PTR_H
+#define JM_NAMED_PTR_H
+
+#include "jm_vector.h"
+#include "jm_callbacks.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \file jm_named_ptr.h Definition of ::jm_named_ptr and supporting functions
+       *
+       * \addtogroup jm_utils
+       * @{
+               \addtogroup jm_named_ptr
+       * @}
+*/
+/** \addtogroup jm_named_ptr Named objects
+ @{
+*/
+/** \brief Name and object pointer pair */
+typedef struct jm_named_ptr jm_named_ptr;
+
+/** \brief Name and object pointer pair */
+struct jm_named_ptr {
+    jm_voidp ptr; /** \brief Object pointer */
+    jm_string name; /** \brief Name string */
+};
+
+/**
+\brief Allocate memory for the object and the name string and sets pointer to it packed together with the name pointer.
+ \param name Name for the object.
+ \param size Size of the data structure.
+ \param nameoffset Offset of the name field within the data structure.
+ \param c Callbacks to be used for memory allocation.
+
+The function jm_named_alloc() is intended for types defined as:
+\code
+struct T { 
+    < some data fields> 
+    char name[1]; 
+} 
+\endcode
+The "name" is copied into the allocated memory.
+*/
+jm_named_ptr jm_named_alloc(jm_string name, size_t size, size_t nameoffset, jm_callbacks* c);
+
+/** \brief Same as jm_named_alloc() but name is given as a jm_vector(char) pointer */
+jm_named_ptr jm_named_alloc_v(jm_vector(char)* name, size_t size, size_t nameoffset, jm_callbacks* c);
+
+/** \brief Free the memory allocated for the object pointed by jm_named_ptr */
+static void jm_named_free(jm_named_ptr np, jm_callbacks* c) { c->free(np.ptr); }
+
+jm_vector_declare_template(jm_named_ptr)
+
+/** \brief Helper to construct comparison operation */
+#define jm_diff_named(a, b) strcmp(a.name,b.name)
+
+jm_define_comp_f(jm_compare_named, jm_named_ptr, jm_diff_named)
+
+/** \brief Release the data allocated by the items
+  in a vector and then clears the memory used by the vector as well.
+
+  This should be used for vectors initialized with jm_vector_init.
+*/
+static void jm_named_vector_free_data(jm_vector(jm_named_ptr)* v) {
+    jm_vector_foreach_c(jm_named_ptr)(v, (void (*)(jm_named_ptr, void*))jm_named_free,v->callbacks);
+    jm_vector_free_data(jm_named_ptr)(v);
+}
+
+/** \brief Release the data allocated by the items
+  in a vector and then clears the memory used by the vector as well.
+
+  This should be used for vectors created with jm_vector_alloc.
+*/
+static void jm_named_vector_free(jm_vector(jm_named_ptr)* v) {
+    jm_vector_foreach_c(jm_named_ptr)(v,(void (*)(jm_named_ptr, void*))jm_named_free,v->callbacks);
+    jm_vector_free(jm_named_ptr)(v);
+}
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+/* JM_NAMED_PTR_H */
+#endif