blob: eca9e8c456472871592be667fff65925f8b88742 [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
Frank Richterb16abf82019-03-22 10:15:08 +010051#elif defined(__GNUC__) || defined(__clang__)
52#define JSON_API __attribute__((visibility("default")))
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100053#endif // if defined(_MSC_VER)
54#elif defined(JSON_DLL)
Gaurav8aabf932016-03-08 17:34:22 +053055#if defined(_MSC_VER) || defined(__MINGW32__)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100056#define JSON_API __declspec(dllimport)
57#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
58#endif // if defined(_MSC_VER)
59#endif // ifdef JSON_IN_CPPTL
60#if !defined(JSON_API)
61#define JSON_API
62#endif
Christopher Dunn6d135cb2007-06-13 15:51:04 +000063
Hans Johnson31d65712019-01-11 14:13:08 -060064#if defined(_MSC_VER) && _MSC_VER < 1800
Billy Donahuedc4a7f92019-01-17 11:07:53 -050065#error \
66 "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 -060067#endif
68
Hans Johnson5c8e5392018-12-12 13:31:55 -060069#if defined(_MSC_VER) && _MSC_VER < 1900
Billy Donahuedc4a7f92019-01-17 11:07:53 -050070// As recommended at
71// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
72extern JSON_API int
73msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
74#define jsoncpp_snprintf msvc_pre1900_c99_snprintf
Hans Johnson5c8e5392018-12-12 13:31:55 -060075#else
Billy Donahuedc4a7f92019-01-17 11:07:53 -050076#define jsoncpp_snprintf std::snprintf
Hans Johnson5c8e5392018-12-12 13:31:55 -060077#endif
78
Aaron Jacobs9fa4e842014-07-01 08:48:54 +100079// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
80// integer
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +000081// Storages, and 64 bits integer support is disabled.
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +000082// #define JSON_NO_INT64 1
83
Billy Donahuedc4a7f92019-01-17 11:07:53 -050084// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools.
85// C++11 should be used directly in JSONCPP.
86#define JSONCPP_OVERRIDE override
87
Christopher Dunne0f9aab2016-06-26 17:52:19 -050088#if __cplusplus >= 201103L
Billy Donahueb5e1fe82018-05-20 16:55:27 -040089#define JSONCPP_NOEXCEPT noexcept
90#define JSONCPP_OP_EXPLICIT explicit
Hans Johnson31d65712019-01-11 14:13:08 -060091#elif defined(_MSC_VER) && _MSC_VER < 1900
Billy Donahueb5e1fe82018-05-20 16:55:27 -040092#define JSONCPP_NOEXCEPT throw()
Billy Donahueb5e1fe82018-05-20 16:55:27 -040093#define JSONCPP_OP_EXPLICIT explicit
Billy Donahueb5e1fe82018-05-20 16:55:27 -040094#elif defined(_MSC_VER) && _MSC_VER >= 1900
Billy Donahueb5e1fe82018-05-20 16:55:27 -040095#define JSONCPP_NOEXCEPT noexcept
96#define JSONCPP_OP_EXPLICIT explicit
97#else
Billy Donahueb5e1fe82018-05-20 16:55:27 -040098#define JSONCPP_NOEXCEPT throw()
99#define JSONCPP_OP_EXPLICIT
Jean-Christophe Fillion-Robinba6fa482016-04-25 17:35:12 -0400100#endif
Motti2b008912015-04-20 17:44:47 +0300101
Motti2b008912015-04-20 17:44:47 +0300102#ifdef __clang__
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400103#if __has_extension(attribute_deprecated_with_message)
104#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
105#endif
Motti2b008912015-04-20 17:44:47 +0300106#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400107#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
108#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
109#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
110#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
Jordan Baylesd5bd1a72019-06-24 14:06:45 -0700111#endif // GNUC version
112#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates
113 // MSVC)
Marcel Raad36d8cfd2019-02-25 15:24:03 +0100114#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
115#endif // __clang__ || __GNUC__ || _MSC_VER
Baptiste Lepilleurb2e8ccc2011-05-01 16:27:55 +0000116
117#if !defined(JSONCPP_DEPRECATED)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000118#define JSONCPP_DEPRECATED(message)
Baptiste Lepilleurb2e8ccc2011-05-01 16:27:55 +0000119#endif // if !defined(JSONCPP_DEPRECATED)
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000120
Christopher Dunn95f120f2016-02-07 11:09:41 -0600121#if __GNUC__ >= 6
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400122#define JSON_USE_INT64_DOUBLE_CONVERSION 1
Christopher Dunn95f120f2016-02-07 11:09:41 -0600123#endif
124
Christopher Dunn12c67e82016-03-21 20:33:15 -0500125#if !defined(JSON_IS_AMALGAMATION)
dawescf8674c62016-03-06 11:42:11 -0600126
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500127#include "allocator.h"
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400128#include "version.h"
Christopher Dunn12c67e82016-03-21 20:33:15 -0500129
Christopher Dunn12c67e82016-03-21 20:33:15 -0500130#endif // if !defined(JSON_IS_AMALGAMATION)
dawescf8674c62016-03-06 11:42:11 -0600131
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000132namespace Json {
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000133typedef int Int;
134typedef unsigned int UInt;
135#if defined(JSON_NO_INT64)
136typedef int LargestInt;
137typedef unsigned int LargestUInt;
138#undef JSON_HAS_INT64
139#else // if defined(JSON_NO_INT64)
140// For Microsoft Visual use specific types as long long is not supported
141#if defined(_MSC_VER) // Microsoft Visual Studio
142typedef __int64 Int64;
143typedef unsigned __int64 UInt64;
144#else // if defined(_MSC_VER) // Other platforms, use long long
Christopher Dunnb9afdf12016-08-21 19:58:43 -0500145typedef int64_t Int64;
146typedef uint64_t UInt64;
Billy Donahueb5e1fe82018-05-20 16:55:27 -0400147#endif // if defined(_MSC_VER)
Aaron Jacobs9fa4e842014-07-01 08:48:54 +1000148typedef Int64 LargestInt;
149typedef UInt64 LargestUInt;
150#define JSON_HAS_INT64
151#endif // if defined(JSON_NO_INT64)
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500152
153template <typename T>
154using Allocator = typename std::conditional<JSONCPP_USING_SECURE_MEMORY,
155 SecureAllocator<T>,
Billy Donahue2b593a92019-01-18 03:46:57 -0500156 std::allocator<T>>::type;
157using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
Billy Donahue1c2ed7a2019-01-17 16:35:29 -0500158using IStringStream = std::basic_istringstream<String::value_type,
159 String::traits_type,
160 String::allocator_type>;
161using OStringStream = std::basic_ostringstream<String::value_type,
162 String::traits_type,
163 String::allocator_type>;
164using IStream = std::istream;
165using OStream = std::ostream;
166} // namespace Json
167
168// Legacy names (formerly macros).
169using JSONCPP_STRING = Json::String;
170using JSONCPP_ISTRINGSTREAM = Json::IStringStream;
171using JSONCPP_OSTRINGSTREAM = Json::OStringStream;
172using JSONCPP_ISTREAM = Json::IStream;
173using JSONCPP_OSTREAM = Json::OStream;
Baptiste Lepilleur201fb2c2010-04-19 07:37:41 +0000174
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000175#endif // JSON_CONFIG_H_INCLUDED