blob: 2f705221829daf4f3b0408979e52e430d04147f4 [file] [log] [blame]
Devin Jeanpierre59e4d352017-07-21 03:44:36 -07001// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
Baptiste Lepilleur7469f1d2010-04-20 21:35:19 +00002// Distributed under MIT license, or public domain if desired and
3// recognized in your jurisdiction.
4// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5
Christopher Dunn6d135cb2007-06-13 15:51:04 +00006#ifndef JSON_CONFIG_H_INCLUDED
Aaron Jacobs9fa4e842014-07-01 08:48:54 +10007#define JSON_CONFIG_H_INCLUDED
Hans Johnsone50bfef2018-12-12 13:34:37 -06008#include <cstddef>
Billy Donahue1c2ed7a2019-01-17 16:35:29 -05009#include <cstdint>
10#include <istream>
11#include <memory>
12#include <ostream>
13#include <sstream>
14#include <string>
15#include <type_traits>
Christopher Dunn6d135cb2007-06-13 15:51:04 +000016
17/// If defined, indicates that json library is embedded in CppTL library.
18//# define JSON_IN_CPPTL 1
19
20/// If defined, indicates that json may leverage CppTL library
21//# define JSON_USE_CPPTL 1
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100022/// If defined, indicates that cpptl vector based map should be used instead of
23/// std::map
Christopher Dunn6d135cb2007-06-13 15:51:04 +000024/// as Value container.
25//# define JSON_USE_CPPTL_SMALLMAP 1
Christopher Dunn6d135cb2007-06-13 15:51:04 +000026
Aaron Jacobs7c507d72011-09-14 08:41:37 +000027// If non-zero, the library uses exceptions to report bad input instead of C
28// assertion macros. The default is to use exceptions.
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100029#ifndef JSON_USE_EXCEPTION
30#define JSON_USE_EXCEPTION 1
31#endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +000032
Jordan Bayles25c57812019-07-11 14:27:29 -070033// Temporary, tracked for removal with issue #982.
34#ifndef JSON_USE_NULLREF
35#define JSON_USE_NULLREF 1
36#endif
37
Josh Sorefe6a588a2017-12-03 11:54:29 -050038/// If defined, indicates that the source file is amalgamated
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000039/// to prevent private header inclusion.
Josh Sorefe6a588a2017-12-03 11:54:29 -050040/// Remarks: it is automatically defined in the generated amalgamated header.
Baptiste Lepilleureadc4782011-05-02 21:09:30 +000041// #define JSON_IS_AMALGAMATION
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000042
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100043#ifdef JSON_IN_CPPTL
44#include <cpptl/config.h>
45#ifndef JSON_USE_CPPTL
46#define JSON_USE_CPPTL 1
47#endif
48#endif
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000049
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100050#ifdef JSON_IN_CPPTL
51#define JSON_API CPPTL_API
52#elif defined(JSON_DLL_BUILD)
Gaurav8aabf932016-03-08 17:34:22 +053053#if defined(_MSC_VER) || defined(__MINGW32__)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100054#define JSON_API __declspec(dllexport)
55#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
Frank Richterb16abf82019-03-22 10:15:08 +010056#elif defined(__GNUC__) || defined(__clang__)
57#define JSON_API __attribute__((visibility("default")))
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100058#endif // if defined(_MSC_VER)
59#elif defined(JSON_DLL)
Gaurav8aabf932016-03-08 17:34:22 +053060#if defined(_MSC_VER) || defined(__MINGW32__)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100061#define JSON_API __declspec(dllimport)
62#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
63#endif // if defined(_MSC_VER)
64#endif // ifdef JSON_IN_CPPTL
65#if !defined(JSON_API)
66#define JSON_API
67#endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +000068
Hans Johnson31d65712019-01-11 14:13:08 -060069#if defined(_MSC_VER) && _MSC_VER < 1800
Billy Donahuedc4a7f92019-01-17 11:07:53 -050070#error \
71 "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities"
Hans Johnson31d65712019-01-11 14:13:08 -060072#endif
73
Hans Johnson5c8e5392018-12-12 13:31:55 -060074#if defined(_MSC_VER) && _MSC_VER < 1900
Billy Donahuedc4a7f92019-01-17 11:07:53 -050075// As recommended at
76// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
77extern JSON_API int
78msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
79#define jsoncpp_snprintf msvc_pre1900_c99_snprintf
Hans Johnson5c8e5392018-12-12 13:31:55 -060080#else
Billy Donahuedc4a7f92019-01-17 11:07:53 -050081#define jsoncpp_snprintf std::snprintf
Hans Johnson5c8e5392018-12-12 13:31:55 -060082#endif
83
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100084// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
85// integer
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +000086// Storages, and 64 bits integer support is disabled.
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +000087// #define JSON_NO_INT64 1
88
Billy Donahuedc4a7f92019-01-17 11:07:53 -050089// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools.
90// C++11 should be used directly in JSONCPP.
91#define JSONCPP_OVERRIDE override
92
Christopher Dunne0f9aab2016-06-26 17:52:19 -050093#if __cplusplus >= 201103L
Billy Donahueb5e1fe82018-05-20 16:55:27 -040094#define JSONCPP_NOEXCEPT noexcept
95#define JSONCPP_OP_EXPLICIT explicit
Hans Johnson31d65712019-01-11 14:13:08 -060096#elif defined(_MSC_VER) && _MSC_VER < 1900
Billy Donahueb5e1fe82018-05-20 16:55:27 -040097#define JSONCPP_NOEXCEPT throw()
Billy Donahueb5e1fe82018-05-20 16:55:27 -040098#define JSONCPP_OP_EXPLICIT explicit
Billy Donahueb5e1fe82018-05-20 16:55:27 -040099#elif defined(_MSC_VER) && _MSC_VER >= 1900
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400100#define JSONCPP_NOEXCEPT noexcept
101#define JSONCPP_OP_EXPLICIT explicit
102#else
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400103#define JSONCPP_NOEXCEPT throw()
104#define JSONCPP_OP_EXPLICIT
Jean-Christophe Fillion-Robinba6fa482016-04-25 17:35:12 -0400105#endif
Motti2b008912015-04-20 17:44:47 +0300106
Motti2b008912015-04-20 17:44:47 +0300107#ifdef __clang__
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400108#if __has_extension(attribute_deprecated_with_message)
109#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
110#endif
Jordan Baylesb3507942019-07-12 11:07:12 -0700111#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc)
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400112#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
113#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
114#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
115#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
Jordan Baylesd5bd1a72019-06-24 14:06:45 -0700116#endif // GNUC version
117#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates
118 // MSVC)
Marcel Raad36d8cfd2019-02-25 15:24:03 +0100119#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
120#endif // __clang__ || __GNUC__ || _MSC_VER
Baptiste Lepilleurb2e8ccc2011-05-01 16:27:55 +0000121
122#if !defined(JSONCPP_DEPRECATED)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000123#define JSONCPP_DEPRECATED(message)
Baptiste Lepilleurb2e8ccc2011-05-01 16:27:55 +0000124#endif // if !defined(JSONCPP_DEPRECATED)
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000125
Jordan Baylesb3507942019-07-12 11:07:12 -0700126#if defined(__GNUC__) && (__GNUC__ >= 6)
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400127#define JSON_USE_INT64_DOUBLE_CONVERSION 1
Christopher Dunn95f120f2016-02-07 11:09:41 -0600128#endif
129
Christopher Dunn12c67e82016-03-21 20:33:15 -0500130#if !defined(JSON_IS_AMALGAMATION)
dawescf8674c62016-03-06 11:42:11 -0600131
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500132#include "allocator.h"
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400133#include "version.h"
Christopher Dunn12c67e82016-03-21 20:33:15 -0500134
Christopher Dunn12c67e82016-03-21 20:33:15 -0500135#endif // if !defined(JSON_IS_AMALGAMATION)
dawescf8674c62016-03-06 11:42:11 -0600136
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000137namespace Json {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000138typedef int Int;
139typedef unsigned int UInt;
140#if defined(JSON_NO_INT64)
141typedef int LargestInt;
142typedef unsigned int LargestUInt;
143#undef JSON_HAS_INT64
144#else // if defined(JSON_NO_INT64)
145// For Microsoft Visual use specific types as long long is not supported
146#if defined(_MSC_VER) // Microsoft Visual Studio
147typedef __int64 Int64;
148typedef unsigned __int64 UInt64;
149#else // if defined(_MSC_VER) // Other platforms, use long long
Christopher Dunnb9afdf12016-08-21 19:58:43 -0500150typedef int64_t Int64;
151typedef uint64_t UInt64;
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400152#endif // if defined(_MSC_VER)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000153typedef Int64 LargestInt;
154typedef UInt64 LargestUInt;
155#define JSON_HAS_INT64
156#endif // if defined(JSON_NO_INT64)
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500157
158template <typename T>
159using Allocator = typename std::conditional<JSONCPP_USING_SECURE_MEMORY,
160 SecureAllocator<T>,
Billy Donahue2b593a92019-01-18 03:46:57 -0500161 std::allocator<T>>::type;
162using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500163using IStringStream = std::basic_istringstream<String::value_type,
164 String::traits_type,
165 String::allocator_type>;
166using OStringStream = std::basic_ostringstream<String::value_type,
167 String::traits_type,
168 String::allocator_type>;
169using IStream = std::istream;
170using OStream = std::ostream;
171} // namespace Json
172
173// Legacy names (formerly macros).
174using JSONCPP_STRING = Json::String;
175using JSONCPP_ISTRINGSTREAM = Json::IStringStream;
176using JSONCPP_OSTRINGSTREAM = Json::OStringStream;
177using JSONCPP_ISTREAM = Json::IStream;
178using JSONCPP_OSTREAM = Json::OStream;
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000179
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000180#endif // JSON_CONFIG_H_INCLUDED