Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Switch to C++
[simgrid.git] / include / xbt / swag.h
index de5d207..0017a38 100644 (file)
@@ -1,6 +1,5 @@
-/*     $Id$     */
-
-/* Copyright (c) 2004 Arnaud Legrand. All rights reserved.                */
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -39,10 +38,10 @@ SG_BEGIN_DECL()
     those structs directly. Use them as an abstract datatype.
 */
 /* @{ */
-     typedef struct xbt_swag_hookup {
-       void *next;
-       void *prev;
-     } s_xbt_swag_hookup_t;
+typedef struct xbt_swag_hookup {
+  void *next;
+  void *prev;
+} s_xbt_swag_hookup_t;
 /**< This type should be added to a type that is to be used in a swag. 
  *
  *  Whenever a new object with this struct is created, all fields have
@@ -69,15 +68,15 @@ typedef struct foo {
 }
 \endcode
 */
-     typedef s_xbt_swag_hookup_t *xbt_swag_hookup_t;
+typedef s_xbt_swag_hookup_t *xbt_swag_hookup_t;
 
 
-     typedef struct xbt_swag {
-       void *head;
-       void *tail;
-       size_t offset;
-       int count;
-     } s_xbt_swag_t, *xbt_swag_t;
+typedef struct xbt_swag {
+  void *head;
+  void *tail;
+  size_t offset;
+  int count;
+} s_xbt_swag_t, *xbt_swag_t;
 /**< A typical swag */
 /* @} */
 
@@ -90,21 +89,38 @@ typedef struct foo {
 XBT_PUBLIC(xbt_swag_t) xbt_swag_new(size_t offset);
 XBT_PUBLIC(void) xbt_swag_free(xbt_swag_t swag);
 XBT_PUBLIC(void) xbt_swag_init(xbt_swag_t swag, size_t offset);
-XBT_PUBLIC(void) xbt_swag_insert(void *obj, xbt_swag_t swag);
+
+/**
+ * \brief Makes a swag empty.
+ * \param swag a swag
+ * @hideinitializer
+ */
+#define xbt_swag_reset(swag) do {} while(xbt_swag_extract(swag))
+
+/**
+ * \param obj the objet to insert in the swag
+ * \param swag a swag
+ * @hideinitializer
+ *
+ * insert \a obj in \a swag
+ */
+#define xbt_swag_insert(obj, swag) xbt_swag_insert_at_tail(obj, swag)
+
 XBT_PUBLIC(void) xbt_swag_insert_at_head(void *obj, xbt_swag_t swag);
 XBT_PUBLIC(void) xbt_swag_insert_at_tail(void *obj, xbt_swag_t swag);
 XBT_PUBLIC(void *) xbt_swag_remove(void *obj, xbt_swag_t swag);
 XBT_PUBLIC(void *) xbt_swag_extract(xbt_swag_t swag);
 XBT_PUBLIC(int) xbt_swag_size(xbt_swag_t swag);
-XBT_PUBLIC(int) xbt_swag_belongs(void *obj, xbt_swag_t swag);
 
-     static XBT_INLINE void *xbt_swag_getFirst(xbt_swag_t swag)
+#define xbt_swag_getPrev(obj, offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev)
+#define xbt_swag_getNext(obj, offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next)
+#define xbt_swag_belongs(obj, swag) (xbt_swag_getNext((obj), (swag)->offset) || (swag)->tail == (obj))
+
+static XBT_INLINE void *xbt_swag_getFirst(xbt_swag_t swag)
 {
   return (swag->head);
 }
 
-#define xbt_swag_getNext(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev)
-#define xbt_swag_getPrev(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next)
 
 /**
  * \brief Offset computation
@@ -133,11 +149,17 @@ XBT_PUBLIC(int) xbt_swag_belongs(void *obj, xbt_swag_t swag);
   *  @param swag what to iterate over
   *  @warning you cannot modify the \a swag while using this loop
   *  @hideinitializer */
+#ifndef __cplusplus
 #define xbt_swag_foreach(obj,swag)                            \
    for((obj)=xbt_swag_getFirst((swag));                       \
        (obj)!=NULL;                                           \
        (obj)=xbt_swag_getNext((obj),(swag)->offset))
-
+#else
+#define xbt_swag_foreach(obj,swag)                            \
+   for((obj)=(decltype(obj)) xbt_swag_getFirst((swag));         \
+       (obj)!=NULL;                                           \
+       (obj)=(decltype(obj)) xbt_swag_getNext((obj),(swag)->offset))
+#endif
 /**
  * @brief A safe swag iterator 
  * @param obj the indice of the loop
@@ -152,7 +174,7 @@ XBT_PUBLIC(int) xbt_swag_belongs(void *obj, xbt_swag_t swag);
 #define xbt_swag_foreach_safe(obj,obj_next,swag)                  \
    for((obj)=xbt_swag_getFirst((swag)),                           \
        ((obj)?(obj_next=xbt_swag_getNext((obj),(swag)->offset)):  \
-                (obj_next=NULL));                                \
+           (obj_next=NULL));                                \
        (obj)!=NULL;                                               \
        (obj)=obj_next,                                            \
        ((obj)?(obj_next=xbt_swag_getNext((obj),(swag)->offset)):  \
@@ -160,4 +182,4 @@ XBT_PUBLIC(int) xbt_swag_belongs(void *obj, xbt_swag_t swag);
 /* @} */
 
 SG_END_DECL()
-#endif /* _XBT_SWAG_H */
+#endif                          /* _XBT_SWAG_H */