gflags_declare.h.in 8.39 KB
Newer Older
1
// Copyright (c) 1999, Google Inc.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// ---
31
//
32 33 34 35 36
// Revamped and reorganized by Craig Silverstein
//
// This is the file that should be included by any file which declares
// command line flag.

37 38
#ifndef GFLAGS_DECLARE_H_
#define GFLAGS_DECLARE_H_
39

40 41
// ---------------------------------------------------------------------------
// Meta-information
42

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
// Version number of gflags library.
#define GFLAGS_VERSION_STRING "@PACKAGE_VERSION@"

#define GFLAGS_VERSION_MAJOR @PACKAGE_VERSION_MAJOR@ ///< Major version number.
#define GFLAGS_VERSION_MINOR @PACKAGE_VERSION_MINOR@ ///< Minor version number.
#define GFLAGS_VERSION_PATCH @PACKAGE_VERSION_PATCH@ ///< Version patch number.

// Whether gflags library is shared. Used for DLL import declaration.
#cmakedefine GFLAGS_SHARED_LIBS

// ---------------------------------------------------------------------------
// Namespace for gflags symbols.
#define GFLAGS_NAMESPACE @GFLAGS_NAMESPACE@

// ---------------------------------------------------------------------------
// Unused attribute declaration for GNU GCC.
59
#define GFLAGS_ATTRIBUTE_UNUSED @GFLAGS_ATTRIBUTE_UNUSED@
60 61 62 63 64 65

// ---------------------------------------------------------------------------
// Windows DLL import/export.
#ifndef GFLAGS_DLL_DECL
#  if defined(_MSC_VER) && defined(GFLAGS_SHARED_LIBS)
#    ifdef GFLAGS_DLL_EXPORT
66 67 68 69 70 71 72 73 74
#      define GFLAGS_DLL_DECL __declspec(dllexport)
#    else
#      define GFLAGS_DLL_DECL __declspec(dllimport)
#    endif
#  else
#    define GFLAGS_DLL_DECL
#  endif
#endif

75 76 77 78 79 80 81
// We always want to export defined variables, dll or no
#if defined(_MSC_VER)
#  define GFLAGS_DLL_DEFINE_FLAG __declspec(dllexport)
#else
#  define GFLAGS_DLL_DEFINE_FLAG
#endif

82
// We always want to import declared variables, dll or no
83 84 85 86 87 88 89 90 91 92 93
#if defined(_MSC_VER)
#  define GFLAGS_DLL_DECLARE_FLAG __declspec(dllimport)
#else
#  define GFLAGS_DLL_DECLARE_FLAG
#endif

// Export/import of STL class instantiations
// \sa http://support.microsoft.com/default.aspx?scid=KB;EN-US;168958
#if defined(GFLAGS_SHARED_LIBS) && defined(_MSC_VER) && _MSC_VER >= 1100
#  ifdef GFLAGS_DLL_EXPORT
#    define GFLAGS_EXTERN_STL
94
#  else
95
#    define GFLAGS_EXTERN_STL extern
96 97 98
#  endif
#endif

99
// ---------------------------------------------------------------------------
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
// Available system headers

// Define if you have the <stdint.h> header file.
#cmakedefine GFLAGS_HAVE_STDINT_H

// Define if you have the <sys/types.h> header file.
#cmakedefine GFLAGS_HAVE_SYS_TYPES_H

// Define if you have the <inttypes.h> header file.
#cmakedefine GFLAGS_HAVE_INTTYPES_H

// Define if you have the <sys/stat.h> header file.
#cmakedefine GFLAGS_HAVE_SYS_STAT_H

// Define if you have the <unistd.h> header file.
#cmakedefine GFLAGS_HAVE_UNISTD_H

// Define if you have the <fnmatch.h> header file.
#cmakedefine GFLAGS_HAVE_FNMATCH_H

// Define if you have the strtoll function.
#cmakedefine GFLAGS_HAVE_STRTOLL

// Define if you have the strtoq function.
#cmakedefine GFLAGS_HAVE_STRTOQ

// Define if you have the <pthread.h> header file.
#cmakedefine GFLAGS_HAVE_PTHREAD

129 130 131
// Define if your pthread library defines the type pthread_rwlock_t
#cmakedefine GFLAGS_HAVE_RWLOCK

