Blame gl/c++defs.h

Packit a4aae4
/* C++ compatible function declaration macros.
Packit a4aae4
   Copyright (C) 2010-2017 Free Software Foundation, Inc.
Packit a4aae4
Packit a4aae4
   This program is free software: you can redistribute it and/or modify it
Packit a4aae4
   under the terms of the GNU Lesser General Public License as published
Packit a4aae4
   by the Free Software Foundation; either version 2 of the License, or
Packit a4aae4
   (at your option) any later version.
Packit a4aae4
Packit a4aae4
   This program is distributed in the hope that it will be useful,
Packit a4aae4
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a4aae4
   Lesser General Public License for more details.
Packit a4aae4
Packit a4aae4
   You should have received a copy of the GNU Lesser General Public License
Packit a4aae4
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit a4aae4
Packit a4aae4
#ifndef _GL_CXXDEFS_H
Packit a4aae4
#define _GL_CXXDEFS_H
Packit a4aae4
Packit a4aae4
/* Begin/end the GNULIB_NAMESPACE namespace.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
Packit a4aae4
# define _GL_END_NAMESPACE }
Packit a4aae4
#else
Packit a4aae4
# define _GL_BEGIN_NAMESPACE
Packit a4aae4
# define _GL_END_NAMESPACE
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* The three most frequent use cases of these macros are:
Packit a4aae4
Packit a4aae4
   * For providing a substitute for a function that is missing on some
Packit a4aae4
     platforms, but is declared and works fine on the platforms on which
Packit a4aae4
     it exists:
Packit a4aae4
Packit a4aae4
       #if @GNULIB_FOO@
Packit a4aae4
       # if !@HAVE_FOO@
Packit a4aae4
       _GL_FUNCDECL_SYS (foo, ...);
Packit a4aae4
       # endif
Packit a4aae4
       _GL_CXXALIAS_SYS (foo, ...);
Packit a4aae4
       _GL_CXXALIASWARN (foo);
Packit a4aae4
       #elif defined GNULIB_POSIXCHECK
Packit a4aae4
       ...
Packit a4aae4
       #endif
Packit a4aae4
Packit a4aae4
   * For providing a replacement for a function that exists on all platforms,
Packit a4aae4
     but is broken/insufficient and needs to be replaced on some platforms:
Packit a4aae4
Packit a4aae4
       #if @GNULIB_FOO@
Packit a4aae4
       # if @REPLACE_FOO@
Packit a4aae4
       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
Packit a4aae4
       #   undef foo
Packit a4aae4
       #   define foo rpl_foo
Packit a4aae4
       #  endif
Packit a4aae4
       _GL_FUNCDECL_RPL (foo, ...);
Packit a4aae4
       _GL_CXXALIAS_RPL (foo, ...);
Packit a4aae4
       # else
Packit a4aae4
       _GL_CXXALIAS_SYS (foo, ...);
Packit a4aae4
       # endif
Packit a4aae4
       _GL_CXXALIASWARN (foo);
Packit a4aae4
       #elif defined GNULIB_POSIXCHECK
Packit a4aae4
       ...
Packit a4aae4
       #endif
Packit a4aae4
Packit a4aae4
   * For providing a replacement for a function that exists on some platforms
Packit a4aae4
     but is broken/insufficient and needs to be replaced on some of them and
Packit a4aae4
     is additionally either missing or undeclared on some other platforms:
Packit a4aae4
Packit a4aae4
       #if @GNULIB_FOO@
Packit a4aae4
       # if @REPLACE_FOO@
Packit a4aae4
       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
Packit a4aae4
       #   undef foo
Packit a4aae4
       #   define foo rpl_foo
Packit a4aae4
       #  endif
Packit a4aae4
       _GL_FUNCDECL_RPL (foo, ...);
Packit a4aae4
       _GL_CXXALIAS_RPL (foo, ...);
Packit a4aae4
       # else
Packit a4aae4
       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
Packit a4aae4
       _GL_FUNCDECL_SYS (foo, ...);
Packit a4aae4
       #  endif
Packit a4aae4
       _GL_CXXALIAS_SYS (foo, ...);
Packit a4aae4
       # endif
Packit a4aae4
       _GL_CXXALIASWARN (foo);
Packit a4aae4
       #elif defined GNULIB_POSIXCHECK
Packit a4aae4
       ...
Packit a4aae4
       #endif
Packit a4aae4
*/
Packit a4aae4
Packit a4aae4
/* _GL_EXTERN_C declaration;
Packit a4aae4
   performs the declaration with C linkage.  */
