No objections here, go ahead.

Cheers,
-0-
This mail may be sent html due to the web-based thing i'm using. Apologies.

On Sun Oct 05 2014 at 8:42:32 PM Martin Natano <[email protected]> wrote:

> I would like to add the SPLAY_GENERATE_STATIC and SPLAY_PROTOTYPE_STATIC
> macros to tree.h. I think this is a good idea for two reasons: First,
> external linkage is potentially counter-productive when not required.
> Second, to increase interchangeability with the RB_* macros.
>
> I prepared a commit to do just that:
> https://github.com/bitrig/bitrig/commit/51ec39f44b2ee96df0b114089dced6
> 933bec7891
> (patch included below for convenience)
>
> Comments, ok?
>
> cheers,
> natano
>
>
> ---
> commit 51ec39f44b2ee96df0b114089dced6933bec7891
> Author: Martin Natano <[email protected]>
> Date:   Sun Oct 5 20:22:58 2014 +0200
>
>     Add SPLAY_{GENERATE,PROTOTYPE}_STATIC.
>
> diff --git a/share/man/man3/Makefile b/share/man/man3/Makefile
> index 808c83e..e69a4ee 100644
> --- a/share/man/man3/Makefile
> +++ b/share/man/man3/Makefile
> @@ -60,7 +60,8 @@ MLINKS+=stdarg.3 varargs.3 stdarg.3 va_arg.3 stdarg.3
> va_end.3
>  MLINKS+=stdarg.3 va_start.3 stdarg.3 va_copy.3
>  MLINKS+=dlfcn.3 dlopen.3 dlfcn.3 dlclose.3 dlfcn.3 dlsym.3 dlfcn.3
> dlctl.3 \
>         dlfcn.3 dlerror.3 dlfcn.3 dladdr.3
> -MLINKS+=tree.3 SPLAY_PROTOTYPE.3 tree.3 SPLAY_GENERATE.3 \
> +MLINKS+=tree.3 SPLAY_PROTOTYPE.3 tree.3 SPLAY_PROTOTYPE_STATIC.3 \
> +       tree.3 SPLAY_GENERATE.3 tree.3 SPLAY_GENERATE_STATIC.3 \
>         tree.3 SPLAY_ENTRY.3 tree.3 SPLAY_HEAD.3 \
>         tree.3 SPLAY_INITIALIZER.3 tree.3 SPLAY_ROOT.3 \
>         tree.3 SPLAY_EMPTY.3 tree.3 SPLAY_NEXT.3 \
> diff --git a/share/man/man3/tree.3 b/share/man/man3/tree.3
> index b5c3758..dfe3aeb 100644
> --- a/share/man/man3/tree.3
> +++ b/share/man/man3/tree.3
> @@ -28,7 +28,9 @@
>  .Os
>  .Sh NAME
>  .Nm SPLAY_PROTOTYPE ,
> +.Nm SPLAY_PROTOTYPE_STATIC ,
>  .Nm SPLAY_GENERATE ,
> +.Nm SPLAY_GENERATE_STATIC ,
>  .Nm SPLAY_ENTRY ,
>  .Nm SPLAY_HEAD ,
>  .Nm SPLAY_INITIALIZER ,
> @@ -74,7 +76,9 @@
>  .In sys/tree.h
>  .Pp
>  .Fn SPLAY_PROTOTYPE "NAME" "TYPE" "FIELD" "CMP"
> +.Fn SPLAY_PROTOTYPE_STATIC "NAME" "TYPE" "FIELD" "CMP"
>  .Fn SPLAY_GENERATE "NAME" "TYPE" "FIELD" "CMP"
> +.Fn SPLAY_GENERATE_STATIC "NAME" "TYPE" "FIELD" "CMP"
>  .Fn SPLAY_ENTRY "TYPE"
>  .Fn SPLAY_HEAD "HEADNAME" "TYPE"
>  .Ft "struct TYPE *"
> @@ -166,11 +170,13 @@ has to be a unique name prefix for every tree that
> is defined.
>  .Pp
>  The function prototypes are declared with
>  .Li SPLAY_PROTOTYPE ,
> +.Li SPLAY_PROTOTYPE_STATIC ,
>  .Li RB_PROTOTYPE ,
>  or
>  .Li RB_PROTOTYPE_STATIC .
>  The function bodies are generated with
>  .Li SPLAY_GENERATE ,
> +.Li SPLAY_GENERATE_STATIC ,
>  .Li RB_GENERATE ,
>  or
>  .Li RB_GENERATE_STATIC .
> @@ -227,10 +233,14 @@ argument is the name of the element defined by
>  .Pp
>  The function bodies are generated with the
>  .Fn SPLAY_GENERATE
> -macro.
> -It takes the same arguments as the
> +or
> +.Fn SPLAY_GENERATE_STATIC
> +macros.
> +Theses macros take the same arguments as the
>  .Fn SPLAY_PROTOTYPE
> -macro, but should be used only once.
> +and
> +.Fn SPLAY_PROTOTYPE_STATIC
> +macros, but should be used only once.
>  .Pp
>  Finally,
>  the
> diff --git a/sys/sys/tree.h b/sys/sys/tree.h
> index ada7d90..bc1786f 100644
> --- a/sys/sys/tree.h
> +++ b/sys/sys/tree.h
> @@ -123,11 +123,15 @@ struct {
>               \
>
>  /* Generates prototypes and inline functions */
>
> -#define SPLAY_PROTOTYPE(name, type, field, cmp)
>       \
> -void name##_SPLAY(struct name *, struct type *);                       \
> -void name##_SPLAY_MINMAX(struct name *, int);                          \
> -struct type *name##_SPLAY_INSERT(struct name *, struct type *);
>       \
> -struct type *name##_SPLAY_REMOVE(struct name *, struct type *);
>       \
> +#define        SPLAY_PROTOTYPE(name, type, field, cmp)
>      \
> +       SPLAY_PROTOTYPE_INTERNAL(name, type, field, cmp,)
> +#define        SPLAY_PROTOTYPE_STATIC(name, type, field, cmp)
>       \
> +       SPLAY_PROTOTYPE_INTERNAL(name, type, field, cmp,
> __attribute__((__unused__)) static)
> +#define SPLAY_PROTOTYPE_INTERNAL(name, type, field, cmp, attr)         \
> +attr void name##_SPLAY(struct name *, struct type *);                  \
> +attr void name##_SPLAY_MINMAX(struct name *, int);                     \
> +attr struct type *name##_SPLAY_INSERT(struct name *, struct type *);   \
> +attr struct type *name##_SPLAY_REMOVE(struct name *, struct type *);   \
>                                                                         \
>  /* Finds the node with the same key as elm */                          \
>  __attribute__((__unused__)) static __inline struct type *              \
> @@ -165,8 +169,12 @@ name##_SPLAY_MIN_MAX(struct name *head, int val)
>              \
>  /* Main splay operation.
>   * Moves node close to the key of elm to top
>   */
> -#define SPLAY_GENERATE(name, type, field, cmp)                         \
> -struct type *                                                          \
> +#define        SPLAY_GENERATE(name, type, field, cmp)
>       \
> +       SPLAY_GENERATE_INTERNAL(name, type, field, cmp,)
> +#define        SPLAY_GENERATE_STATIC(name, type, field, cmp)
>      \
> +       SPLAY_GENERATE_INTERNAL(name, type, field, cmp,
> __attribute__((__unused__)) static)
> +#define SPLAY_GENERATE_INTERNAL(name, type, field, cmp, attr)          \
> +attr struct type *                                                     \
>  name##_SPLAY_INSERT(struct name *head, struct type *elm)               \
>  {                                                                      \
>      if (SPLAY_EMPTY(head)) {                                           \
> @@ -190,7 +198,7 @@ name##_SPLAY_INSERT(struct name *head, struct type
> *elm)            \
>      return (NULL);                                                     \
>  }                                                                      \
>                                                                         \
> -struct type *                                                          \
> +attr struct type *                                                     \
>  name##_SPLAY_REMOVE(struct name *head, struct type *elm)               \
>  {                                                                      \
>         struct type *__tmp;                                             \
> @@ -211,7 +219,7 @@ name##_SPLAY_REMOVE(struct name *head, struct type
> *elm)            \
>         return (NULL);                                                  \
>  }                                                                      \
>                                                                         \
> -void                                                                   \
> +attr void                                                              \
>  name##_SPLAY(struct name *head, struct type *elm)                      \
>  {                                                                      \
>         struct type __node, *__left, *__right, *__tmp;                  \
> @@ -249,7 +257,8 @@ name##_SPLAY(struct name *head, struct type *elm)
>              \
>  /* Splay with either the minimum or the maximum element
>       \
>   * Used to find minimum or maximum element in tree.                    \
>   */                                                                    \
> -void name##_SPLAY_MINMAX(struct name *head, int __comp) \
> +attr void                                                              \
> +name##_SPLAY_MINMAX(struct name *head, int __comp)                     \
>  {                                                                      \
>         struct type __node, *__left, *__right, *__tmp;                  \
>  \
>
>

Reply via email to