Annotation of embedaddon/libiconv/build-aux/snippet/c++defs.h, revision 1.1

1.1     ! misho       1: /* C++ compatible function declaration macros.
        !             2:    Copyright (C) 2010-2011 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 <http://www.gnu.org/licenses/>.  */
        !            16: 
        !            17: #ifndef _GL_CXXDEFS_H
        !            18: #define _GL_CXXDEFS_H
        !            19: 
        !            20: /* The three most frequent use cases of these macros are:
        !            21: 
        !            22:    * For providing a substitute for a function that is missing on some
        !            23:      platforms, but is declared and works fine on the platforms on which
        !            24:      it exists:
        !            25: 
        !            26:        #if @GNULIB_FOO@
        !            27:        # if !@HAVE_FOO@
        !            28:        _GL_FUNCDECL_SYS (foo, ...);
        !            29:        # endif
        !            30:        _GL_CXXALIAS_SYS (foo, ...);
        !            31:        _GL_CXXALIASWARN (foo);
        !            32:        #elif defined GNULIB_POSIXCHECK
        !            33:        ...
        !            34:        #endif
        !            35: 
        !            36:    * For providing a replacement for a function that exists on all platforms,
        !            37:      but is broken/insufficient and needs to be replaced on some platforms:
        !            38: 
        !            39:        #if @GNULIB_FOO@
        !            40:        # if @REPLACE_FOO@
        !            41:        #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
        !            42:        #   undef foo
        !            43:        #   define foo rpl_foo
        !            44:        #  endif
        !            45:        _GL_FUNCDECL_RPL (foo, ...);
        !            46:        _GL_CXXALIAS_RPL (foo, ...);
        !            47:        # else
        !            48:        _GL_CXXALIAS_SYS (foo, ...);
        !            49:        # endif
        !            50:        _GL_CXXALIASWARN (foo);
        !            51:        #elif defined GNULIB_POSIXCHECK
        !            52:        ...
        !            53:        #endif
        !            54: 
        !            55:    * For providing a replacement for a function that exists on some platforms
        !            56:      but is broken/insufficient and needs to be replaced on some of them and
        !            57:      is additionally either missing or undeclared on some other platforms:
        !            58: 
        !            59:        #if @GNULIB_FOO@
        !            60:        # if @REPLACE_FOO@
        !            61:        #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
        !            62:        #   undef foo
        !            63:        #   define foo rpl_foo
        !            64:        #  endif
        !            65:        _GL_FUNCDECL_RPL (foo, ...);
        !            66:        _GL_CXXALIAS_RPL (foo, ...);
        !            67:        # else
        !            68:        #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
        !            69:        _GL_FUNCDECL_SYS (foo, ...);
        !            70:        #  endif
        !            71:        _GL_CXXALIAS_SYS (foo, ...);
        !            72:        # endif
        !            73:        _GL_CXXALIASWARN (foo);
        !            74:        #elif defined GNULIB_POSIXCHECK
        !            75:        ...
        !            76:        #endif
        !            77: */
        !            78: 
        !            79: /* _GL_EXTERN_C declaration;
        !            80:    performs the declaration with C linkage.  */
        !            81: #if defined __cplusplus
        !            82: # define _GL_EXTERN_C extern "C"
        !            83: #else
        !            84: # define _GL_EXTERN_C extern
        !            85: #endif
        !            86: 
        !            87: /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
        !            88:    declares a replacement function, named rpl_func, with the given prototype,
        !            89:    consisting of return type, parameters, and attributes.
        !            90:    Example:
        !            91:      _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
        !            92:                                   _GL_ARG_NONNULL ((1)));
        !            93:  */
        !            94: #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
        !            95:   _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
        !            96: #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
        !            97:   _GL_EXTERN_C rettype rpl_func parameters_and_attributes
        !            98: 
        !            99: /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
        !           100:    declares the system function, named func, with the given prototype,
        !           101:    consisting of return type, parameters, and attributes.
        !           102:    Example:
        !           103:      _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
        !           104:                                   _GL_ARG_NONNULL ((1)));
        !           105:  */
        !           106: #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
        !           107:   _GL_EXTERN_C rettype func parameters_and_attributes
        !           108: 
        !           109: /* _GL_CXXALIAS_RPL (func, rettype, parameters);
        !           110:    declares a C++ alias called GNULIB_NAMESPACE::func
        !           111:    that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
        !           112:    Example:
        !           113:      _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
        !           114:  */
        !           115: #define _GL_CXXALIAS_RPL(func,rettype,parameters) \
        !           116:   _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
        !           117: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           118: # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
        !           119:     namespace GNULIB_NAMESPACE                                \
        !           120:     {                                                         \
        !           121:       rettype (*const func) parameters = ::rpl_func;          \
        !           122:     }                                                         \
        !           123:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           124: #else
        !           125: # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
        !           126:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           127: #endif
        !           128: 
        !           129: /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
        !           130:    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
        !           131:    except that the C function rpl_func may have a slightly different
        !           132:    declaration.  A cast is used to silence the "invalid conversion" error
        !           133:    that would otherwise occur.  */
        !           134: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           135: # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
        !           136:     namespace GNULIB_NAMESPACE                                     \
        !           137:     {                                                              \
        !           138:       rettype (*const func) parameters =                           \
        !           139:         reinterpret_cast<rettype(*)parameters>(::rpl_func);        \
        !           140:     }                                                              \
        !           141:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           142: #else
        !           143: # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
        !           144:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           145: #endif
        !           146: 
        !           147: /* _GL_CXXALIAS_SYS (func, rettype, parameters);
        !           148:    declares a C++ alias called GNULIB_NAMESPACE::func
        !           149:    that redirects to the system provided function func, if GNULIB_NAMESPACE
        !           150:    is defined.
        !           151:    Example:
        !           152:      _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
        !           153:  */
        !           154: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           155:   /* If we were to write
        !           156:        rettype (*const func) parameters = ::func;
        !           157:      like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
        !           158:      better (remove an indirection through a 'static' pointer variable),
        !           159:      but then the _GL_CXXALIASWARN macro below would cause a warning not only
        !           160:      for uses of ::func but also for uses of GNULIB_NAMESPACE::func.  */
        !           161: # define _GL_CXXALIAS_SYS(func,rettype,parameters) \
        !           162:     namespace GNULIB_NAMESPACE                     \
        !           163:     {                                              \
        !           164:       static rettype (*func) parameters = ::func;  \
        !           165:     }                                              \
        !           166:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           167: #else
        !           168: # define _GL_CXXALIAS_SYS(func,rettype,parameters) \
        !           169:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           170: #endif
        !           171: 
        !           172: /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
        !           173:    is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
        !           174:    except that the C function func may have a slightly different declaration.
        !           175:    A cast is used to silence the "invalid conversion" error that would
        !           176:    otherwise occur.  */
        !           177: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           178: # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
        !           179:     namespace GNULIB_NAMESPACE                          \
        !           180:     {                                                   \
        !           181:       static rettype (*func) parameters =               \
        !           182:         reinterpret_cast<rettype(*)parameters>(::func); \
        !           183:     }                                                   \
        !           184:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           185: #else
        !           186: # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
        !           187:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           188: #endif
        !           189: 
        !           190: /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
        !           191:    is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
        !           192:    except that the C function is picked among a set of overloaded functions,
        !           193:    namely the one with rettype2 and parameters2.  Two consecutive casts
        !           194:    are used to silence the "cannot find a match" and "invalid conversion"
        !           195:    errors that would otherwise occur.  */
        !           196: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           197:   /* The outer cast must be a reinterpret_cast.
        !           198:      The inner cast: When the function is defined as a set of overloaded
        !           199:      functions, it works as a static_cast<>, choosing the designated variant.
        !           200:      When the function is defined as a single variant, it works as a
        !           201:      reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
        !           202: # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
        !           203:     namespace GNULIB_NAMESPACE                                                \
        !           204:     {                                                                         \
        !           205:       static rettype (*func) parameters =                                     \
        !           206:         reinterpret_cast<rettype(*)parameters>(                               \
        !           207:           (rettype2(*)parameters2)(::func));                                  \
        !           208:     }                                                                         \
        !           209:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           210: #else
        !           211: # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
        !           212:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           213: #endif
        !           214: 
        !           215: /* _GL_CXXALIASWARN (func);
        !           216:    causes a warning to be emitted when ::func is used but not when
        !           217:    GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
        !           218:    variants.  */
        !           219: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           220: # define _GL_CXXALIASWARN(func) \
        !           221:    _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
        !           222: # define _GL_CXXALIASWARN_1(func,namespace) \
        !           223:    _GL_CXXALIASWARN_2 (func, namespace)
        !           224: /* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
        !           225:    we enable the warning only when not optimizing.  */
        !           226: # if !__OPTIMIZE__
        !           227: #  define _GL_CXXALIASWARN_2(func,namespace) \
        !           228:     _GL_WARN_ON_USE (func, \
        !           229:                      "The symbol ::" #func " refers to the system function. " \
        !           230:                      "Use " #namespace "::" #func " instead.")
        !           231: # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
        !           232: #  define _GL_CXXALIASWARN_2(func,namespace) \
        !           233:      extern __typeof__ (func) func
        !           234: # else
        !           235: #  define _GL_CXXALIASWARN_2(func,namespace) \
        !           236:      _GL_EXTERN_C int _gl_cxxalias_dummy
        !           237: # endif
        !           238: #else
        !           239: # define _GL_CXXALIASWARN(func) \
        !           240:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           241: #endif
        !           242: 
        !           243: /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
        !           244:    causes a warning to be emitted when the given overloaded variant of ::func
        !           245:    is used but not when GNULIB_NAMESPACE::func is used.  */
        !           246: #if defined __cplusplus && defined GNULIB_NAMESPACE
        !           247: # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
        !           248:    _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
        !           249:                         GNULIB_NAMESPACE)
        !           250: # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
        !           251:    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
        !           252: /* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
        !           253:    we enable the warning only when not optimizing.  */
        !           254: # if !__OPTIMIZE__
        !           255: #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
        !           256:     _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
        !           257:                          "The symbol ::" #func " refers to the system function. " \
        !           258:                          "Use " #namespace "::" #func " instead.")
        !           259: # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
        !           260: #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
        !           261:      extern __typeof__ (func) func
        !           262: # else
        !           263: #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
        !           264:      _GL_EXTERN_C int _gl_cxxalias_dummy
        !           265: # endif
        !           266: #else
        !           267: # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
        !           268:     _GL_EXTERN_C int _gl_cxxalias_dummy
        !           269: #endif
        !           270: 
        !           271: #endif /* _GL_CXXDEFS_H */

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