Packit a4aae4
#if defined __cplusplus
Packit a4aae4
# define _GL_EXTERN_C extern "C"
Packit a4aae4
#else
Packit a4aae4
# define _GL_EXTERN_C extern
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
Packit a4aae4
   declares a replacement function, named rpl_func, with the given prototype,
Packit a4aae4
   consisting of return type, parameters, and attributes.
Packit a4aae4
   Example:
Packit a4aae4
     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
Packit a4aae4
                                  _GL_ARG_NONNULL ((1)));
Packit a4aae4
 */
Packit a4aae4
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
Packit a4aae4
  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
Packit a4aae4
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
Packit a4aae4
  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
Packit a4aae4
Packit a4aae4
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
Packit a4aae4
   declares the system function, named func, with the given prototype,
Packit a4aae4
   consisting of return type, parameters, and attributes.
Packit a4aae4
   Example:
Packit a4aae4
     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
Packit a4aae4
                                  _GL_ARG_NONNULL ((1)));
Packit a4aae4
 */
Packit a4aae4
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
Packit a4aae4
  _GL_EXTERN_C rettype func parameters_and_attributes
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
Packit a4aae4
   declares a C++ alias called GNULIB_NAMESPACE::func
Packit a4aae4
   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
Packit a4aae4
   Example:
Packit a4aae4
     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
Packit a4aae4
Packit a4aae4
   Wrapping rpl_func in an object with an inline conversion operator
Packit a4aae4
   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
Packit a4aae4
   actually used in the program.  */
Packit a4aae4
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
Packit a4aae4
  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
Packit a4aae4
    namespace GNULIB_NAMESPACE                                \
Packit a4aae4
    {                                                         \
Packit a4aae4
      static const struct _gl_ ## func ## _wrapper            \
Packit a4aae4
      {                                                       \
Packit a4aae4
        typedef rettype (*type) parameters;                   \
Packit a4aae4
                                                              \
Packit a4aae4
        inline operator type () const                         \
Packit a4aae4
        {                                                     \
Packit a4aae4
          return ::rpl_func;                                  \
Packit a4aae4
        }                                                     \
Packit a4aae4
      } func = {};                                            \
Packit a4aae4
    }                                                         \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
Packit a4aae4
   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
Packit a4aae4
   except that the C function rpl_func may have a slightly different
Packit a4aae4
   declaration.  A cast is used to silence the "invalid conversion" error
Packit a4aae4
   that would otherwise occur.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
Packit a4aae4
    namespace GNULIB_NAMESPACE                                     \
Packit a4aae4
    {                                                              \
Packit a4aae4
      static const struct _gl_ ## func ## _wrapper                 \
Packit a4aae4
      {                                                            \
Packit a4aae4
        typedef rettype (*type) parameters;                        \
Packit a4aae4
                                                                   \
Packit a4aae4
        inline operator type () const                              \
Packit a4aae4
        {                                                          \
Packit a4aae4
          return reinterpret_cast<type>(::rpl_func);               \
Packit a4aae4
        }                                                          \
Packit a4aae4
      } func = {};                                                 \
Packit a4aae4
    }                                                              \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
Packit a4aae4
   declares a C++ alias called GNULIB_NAMESPACE::func
Packit a4aae4
   that redirects to the system provided function func, if GNULIB_NAMESPACE
Packit a4aae4
   is defined.
Packit a4aae4
   Example:
Packit a4aae4
     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
Packit a4aae4
Packit a4aae4
   Wrapping func in an object with an inline conversion operator
Packit a4aae4
   avoids a reference to func unless GNULIB_NAMESPACE::func is
Packit a4aae4
   actually used in the program.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
Packit a4aae4
    namespace GNULIB_NAMESPACE                                \
Packit a4aae4
    {                                                         \
Packit a4aae4
      static const struct _gl_ ## func ## _wrapper            \
Packit a4aae4
      {                                                       \
Packit a4aae4
        typedef rettype (*type) parameters;                   \
Packit a4aae4
                                                              \
Packit a4aae4
        inline operator type () const                         \
Packit a4aae4
        {                                                     \
Packit a4aae4
          return ::func;                                      \
Packit a4aae4
        }                                                     \
Packit a4aae4
      } func = {};                                            \
Packit a4aae4
    }                                                         \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
Packit a4aae4
   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
Packit a4aae4
   except that the C function func may have a slightly different declaration.
Packit a4aae4
   A cast is used to silence the "invalid conversion" error that would
