Annotation of embedaddon/libiconv/srclib/c++defs.h, revision 1.1

1.1     ! misho       1: /* C++ compatible function declaration macros.
        !             2:    Copyright (C) 2010-2019 Free Software Foundation, Inc.
        !             3: 
        !             4:    This program is free software: you can redistribute it and/or modify it
        !             5:    under the terms of the GNU General Public License as published
        !             6:    by the Free Software Foundation; either version 3 of the License, or
        !             7:    (at your option) any later version.
        !             8: 
        !             9:    This program is distributed in the hope that it will be useful,
        !            10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            12:    General Public License for more details.
        !            13: 
        !            14:    You should have received a copy of the GNU General Public License
        !            15:    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
        !            16: 
        !            17: #ifndef _GL_CXXDEFS_H
        !            18: #define _GL_CXXDEFS_H
        !            19: 
        !            20: /* Begin/end the GNULIB_NAMESPACE namespace.  */
        !            21: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !            22: # define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
        !            23: # define _GL_END_NAMESPACE }
        !            24: #else
        !            25: # define _GL_BEGIN_NAMESPACE
        !            26: # define _GL_END_NAMESPACE
        !            27: #endif
        !            28: 
        !            29: /* The three most frequent use cases of these macros are:
        !            30: 
        !            31:    * For providing a substitute for a function that is missing on some
        !            32:      platforms, but is declared and works fine on the platforms on which
        !            33:      it exists:
        !            34: 
        !            35:        #if @GNULIB_FOO@
        !            36:        # if !@HAVE_FOO@
        !            37:        _GL_FUNCDECL_SYS (foo, ...);
        !            38:        # endif
        !            39:        _GL_CXXALIAS_SYS (foo, ...);
        !            40:        _GL_CXXALIASWARN (foo);
        !            41:        #elif defined GNULIB_POSIXCHECK
        !            42:        ...
        !            43:        #endif
        !            44: 
        !            45:    * For providing a replacement for a function that exists on all platforms,
        !            46:      but is broken/insufficient and needs to be replaced on some platforms:
        !            47: 
        !            48:        #if @GNULIB_FOO@
        !            49:        # if @REPLACE_FOO@
        !            50:        #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
        !            51:        #   undef foo
        !            52:        #   define foo rpl_foo
        !            53:        #  endif
        !            54:        _GL_FUNCDECL_RPL (foo, ...);
        !            55:        _GL_CXXALIAS_RPL (foo, ...);
        !            56:        # else
        !            57:        _GL_CXXALIAS_SYS (foo, ...);
        !            58:        # endif
        !            59:        _GL_CXXALIASWARN (foo);
        !            60:        #elif defined GNULIB_POSIXCHECK
        !            61:        ...
        !            62:        #endif
        !            63: 
        !            64:    * For providing a replacement for a function that exists on some platforms
        !            65:      but is broken/insufficient and needs to be replaced on some of them and
        !            66:      is additionally either missing or undeclared on some other platforms:
        !            67: 
        !            68:        #if @GNULIB_FOO@
        !            69:        # if @REPLACE_FOO@
        !            70:        #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
        !            71:        #   undef foo
        !            72:        #   define foo rpl_foo
        !            73:        #  endif
        !            74:        _GL_FUNCDECL_RPL (foo, ...);
        !            75:        _GL_CXXALIAS_RPL (foo, ...);
        !            76:        # else
        !            77:        #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
        !            78:        _GL_FUNCDECL_SYS (foo, ...);
        !            79:        #  endif
        !            80:        _GL_CXXALIAS_SYS (foo, ...);
        !            81:        # endif
        !            82:        _GL_CXXALIASWARN (foo);
        !            83:        #elif defined GNULIB_POSIXCHECK
        !            84:        ...
        !            85:        #endif
        !            86: */
        !            87: 
        !            88: /* _GL_EXTERN_C declaration;
        !            89:    performs the declaration with C linkage.  */
        !            90: #if defined __cplusplus
        !            91: # define _GL_EXTERN_C extern "C"
        !            92: #else
        !            93: # define _GL_EXTERN_C extern
        !            94: #endif
        !            95: 
        !            96: /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
        !            97:    declares a replacement function, named rpl_func, with the given prototype,
        !            98:    consisting of return type, parameters, and attributes.
        !            99:    Example:
        !           100:      _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
        !           101:                                   _GL_ARG_NONNULL ((1)));
        !           102:  */
        !           103: #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
        !           104:   _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
        !           105: #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
        !           106:   _GL_EXTERN_C rettype rpl_func parameters_and_attributes
        !           107: 
        !           108: /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
        !           109:    declares the system function, named func, with the given prototype,
        !           110:    consisting of return type, parameters, and attributes.
        !           111:    Example:
        !           112:      _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
        !           113:                                   _GL_ARG_NONNULL ((1)));
        !           114:  */
        !           115: #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
        !           116:   _GL_EXTERN_C rettype func parameters_and_attributes
        !           117: 
        !           118: /* _GL_CXXALIAS_RPL (func, rettype, parameters);
        !           119:    declares a C++ alias called GNULIB_NAMESPACE::func
        !           120:    that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
        !           121:    Example:
        !           122:      _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
        !           123: 
        !           124:    Wrapping rpl_func in an object with an inline conversion operator
        !           125:    avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
        !           126:    actually used in the program.  */
        !           127: #define _GL_CXXALIAS_RPL(func,rettype,parameters) \
        !           128:   _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
        !           129: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           130: # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
        !           131:     namespace GNULIB_NAMESPACE                                \
        !           132:     {                                                         \
        !           133:       static const struct _gl_ ## func ## _wrapper            \
        !           134:       {                                                       \
        !           135:         typedef rettype (*type) parameters;                   \
        !           136:                                                               \
        !           137:         inline operator type () const                         \
        !           138:         {                                                     \
        !           139:           return ::rpl_func;                                  \
        !           140:         }                                                     \
        !           141:       } func = {};                                            \
        !           142:     }                                                         \
        !           143:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           144: #else
        !           145: # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
        !           146:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           147: #endif
        !           148: 
        !           149: /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
        !           150:    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
        !           151:    except that the C function rpl_func may have a slightly different
        !           152:    declaration.  A cast is used to silence the "invalid conversion" error
        !           153:    that would otherwise occur.  */
        !           154: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           155: # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
        !           156:     namespace GNULIB_NAMESPACE                                     \
        !           157:     {                                                              \
        !           158:       static const struct _gl_ ## func ## _wrapper                 \
        !           159:       {                                                            \
        !           160:         typedef rettype (*type) parameters;                        \
        !           161:                                                                    \
        !           162:         inline operator type () const                              \
        !           163:         {                                                          \
        !           164:           return reinterpret_cast<type>(::rpl_func);               \
        !           165:         }                                                          \
        !           166:       } func = {};                                                 \
        !           167:     }                                                              \
        !           168:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           169: #else
        !           170: # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
        !           171:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           172: #endif
        !           173: 
        !           174: /* _GL_CXXALIAS_SYS (func, rettype, parameters);
        !           175:    declares a C++ alias called GNULIB_NAMESPACE::func
        !           176:    that redirects to the system provided function func, if GNULIB_NAMESPACE
        !           177:    is defined.
        !           178:    Example:
        !           179:      _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
        !           180: 
        !           181:    Wrapping func in an object with an inline conversion operator
        !           182:    avoids a reference to func unless GNULIB_NAMESPACE::func is
        !           183:    actually used in the program.  */
        !           184: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           185: # define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
        !           186:     namespace GNULIB_NAMESPACE                                \
        !           187:     {                                                         \
        !           188:       static const struct _gl_ ## func ## _wrapper            \
        !           189:       {                                                       \
        !           190:         typedef rettype (*type) parameters;                   \
        !           191:                                                               \
        !           192:         inline operator type () const                         \
        !           193:         {                                                     \
        !           194:           return ::func;                                      \
        !           195:         }                                                     \
        !           196:       } func = {};                                            \
        !           197:     }                                                         \
        !           198:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           199: #else
        !           200: # define _GL_CXXALIAS_SYS(func,rettype,parameters) \
        !           201:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           202: #endif
        !           203: 
        !           204: /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
        !           205:    is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
        !           206:    except that the C function func may have a slightly different declaration.
        !           207:    A cast is used to silence the "invalid conversion" error that would
        !           208:    otherwise occur.  */
        !           209: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           210: # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
        !           211:     namespace GNULIB_NAMESPACE                          \
        !           212:     {                                                   \
        !           213:       static const struct _gl_ ## func ## _wrapper      \
        !           214:       {                                                 \
        !           215:         typedef rettype (*type) parameters;             \
        !           216:                                                         \
        !           217:         inline operator type () const                   \
        !           218:         {                                               \
        !           219:           return reinterpret_cast<type>(::func);        \
        !           220:         }                                               \
        !           221:       } func = {};                                      \
        !           222:     }                                                   \
        !           223:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           224: #else
        !           225: # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
        !           226:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           227: #endif
        !           228: 
        !           229: /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
        !           230:    is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
        !           231:    except that the C function is picked among a set of overloaded functions,
        !           232:    namely the one with rettype2 and parameters2.  Two consecutive casts
        !           233:    are used to silence the "cannot find a match" and "invalid conversion"
        !           234:    errors that would otherwise occur.  */
        !           235: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           236:   /* The outer cast must be a reinterpret_cast.
        !           237:      The inner cast: When the function is defined as a set of overloaded
        !           238:      functions, it works as a static_cast<>, choosing the designated variant.
        !           239:      When the function is defined as a single variant, it works as a
        !           240:      reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
        !           241: # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
        !           242:     namespace GNULIB_NAMESPACE                                                \
        !           243:     {                                                                         \
        !           244:       static const struct _gl_ ## func ## _wrapper                            \
        !           245:       {                                                                       \
        !           246:         typedef rettype (*type) parameters;                                   \
        !           247:                                                                               \
        !           248:         inline operator type () const                                         \
        !           249:         {                                                                     \
        !           250:           return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
        !           251:         }                                                                     \
        !           252:       } func = {};                                                            \
        !           253:     }                                                                         \
        !           254:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           255: #else
        !           256: # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
        !           257:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           258: #endif
        !           259: 
        !           260: /* _GL_CXXALIASWARN (func);
        !           261:    causes a warning to be emitted when ::func is used but not when
        !           262:    GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
        !           263:    variants.  */
        !           264: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           265: # define _GL_CXXALIASWARN(func) \
        !           266:    _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
        !           267: # define _GL_CXXALIASWARN_1(func,namespace) \
        !           268:    _GL_CXXALIASWARN_2 (func, namespace)
        !           269: /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
        !           270:    we enable the warning only when not optimizing.  */
        !           271: # if !__OPTIMIZE__
        !           272: #  define _GL_CXXALIASWARN_2(func,namespace) \
        !           273:     _GL_WARN_ON_USE (func, \
        !           274:                      "The symbol ::" #func " refers to the system function. " \
        !           275:                      "Use " #namespace "::" #func " instead.")
        !           276: # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
        !           277: #  define _GL_CXXALIASWARN_2(func,namespace) \
        !           278:      extern __typeof__ (func) func
        !           279: # else
        !           280: #  define _GL_CXXALIASWARN_2(func,namespace) \
        !           281:      _GL_EXTERN_C int _gl_cxxalias_dummy
        !           282: # endif
        !           283: #else
        !           284: # define _GL_CXXALIASWARN(func) \
        !           285:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           286: #endif
        !           287: 
        !           288: /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
        !           289:    causes a warning to be emitted when the given overloaded variant of ::func
        !           290:    is used but not when GNULIB_NAMESPACE::func is used.  */
        !           291: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           292: # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
        !           293:    _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
        !           294:                         GNULIB_NAMESPACE)
        !           295: # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
        !           296:    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
        !           297: /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
        !           298:    we enable the warning only when not optimizing.  */
        !           299: # if !__OPTIMIZE__
        !           300: #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
        !           301:     _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
        !           302:                          "The symbol ::" #func " refers to the system function. " \
        !           303:                          "Use " #namespace "::" #func " instead.")
        !           304: # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
        !           305: #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
        !           306:      extern __typeof__ (func) func
        !           307: # else
        !           308: #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
        !           309:      _GL_EXTERN_C int _gl_cxxalias_dummy
        !           310: # endif
        !           311: #else
        !           312: # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
        !           313:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           314: #endif
        !           315: 
        !           316: #endif /* _GL_CXXDEFS_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>