132 133 134 135 136 137 138 139
// Backwards compatibility in case users defined these macros themselves
// or allow users to use these more general macros if the gflags library
// is build as part of a user project, e.g., included as Git submodule
#if defined(HAVE_STDINT_H) && !defined(GFLAGS_HAVE_STDINT_H)
#  define GFLAGS_HAVE_STDINT_H
#endif
#if defined(HAVE_SYS_TYPES_H) && !defined(GFLAGS_HAVE_SYS_TYPES_H)
#  define GFLAGS_HAVE_SYS_TYPES_H
140
#endif
141 142
#if defined(HAVE_INTTYPES_H)  && !defined(GFLAGS_HAVE_INTTYPES_H)
#  define GFLAGS_HAVE_INTTYPES_H
143
#endif
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
#if defined(HAVE_SYS_STAT_H)  && !defined(GFLAGS_HAVE_SYS_STAT_H)
#  define GFLAGS_HAVE_SYS_STAT_H
#endif
#if defined(HAVE_UNISTD_H)    && !defined(GFLAGS_HAVE_UNISTD_H)
#  define GFLAGS_HAVE_UNISTD_H
#endif
#if defined(HAVE_FNMATCH_H)   && !defined(GFLAGS_HAVE_FNMATCH_H)
#  define GFLAGS_HAVE_FNMATCH_H
#endif
#if defined(HAVE_STRTOLL)     && !defined(GFLAGS_HAVE_STRTOLL)
#  define GFLAGS_HAVE_STRTOLL
#endif
#if defined(HAVE_STRTOLQ)     && !defined(GFLAGS_HAVE_STRTOLQ)
#  define GFLAGS_HAVE_STRTOLQ
#endif
#if defined(HAVE_PTHREAD)     && !defined(GFLAGS_HAVE_PTHREAD)
#  define GFLAGS_HAVE_PTHREAD
#endif
#if defined(HAVE_RWLOCK)      && !defined(GFLAGS_HAVE_RWLOCK)
#  define GFLAGS_HAVE_RWLOCK
#endif

// gcc requires this to get PRId64, etc.
#if defined(GFLAGS_HAVE_INTTYPES_H) && !defined(__STDC_FORMAT_MACROS)
#  define __STDC_FORMAT_MACROS 1
#endif

// ---------------------------------------------------------------------------
// Flag types
#include <string>
#if defined(GFLAGS_HAVE_STDINT_H)
#  include <stdint.h>                   // the normal place uint32_t is defined
#elif defined(GFLAGS_HAVE_SYS_TYPES_H)
#  include <sys/types.h>                // the normal place u_int32_t is defined
#elif defined(GFLAGS_HAVE_INTTYPES_H)
#  include <inttypes.h>                 // a third place for uint32_t or u_int32_t
180 181
#endif

182 183 184
#cmakedefine GFLAGS_INTTYPES_FORMAT_C99
#cmakedefine GFLAGS_INTTYPES_FORMAT_BSD
#cmakedefine GFLAGS_INTTYPES_FORMAT_VC7
185

186
namespace GFLAGS_NAMESPACE {
187

188 189 190 191 192 193 194 195 196 197 198
#if   defined(GFLAGS_INTTYPES_FORMAT_C99)
typedef int32_t          int32;
typedef uint32_t         uint32;
typedef int64_t          int64;
typedef uint64_t         uint64;
#elif defined(GFLAGS_INTTYPES_FORMAT_BSD)
typedef int32_t          int32;
typedef u_int32_t        uint32;
typedef int64_t          int64;
typedef u_int64_t        uint64;
#elif defined(GFLAGS_INTTYPES_FORMAT_VC7) // Windows
199
typedef __int32          int32;
200
typedef unsigned __int32 uint32;
201
typedef __int64          int64;
202 203
typedef unsigned __int64 uint64;
#else
204
#  error Do not know how to define a 32-bit integer quantity on your system
205 206
#endif

207
} // namespace GFLAGS_NAMESPACE
208 209 210 211 212 213 214 215 216 217


namespace fLS {

// The meaning of "string" might be different between now and when the
// macros below get invoked (e.g., if someone is experimenting with
// other string implementations that get defined after this file is
// included).  Save the current meaning now and use it in the macros.
typedef std::string clstring;

218 219
} // namespace fLS

220

221
#define DECLARE_VARIABLE(type, shorttype, name) \
222 223
  /* We always want to import declared variables, dll or no */ \
  namespace fL##shorttype { extern GFLAGS_DLL_DECLARE_FLAG type FLAGS_##name; } \
224 225
  using fL##shorttype::FLAGS_##name

226 227 228 229
#define DECLARE_bool(name) \
  DECLARE_VARIABLE(bool, B, name)

#define DECLARE_int32(name) \
230
  DECLARE_VARIABLE(GFLAGS_NAMESPACE::int32, I, name)
231 232

#define DECLARE_int64(name) \
233
  DECLARE_VARIABLE(GFLAGS_NAMESPACE::int64, I64, name)
234 235

#define DECLARE_uint64(name) \
236
  DECLARE_VARIABLE(GFLAGS_NAMESPACE::uint64, U64, name)
237 238 239 240

#define DECLARE_double(name) \
  DECLARE_VARIABLE(double, D, name)

241
#define DECLARE_string(name) \
242 243 244
  /* We always want to import declared variables, dll or no */ \
  namespace fLS { \
  using ::fLS::clstring; \
245
  extern GFLAGS_DLL_DECLARE_FLAG ::fLS::clstring& FLAGS_##name; \
246
  } \
247 248
  using fLS::FLAGS_##name

249

250
#endif  // GFLAGS_DECLARE_H_