Packit a4aae4
   otherwise occur.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
Packit a4aae4
    namespace GNULIB_NAMESPACE                          \
Packit a4aae4
    {                                                   \
Packit a4aae4
      static const struct _gl_ ## func ## _wrapper      \
Packit a4aae4
      {                                                 \
Packit a4aae4
        typedef rettype (*type) parameters;             \
Packit a4aae4
                                                        \
Packit a4aae4
        inline operator type () const                   \
Packit a4aae4
        {                                               \
Packit a4aae4
          return reinterpret_cast<type>(::func);        \
Packit a4aae4
        }                                               \
Packit a4aae4
      } func = {};                                      \
Packit a4aae4
    }                                                   \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
Packit a4aae4
   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
Packit a4aae4
   except that the C function is picked among a set of overloaded functions,
Packit a4aae4
   namely the one with rettype2 and parameters2.  Two consecutive casts
Packit a4aae4
   are used to silence the "cannot find a match" and "invalid conversion"
Packit a4aae4
   errors that would otherwise occur.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
  /* The outer cast must be a reinterpret_cast.
Packit a4aae4
     The inner cast: When the function is defined as a set of overloaded
Packit a4aae4
     functions, it works as a static_cast<>, choosing the designated variant.
Packit a4aae4
     When the function is defined as a single variant, it works as a
Packit a4aae4
     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
Packit a4aae4
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
Packit a4aae4
    namespace GNULIB_NAMESPACE                                                \
Packit a4aae4
    {                                                                         \
Packit a4aae4
      static const struct _gl_ ## func ## _wrapper                            \
Packit a4aae4
      {                                                                       \
Packit a4aae4
        typedef rettype (*type) parameters;                                   \
Packit a4aae4
                                                                              \
Packit a4aae4
        inline operator type () const                                         \
Packit a4aae4
        {                                                                     \
Packit a4aae4
          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
Packit a4aae4
        }                                                                     \
Packit a4aae4
      } func = {};                                                            \
Packit a4aae4
    }                                                                         \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIASWARN (func);
Packit a4aae4
   causes a warning to be emitted when ::func is used but not when
Packit a4aae4
   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
Packit a4aae4
   variants.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_CXXALIASWARN(func) \
Packit a4aae4
   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
Packit a4aae4
# define _GL_CXXALIASWARN_1(func,namespace) \
Packit a4aae4
   _GL_CXXALIASWARN_2 (func, namespace)
Packit a4aae4
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
Packit a4aae4
   we enable the warning only when not optimizing.  */
Packit a4aae4
# if !__OPTIMIZE__
Packit a4aae4
#  define _GL_CXXALIASWARN_2(func,namespace) \
Packit a4aae4
    _GL_WARN_ON_USE (func, \
Packit a4aae4
                     "The symbol ::" #func " refers to the system function. " \
Packit a4aae4
                     "Use " #namespace "::" #func " instead.")
Packit a4aae4
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
Packit a4aae4
#  define _GL_CXXALIASWARN_2(func,namespace) \
Packit a4aae4
     extern __typeof__ (func) func
Packit a4aae4
# else
Packit a4aae4
#  define _GL_CXXALIASWARN_2(func,namespace) \
Packit a4aae4
     _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
# endif
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIASWARN(func) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
Packit a4aae4
   causes a warning to be emitted when the given overloaded variant of ::func
Packit a4aae4
   is used but not when GNULIB_NAMESPACE::func is used.  */
Packit a4aae4
#if defined __cplusplus && defined GNULIB_NAMESPACE
Packit a4aae4
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
Packit a4aae4
   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
Packit a4aae4
                        GNULIB_NAMESPACE)
Packit a4aae4
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
Packit a4aae4
   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
Packit a4aae4
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
Packit a4aae4
   we enable the warning only when not optimizing.  */
Packit a4aae4
# if !__OPTIMIZE__
Packit a4aae4
#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
Packit a4aae4
    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
Packit a4aae4
                         "The symbol ::" #func " refers to the system function. " \
Packit a4aae4
                         "Use " #namespace "::" #func " instead.")
Packit a4aae4
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
Packit a4aae4
#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
Packit a4aae4
     extern __typeof__ (func) func
Packit a4aae4
# else
Packit a4aae4
#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
Packit a4aae4
     _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
# endif
Packit a4aae4
#else
Packit a4aae4
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
Packit a4aae4
    _GL_EXTERN_C int _gl_cxxalias_dummy
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#endif /* _GL_CXXDEFS_H */