1  /* Abstract set data type, with out-of-memory checking.
       2     Copyright (C) 2009-2023 Free Software Foundation, Inc.
       3     Written by Bruno Haible <bruno@clisp.org>, 2009.
       4  
       5     This program is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU General Public License as published by
       7     the Free Software Foundation, either version 3 of the License, or
       8     (at your option) any later version.
       9  
      10     This program is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13     GNU General Public License for more details.
      14  
      15     You should have received a copy of the GNU General Public License
      16     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #ifndef _GL_XSET_H
      19  #define _GL_XSET_H
      20  
      21  /* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE,
      22     _GL_ATTRIBUTE_RETURNS_NONNULL.  */
      23  #if !_GL_CONFIG_H_INCLUDED
      24   #error "Please include config.h first."
      25  #endif
      26  
      27  #include "gl_set.h"
      28  #include "xalloc.h"
      29  
      30  _GL_INLINE_HEADER_BEGIN
      31  #ifndef GL_XSET_INLINE
      32  # define GL_XSET_INLINE _GL_INLINE
      33  #endif
      34  
      35  
      36  #ifdef __cplusplus
      37  extern "C" {
      38  #endif
      39  
      40  /* These functions are thin wrappers around the corresponding functions with
      41     _nx_ infix from gl_set.h.  Upon out-of-memory, they invoke xalloc_die (),
      42     instead of returning an error indicator.  */
      43  #if 0 /* These are defined inline below.  */
      44  extern gl_set_t gl_set_create_empty (gl_set_implementation_t implementation,
      45                                       gl_setelement_equals_fn equals_fn,
      46                                       gl_setelement_hashcode_fn hashcode_fn,
      47                                       gl_setelement_dispose_fn dispose_fn)
      48    /*_GL_ATTRIBUTE_DEALLOC (gl_set_free, 1)*/
      49    _GL_ATTRIBUTE_RETURNS_NONNULL;
      50  extern bool gl_set_add (gl_set_t set, const void *elt);
      51  #endif
      52  
      53  GL_XSET_INLINE
      54  /*_GL_ATTRIBUTE_DEALLOC (gl_set_free, 1)*/
      55  _GL_ATTRIBUTE_RETURNS_NONNULL
      56  gl_set_t
      57  gl_set_create_empty (gl_set_implementation_t implementation,
      58                       gl_setelement_equals_fn equals_fn,
      59                       gl_setelement_hashcode_fn hashcode_fn,
      60                       gl_setelement_dispose_fn dispose_fn)
      61  {
      62    gl_set_t result =
      63      gl_set_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn);
      64    if (result == NULL)
      65      xalloc_die ();
      66    return result;
      67  }
      68  
      69  GL_XSET_INLINE bool
      70  gl_set_add (gl_set_t set, const void *elt)
      71  {
      72    int result = gl_set_nx_add (set, elt);
      73    if (result < 0)
      74      xalloc_die ();
      75    return result;
      76  }
      77  
      78  #ifdef __cplusplus
      79  }
      80  #endif
      81  
      82  _GL_INLINE_HEADER_END
      83  
      84  #endif /* _GL_XSET_H */