blob: 2b603769e561d36ac819415bf21c9103081b3af4 [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
Josh Sorefe6a588a2017-12-03 11:54:29 -050033/// If defined, indicates that the source file is amalgamated
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000034/// to prevent private header inclusion.
Josh Sorefe6a588a2017-12-03 11:54:29 -050035/// Remarks: it is automatically defined in the generated amalgamated header.
Baptiste Lepilleureadc4782011-05-02 21:09:30 +000036// #define JSON_IS_AMALGAMATION
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000037
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100038#ifdef JSON_IN_CPPTL
39#include <cpptl/config.h>
40#ifndef JSON_USE_CPPTL
41#define JSON_USE_CPPTL 1
42#endif
43#endif
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000044
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100045#ifdef JSON_IN_CPPTL
46#define JSON_API CPPTL_API
47#elif defined(JSON_DLL_BUILD)
Gaurav8aabf932016-03-08 17:34:22 +053048#if defined(_MSC_VER) || defined(__MINGW32__)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100049#define JSON_API __declspec(dllexport)
50#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
51#endif // if defined(_MSC_VER)
52#elif defined(JSON_DLL)
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(dllimport)
55#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
56#endif // if defined(_MSC_VER)
57#endif // ifdef JSON_IN_CPPTL
58#if !defined(JSON_API)
59#define JSON_API
60#endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +000061
Hans Johnson31d65712019-01-11 14:13:08 -060062#if defined(_MSC_VER) && _MSC_VER < 1800
Billy Donahuedc4a7f92019-01-17 11:07:53 -050063#error \
64 "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 -060065#endif
66
Hans Johnson5c8e5392018-12-12 13:31:55 -060067#if defined(_MSC_VER) && _MSC_VER < 1900
Billy Donahuedc4a7f92019-01-17 11:07:53 -050068// As recommended at
69// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
70extern JSON_API int
71msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
72#define jsoncpp_snprintf msvc_pre1900_c99_snprintf
Hans Johnson5c8e5392018-12-12 13:31:55 -060073#else
Billy Donahuedc4a7f92019-01-17 11:07:53 -050074#define jsoncpp_snprintf std::snprintf
Hans Johnson5c8e5392018-12-12 13:31:55 -060075#endif
76
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100077// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
78// integer
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +000079// Storages, and 64 bits integer support is disabled.
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +000080// #define JSON_NO_INT64 1
81
Motti2b008912015-04-20 17:44:47 +030082#if defined(_MSC_VER) // MSVC
Billy Donahueb5e1fe82018-05-20 16:55:27 -040083#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
Motti2b008912015-04-20 17:44:47 +030084#endif // defined(_MSC_VER)
85
Billy Donahuedc4a7f92019-01-17 11:07:53 -050086// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools.
87// C++11 should be used directly in JSONCPP.
88#define JSONCPP_OVERRIDE override
89
Christopher Dunne0f9aab2016-06-26 17:52:19 -050090#if __cplusplus >= 201103L
Billy Donahueb5e1fe82018-05-20 16:55:27 -040091#define JSONCPP_NOEXCEPT noexcept
92#define JSONCPP_OP_EXPLICIT explicit
Hans Johnson31d65712019-01-11 14:13:08 -060093#elif defined(_MSC_VER) && _MSC_VER < 1900
Billy Donahueb5e1fe82018-05-20 16:55:27 -040094#define JSONCPP_NOEXCEPT throw()
Billy Donahueb5e1fe82018-05-20 16:55:27 -040095#define JSONCPP_OP_EXPLICIT explicit
Billy Donahueb5e1fe82018-05-20 16:55:27 -040096#elif defined(_MSC_VER) && _MSC_VER >= 1900
Billy Donahueb5e1fe82018-05-20 16:55:27 -040097#define JSONCPP_NOEXCEPT noexcept
98#define JSONCPP_OP_EXPLICIT explicit
99#else
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400100#define JSONCPP_NOEXCEPT throw()
101#define JSONCPP_OP_EXPLICIT
Jean-Christophe Fillion-Robinba6fa482016-04-25 17:35:12 -0400102#endif
Motti2b008912015-04-20 17:44:47 +0300103
104#ifndef JSON_HAS_RVALUE_REFERENCES
105
Hans Johnson31d65712019-01-11 14:13:08 -0600106#if defined(_MSC_VER)
Motti2b008912015-04-20 17:44:47 +0300107#define JSON_HAS_RVALUE_REFERENCES 1
Hans Johnson31d65712019-01-11 14:13:08 -0600108#endif // MSVC >= 2013
Motti2b008912015-04-20 17:44:47 +0300109
110#ifdef __clang__
111#if __has_feature(cxx_rvalue_references)
112#define JSON_HAS_RVALUE_REFERENCES 1
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400113#endif // has_feature
Motti2b008912015-04-20 17:44:47 +0300114
115#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
116#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
117#define JSON_HAS_RVALUE_REFERENCES 1
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400118#endif // GXX_EXPERIMENTAL
Motti2b008912015-04-20 17:44:47 +0300119
120#endif // __clang__ || __GNUC__
121
122#endif // not defined JSON_HAS_RVALUE_REFERENCES
123
124#ifndef JSON_HAS_RVALUE_REFERENCES
125#define JSON_HAS_RVALUE_REFERENCES 0
Dani-Hub50039832015-03-08 18:48:24 +0100126#endif
Motti2b008912015-04-20 17:44:47 +0300127
128#ifdef __clang__
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400129#if __has_extension(attribute_deprecated_with_message)
130#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
131#endif
Motti2b008912015-04-20 17:44:47 +0300132#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400133#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
134#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
135#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
136#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
137#endif // GNUC version
Motti2b008912015-04-20 17:44:47 +0300138#endif // __clang__ || __GNUC__
Baptiste Lepilleurb2e8ccc2011-05-01 16:27:55 +0000139
140#if !defined(JSONCPP_DEPRECATED)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000141#define JSONCPP_DEPRECATED(message)
Baptiste Lepilleurb2e8ccc2011-05-01 16:27:55 +0000142#endif // if !defined(JSONCPP_DEPRECATED)
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000143
Christopher Dunn95f120f2016-02-07 11:09:41 -0600144#if __GNUC__ >= 6
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400145#define JSON_USE_INT64_DOUBLE_CONVERSION 1
Christopher Dunn95f120f2016-02-07 11:09:41 -0600146#endif
147
Christopher Dunn12c67e82016-03-21 20:33:15 -0500148#if !defined(JSON_IS_AMALGAMATION)
dawescf8674c62016-03-06 11:42:11 -0600149
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500150#include "allocator.h"
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400151#include "version.h"
Christopher Dunn12c67e82016-03-21 20:33:15 -0500152
Christopher Dunn12c67e82016-03-21 20:33:15 -0500153#endif // if !defined(JSON_IS_AMALGAMATION)
dawescf8674c62016-03-06 11:42:11 -0600154
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000155namespace Json {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000156typedef int Int;
157typedef unsigned int UInt;
158#if defined(JSON_NO_INT64)
159typedef int LargestInt;
160typedef unsigned int LargestUInt;
161#undef JSON_HAS_INT64
162#else // if defined(JSON_NO_INT64)
163// For Microsoft Visual use specific types as long long is not supported
164#if defined(_MSC_VER) // Microsoft Visual Studio
165typedef __int64 Int64;
166typedef unsigned __int64 UInt64;
167#else // if defined(_MSC_VER) // Other platforms, use long long
Christopher Dunnb9afdf12016-08-21 19:58:43 -0500168typedef int64_t Int64;
169typedef uint64_t UInt64;
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400170#endif // if defined(_MSC_VER)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000171typedef Int64 LargestInt;
172typedef UInt64 LargestUInt;
173#define JSON_HAS_INT64
174#endif // if defined(JSON_NO_INT64)
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500175
176template <typename T>
177using Allocator = typename std::conditional<JSONCPP_USING_SECURE_MEMORY,
178 SecureAllocator<T>,
179 std::allocator<T> >::type;
180using String =
181 std::basic_string<char, std::char_traits<char>, Allocator<char> >;
182using IStringStream = std::basic_istringstream<String::value_type,
183 String::traits_type,
184 String::allocator_type>;
185using OStringStream = std::basic_ostringstream<String::value_type,
186 String::traits_type,
187 String::allocator_type>;
188using IStream = std::istream;
189using OStream = std::ostream;
190} // namespace Json
191
192// Legacy names (formerly macros).
193using JSONCPP_STRING = Json::String;
194using JSONCPP_ISTRINGSTREAM = Json::IStringStream;
195using JSONCPP_OSTRINGSTREAM = Json::OStringStream;
196using JSONCPP_ISTREAM = Json::IStream;
197using JSONCPP_OSTREAM = Json::OStream;
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000198
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000199#endif // JSON_CONFIG_H_INCLUDED