SG_BEGIN_DECL()
/** @addtogroup XBT_dynar
- * @brief DynArr are dynamically sized vector which may contain any type of variables.
- *
- * These are the SimGrid version of the dynamically size arrays, which all C programmer recode one day or another.
- *
- * For performance concerns, the content of DynArr must be homogeneous (in contrary to dictionnaries -- see the
- * \ref XBT_dict section). You thus have to provide the function which will be used to free the content at
- * structure creation (of type void_f_pvoid_t).
- *
- * @deprecated If you are using C++, you might want to use `std::vector` instead.
- *
- * \section XBT_dynar_exscal Example with scalar
- * \dontinclude dynar.cpp
- *
- * \skip Vars_decl
- * \skip dyn
- * \until iptr
- * \skip Populate_ints
- * \skip dyn
- * \until end_of_traversal
- * \skip shifting
- * \skip val
- * \until xbt_dynar_free
- *
- * \section XBT_dynar_exptr Example with pointed data
- *
- * \skip test_dynar_string
- * \skip dynar_t
- * \until s2
- * \skip Populate_str
- * \skip dyn
- * \until }
- * \skip macro
- * \until dynar_free
- * \skip end_of_doxygen
- * \until }
- *
- * Note that if you use dynars to store pointed data, the xbt_dynar_search(), xbt_dynar_search_or_negative() and
- * xbt_dynar_member() won't be for you. Instead of comparing your pointed elements, they compare the pointer to them.
- * See the documentation of xbt_dynar_search() for more info.
- */
+ * @brief DynArr are dynamically sized vector which may contain any type of variables.
+ *
+ * These are the SimGrid version of the dynamically size arrays, which all C programmer recode one day or another.
+ *
+ * For performance concerns, the content of DynArr must be homogeneous (in contrary to dictionnaries -- see the
+ * @ref XBT_dict section). You thus have to provide the function which will be used to free the content at
+ * structure creation (of type void_f_pvoid_t).
+ *
+ * @deprecated If you are using C++, you might want to use `std::vector` instead.
+ *
+ * @section XBT_dynar_exscal Example with scalar
+ * @dontinclude dynar.cpp
+ *
+ * @skip Vars_decl
+ * @skip dyn
+ * @until iptr
+ * @skip Populate_ints
+ * @skip dyn
+ * @until end_of_traversal
+ * @skip shifting
+ * @skip val
+ * @until xbt_dynar_free
+ *
+ * @section XBT_dynar_exptr Example with pointed data
+ *
+ * @skip test_dynar_string
+ * @skip dynar_t
+ * @until s2
+ * @skip Populate_str
+ * @skip dyn
+ * @until }
+ * @skip macro
+ * @until dynar_free
+ * @skip end_of_doxygen
+ * @until }
+ *
+ * Note that if you use dynars to store pointed data, the xbt_dynar_search(), xbt_dynar_search_or_negative() and
+ * xbt_dynar_member() won't be for you. Instead of comparing your pointed elements, they compare the pointer to them.
+ * See the documentation of xbt_dynar_search() for more info.
+ */
/** @defgroup XBT_dynar_cons Dynar constructor and destructor
* @ingroup XBT_dynar
*
* @{
*/
- /** \brief Dynar data type (opaque type) */
+/** @brief Dynar data type (opaque type) */
typedef struct xbt_dynar_s *xbt_dynar_t;
XBT_PUBLIC xbt_dynar_t xbt_dynar_new(const unsigned long elm_size, void_f_pvoid_t const free_f);
XBT_PUBLIC void xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int* const cursor);
/*
- * \warning DO NOT USE THIS STRUCTURE DIRECTLY! Instead, use the public interface:
+ * @warning DO NOT USE THIS STRUCTURE DIRECTLY! Instead, use the public interface:
* This was made public to allow:
* - the inlining of the foreach elements
* - sending such beasts over the network
*
- * \see xbt_dynar_length()
+ * @see xbt_dynar_length()
*/
typedef struct xbt_dynar_s {
unsigned long size;
static inline int _xbt_dynar_cursor_get(const xbt_dynar_t dynar, unsigned int idx, void* const dst)
{
if (!dynar) /* iterating over a NULL dynar is a no-op */
- return false;
+ return 0;
if (idx >= dynar->used) {
//XBT_DEBUG("Cursor on %p already on last elem", (void *) dynar);
- return false;
+ return 0;
}
// XBT_DEBUG("Cash out cursor on %p at %u", (void *) dynar, *idx);
memcpy(dst, ((char *) dynar->data) + idx * dynar->elmsize, dynar->elmsize);
- return true;
+ return 1;
}
/** @brief Iterates over the whole dynar.
* @hideinitializer
*
* Here is an example of usage:
- * \code
+ * @code
xbt_dynar_t dyn;
unsigned int cpt;
string *str;
xbt_dynar_foreach (dyn,cpt,str) {
printf("Seen %s\n",str);
}
-\endcode
+@endcode
*
* Note that underneath, that's a simple for loop with no real black magic involved. It's perfectly safe to interrupt
* a foreach with a break or a return statement.
/** @} */
SG_END_DECL()
+#ifdef __cplusplus
+namespace simgrid {
+namespace xbt {
+/** Dynar of `T*` which `delete` its values */
+template <class T> inline xbt_dynar_t newDeleteDynar()
+{
+ return xbt_dynar_new(sizeof(T*), [](void* p) { delete *(T**)p; });
+}
+}
+}
+#endif
+
#endif /* XBT_DYNAR_H */