first
This commit is contained in:
parent
8e8a572843
commit
ced33f5abc
4
chargingstation-aiter/README.md
Normal file
4
chargingstation-aiter/README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# 充电桩(用于厂家给的有novif功能的固件)
|
||||||
|
|
||||||
|
用于在owl厂商给的固件中运行充电桩程序的编译代码,因为摄像头调用部分有差异,防止错乱,新开仓库。
|
||||||
|
提供代码,其余用于编译的文件大小较大,不上传到git,可想厂家索取。
|
BIN
chargingstation-aiter/include/._curl
Normal file
BIN
chargingstation-aiter/include/._curl
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._drm_func.h
Normal file
BIN
chargingstation-aiter/include/._drm_func.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._json.hpp
Normal file
BIN
chargingstation-aiter/include/._json.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._librtsp
Normal file
BIN
chargingstation-aiter/include/._librtsp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._nlohmann
Normal file
BIN
chargingstation-aiter/include/._nlohmann
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._rga_func.h
Normal file
BIN
chargingstation-aiter/include/._rga_func.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._yolov5_detect.h
Normal file
BIN
chargingstation-aiter/include/._yolov5_detect.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/._yolov5_detect_postprocess.h
Normal file
BIN
chargingstation-aiter/include/._yolov5_detect_postprocess.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._curl.h
Normal file
BIN
chargingstation-aiter/include/curl/._curl.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._curlver.h
Normal file
BIN
chargingstation-aiter/include/curl/._curlver.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._easy.h
Normal file
BIN
chargingstation-aiter/include/curl/._easy.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._mprintf.h
Normal file
BIN
chargingstation-aiter/include/curl/._mprintf.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._multi.h
Normal file
BIN
chargingstation-aiter/include/curl/._multi.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._stdcheaders.h
Normal file
BIN
chargingstation-aiter/include/curl/._stdcheaders.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._system.h
Normal file
BIN
chargingstation-aiter/include/curl/._system.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._typecheck-gcc.h
Normal file
BIN
chargingstation-aiter/include/curl/._typecheck-gcc.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/curl/._urlapi.h
Normal file
BIN
chargingstation-aiter/include/curl/._urlapi.h
Normal file
Binary file not shown.
2897
chargingstation-aiter/include/curl/curl.h
Normal file
2897
chargingstation-aiter/include/curl/curl.h
Normal file
File diff suppressed because it is too large
Load Diff
77
chargingstation-aiter/include/curl/curlver.h
Normal file
77
chargingstation-aiter/include/curl/curlver.h
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#ifndef CURLINC_CURLVER_H
|
||||||
|
#define CURLINC_CURLVER_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* This header file contains nothing but libcurl version info, generated by
|
||||||
|
a script at release-time. This was made its own header file in 7.11.2 */
|
||||||
|
|
||||||
|
/* This is the global package copyright */
|
||||||
|
#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."
|
||||||
|
|
||||||
|
/* This is the version number of the libcurl package from which this header
|
||||||
|
file origins: */
|
||||||
|
#define LIBCURL_VERSION "7.68.0"
|
||||||
|
|
||||||
|
/* The numeric version number is also available "in parts" by using these
|
||||||
|
defines: */
|
||||||
|
#define LIBCURL_VERSION_MAJOR 7
|
||||||
|
#define LIBCURL_VERSION_MINOR 68
|
||||||
|
#define LIBCURL_VERSION_PATCH 0
|
||||||
|
|
||||||
|
/* This is the numeric version of the libcurl version number, meant for easier
|
||||||
|
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||||
|
always follow this syntax:
|
||||||
|
|
||||||
|
0xXXYYZZ
|
||||||
|
|
||||||
|
Where XX, YY and ZZ are the main version, release and patch numbers in
|
||||||
|
hexadecimal (using 8 bits each). All three numbers are always represented
|
||||||
|
using two digits. 1.2 would appear as "0x010200" while version 9.11.7
|
||||||
|
appears as "0x090b07".
|
||||||
|
|
||||||
|
This 6-digit (24 bits) hexadecimal number does not show pre-release number,
|
||||||
|
and it is always a greater number in a more recent release. It makes
|
||||||
|
comparisons with greater than and less than work.
|
||||||
|
|
||||||
|
Note: This define is the full hex number and _does not_ use the
|
||||||
|
CURL_VERSION_BITS() macro since curl's own configure script greps for it
|
||||||
|
and needs it to contain the full number.
|
||||||
|
*/
|
||||||
|
#define LIBCURL_VERSION_NUM 0x074400
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the date and time when the full source package was created. The
|
||||||
|
* timestamp is not stored in git, as the timestamp is properly set in the
|
||||||
|
* tarballs by the maketgz script.
|
||||||
|
*
|
||||||
|
* The format of the date follows this template:
|
||||||
|
*
|
||||||
|
* "2007-11-23"
|
||||||
|
*/
|
||||||
|
#define LIBCURL_TIMESTAMP "2020-01-08"
|
||||||
|
|
||||||
|
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
|
||||||
|
#define CURL_AT_LEAST_VERSION(x,y,z) \
|
||||||
|
(LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
|
||||||
|
|
||||||
|
#endif /* CURLINC_CURLVER_H */
|
112
chargingstation-aiter/include/curl/easy.h
Normal file
112
chargingstation-aiter/include/curl/easy.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
#ifndef CURLINC_EASY_H
|
||||||
|
#define CURLINC_EASY_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CURL_EXTERN CURL *curl_easy_init(void);
|
||||||
|
CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
|
||||||
|
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
|
||||||
|
CURL_EXTERN void curl_easy_cleanup(CURL *curl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_getinfo()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Request internal information from the curl session with this function. The
|
||||||
|
* third argument MUST be a pointer to a long, a pointer to a char * or a
|
||||||
|
* pointer to a double (as the documentation describes elsewhere). The data
|
||||||
|
* pointed to will be filled in accordingly and can be relied upon only if the
|
||||||
|
* function returns CURLE_OK. This function is intended to get used *AFTER* a
|
||||||
|
* performed transfer, all results from this function are undefined until the
|
||||||
|
* transfer is completed.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_duphandle()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Creates a new curl session handle with the same options set for the handle
|
||||||
|
* passed in. Duplicating a handle could only be a matter of cloning data and
|
||||||
|
* options, internal state info and things like persistent connections cannot
|
||||||
|
* be transferred. It is useful in multithreaded applications when you can run
|
||||||
|
* curl_easy_duphandle() for each new thread to avoid a series of identical
|
||||||
|
* curl_easy_setopt() invokes in every thread.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_reset()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Re-initializes a CURL handle to the default values. This puts back the
|
||||||
|
* handle to the same state as it was in when it was just created.
|
||||||
|
*
|
||||||
|
* It does keep: live connections, the Session ID cache, the DNS cache and the
|
||||||
|
* cookies.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN void curl_easy_reset(CURL *curl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_recv()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Receives data from the connected socket. Use after successful
|
||||||
|
* curl_easy_perform() with CURLOPT_CONNECT_ONLY option.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen,
|
||||||
|
size_t *n);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_send()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Sends data over the connected socket. Use after successful
|
||||||
|
* curl_easy_perform() with CURLOPT_CONNECT_ONLY option.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer,
|
||||||
|
size_t buflen, size_t *n);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_easy_upkeep()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Performs connection upkeep for the given session handle.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLcode curl_easy_upkeep(CURL *curl);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
50
chargingstation-aiter/include/curl/mprintf.h
Normal file
50
chargingstation-aiter/include/curl/mprintf.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#ifndef CURLINC_MPRINTF_H
|
||||||
|
#define CURLINC_MPRINTF_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h> /* needed for FILE */
|
||||||
|
#include "curl.h" /* for CURL_EXTERN */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CURL_EXTERN int curl_mprintf(const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength,
|
||||||
|
const char *format, ...);
|
||||||
|
CURL_EXTERN int curl_mvprintf(const char *format, va_list args);
|
||||||
|
CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args);
|
||||||
|
CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args);
|
||||||
|
CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength,
|
||||||
|
const char *format, va_list args);
|
||||||
|
CURL_EXTERN char *curl_maprintf(const char *format, ...);
|
||||||
|
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CURLINC_MPRINTF_H */
|
468
chargingstation-aiter/include/curl/multi.h
Normal file
468
chargingstation-aiter/include/curl/multi.h
Normal file
@ -0,0 +1,468 @@
|
|||||||
|
#ifndef CURLINC_MULTI_H
|
||||||
|
#define CURLINC_MULTI_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
/*
|
||||||
|
This is an "external" header file. Don't give away any internals here!
|
||||||
|
|
||||||
|
GOALS
|
||||||
|
|
||||||
|
o Enable a "pull" interface. The application that uses libcurl decides where
|
||||||
|
and when to ask libcurl to get/send data.
|
||||||
|
|
||||||
|
o Enable multiple simultaneous transfers in the same thread without making it
|
||||||
|
complicated for the application.
|
||||||
|
|
||||||
|
o Enable the application to select() on its own file descriptors and curl's
|
||||||
|
file descriptors simultaneous easily.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This header file should not really need to include "curl.h" since curl.h
|
||||||
|
* itself includes this file and we expect user applications to do #include
|
||||||
|
* <curl/curl.h> without the need for especially including multi.h.
|
||||||
|
*
|
||||||
|
* For some reason we added this include here at one point, and rather than to
|
||||||
|
* break existing (wrongly written) libcurl applications, we leave it as-is
|
||||||
|
* but with this warning attached.
|
||||||
|
*/
|
||||||
|
#include "curl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)
|
||||||
|
typedef struct Curl_multi CURLM;
|
||||||
|
#else
|
||||||
|
typedef void CURLM;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or
|
||||||
|
curl_multi_socket*() soon */
|
||||||
|
CURLM_OK,
|
||||||
|
CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */
|
||||||
|
CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */
|
||||||
|
CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */
|
||||||
|
CURLM_INTERNAL_ERROR, /* this is a libcurl bug */
|
||||||
|
CURLM_BAD_SOCKET, /* the passed in socket argument did not match */
|
||||||
|
CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */
|
||||||
|
CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was
|
||||||
|
attempted to get added - again */
|
||||||
|
CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
|
||||||
|
callback */
|
||||||
|
CURLM_WAKEUP_FAILURE, /* wakeup is unavailable or failed */
|
||||||
|
CURLM_LAST
|
||||||
|
} CURLMcode;
|
||||||
|
|
||||||
|
/* just to make code nicer when using curl_multi_socket() you can now check
|
||||||
|
for CURLM_CALL_MULTI_SOCKET too in the same style it works for
|
||||||
|
curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */
|
||||||
|
#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM
|
||||||
|
|
||||||
|
/* bitmask bits for CURLMOPT_PIPELINING */
|
||||||
|
#define CURLPIPE_NOTHING 0L
|
||||||
|
#define CURLPIPE_HTTP1 1L
|
||||||
|
#define CURLPIPE_MULTIPLEX 2L
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLMSG_NONE, /* first, not used */
|
||||||
|
CURLMSG_DONE, /* This easy handle has completed. 'result' contains
|
||||||
|
the CURLcode of the transfer */
|
||||||
|
CURLMSG_LAST /* last, not used */
|
||||||
|
} CURLMSG;
|
||||||
|
|
||||||
|
struct CURLMsg {
|
||||||
|
CURLMSG msg; /* what this message means */
|
||||||
|
CURL *easy_handle; /* the handle it concerns */
|
||||||
|
union {
|
||||||
|
void *whatever; /* message-specific data */
|
||||||
|
CURLcode result; /* return code for transfer */
|
||||||
|
} data;
|
||||||
|
};
|
||||||
|
typedef struct CURLMsg CURLMsg;
|
||||||
|
|
||||||
|
/* Based on poll(2) structure and values.
|
||||||
|
* We don't use pollfd and POLL* constants explicitly
|
||||||
|
* to cover platforms without poll(). */
|
||||||
|
#define CURL_WAIT_POLLIN 0x0001
|
||||||
|
#define CURL_WAIT_POLLPRI 0x0002
|
||||||
|
#define CURL_WAIT_POLLOUT 0x0004
|
||||||
|
|
||||||
|
struct curl_waitfd {
|
||||||
|
curl_socket_t fd;
|
||||||
|
short events;
|
||||||
|
short revents; /* not supported yet */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_init()
|
||||||
|
*
|
||||||
|
* Desc: inititalize multi-style curl usage
|
||||||
|
*
|
||||||
|
* Returns: a new CURLM handle to use in all 'curl_multi' functions.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLM *curl_multi_init(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_add_handle()
|
||||||
|
*
|
||||||
|
* Desc: add a standard curl handle to the multi stack
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
||||||
|
CURL *curl_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_remove_handle()
|
||||||
|
*
|
||||||
|
* Desc: removes a curl handle from the multi stack again
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
||||||
|
CURL *curl_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_fdset()
|
||||||
|
*
|
||||||
|
* Desc: Ask curl for its fd_set sets. The app can use these to select() or
|
||||||
|
* poll() on. We want curl_multi_perform() called as soon as one of
|
||||||
|
* them are ready.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
|
||||||
|
fd_set *read_fd_set,
|
||||||
|
fd_set *write_fd_set,
|
||||||
|
fd_set *exc_fd_set,
|
||||||
|
int *max_fd);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_wait()
|
||||||
|
*
|
||||||
|
* Desc: Poll on all fds within a CURLM set as well as any
|
||||||
|
* additional fds passed to the function.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
|
||||||
|
struct curl_waitfd extra_fds[],
|
||||||
|
unsigned int extra_nfds,
|
||||||
|
int timeout_ms,
|
||||||
|
int *ret);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_poll()
|
||||||
|
*
|
||||||
|
* Desc: Poll on all fds within a CURLM set as well as any
|
||||||
|
* additional fds passed to the function.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
|
||||||
|
struct curl_waitfd extra_fds[],
|
||||||
|
unsigned int extra_nfds,
|
||||||
|
int timeout_ms,
|
||||||
|
int *ret);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_wakeup()
|
||||||
|
*
|
||||||
|
* Desc: wakes up a sleeping curl_multi_poll call.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_wakeup(CURLM *multi_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_perform()
|
||||||
|
*
|
||||||
|
* Desc: When the app thinks there's data available for curl it calls this
|
||||||
|
* function to read/write whatever there is right now. This returns
|
||||||
|
* as soon as the reads and writes are done. This function does not
|
||||||
|
* require that there actually is data available for reading or that
|
||||||
|
* data can be written, it can be called just in case. It returns
|
||||||
|
* the number of handles that still transfer data in the second
|
||||||
|
* argument's integer-pointer.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code. *NOTE* that this only
|
||||||
|
* returns errors etc regarding the whole multi stack. There might
|
||||||
|
* still have occurred problems on individual transfers even when
|
||||||
|
* this returns OK.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_cleanup()
|
||||||
|
*
|
||||||
|
* Desc: Cleans up and removes a whole multi stack. It does not free or
|
||||||
|
* touch any individual easy handles in any way. We need to define
|
||||||
|
* in what state those handles will be if this function is called
|
||||||
|
* in the middle of a transfer.
|
||||||
|
*
|
||||||
|
* Returns: CURLMcode type, general multi error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_info_read()
|
||||||
|
*
|
||||||
|
* Desc: Ask the multi handle if there's any messages/informationals from
|
||||||
|
* the individual transfers. Messages include informationals such as
|
||||||
|
* error code from the transfer or just the fact that a transfer is
|
||||||
|
* completed. More details on these should be written down as well.
|
||||||
|
*
|
||||||
|
* Repeated calls to this function will return a new struct each
|
||||||
|
* time, until a special "end of msgs" struct is returned as a signal
|
||||||
|
* that there is no more to get at this point.
|
||||||
|
*
|
||||||
|
* The data the returned pointer points to will not survive calling
|
||||||
|
* curl_multi_cleanup().
|
||||||
|
*
|
||||||
|
* The 'CURLMsg' struct is meant to be very simple and only contain
|
||||||
|
* very basic information. If more involved information is wanted,
|
||||||
|
* we will provide the particular "transfer handle" in that struct
|
||||||
|
* and that should/could/would be used in subsequent
|
||||||
|
* curl_easy_getinfo() calls (or similar). The point being that we
|
||||||
|
* must never expose complex structs to applications, as then we'll
|
||||||
|
* undoubtably get backwards compatibility problems in the future.
|
||||||
|
*
|
||||||
|
* Returns: A pointer to a filled-in struct, or NULL if it failed or ran out
|
||||||
|
* of structs. It also writes the number of messages left in the
|
||||||
|
* queue (after this read) in the integer the second argument points
|
||||||
|
* to.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
||||||
|
int *msgs_in_queue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_strerror()
|
||||||
|
*
|
||||||
|
* Desc: The curl_multi_strerror function may be used to turn a CURLMcode
|
||||||
|
* value into the equivalent human readable error string. This is
|
||||||
|
* useful for printing meaningful error messages.
|
||||||
|
*
|
||||||
|
* Returns: A pointer to a zero-terminated error message.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_socket() and
|
||||||
|
* curl_multi_socket_all()
|
||||||
|
*
|
||||||
|
* Desc: An alternative version of curl_multi_perform() that allows the
|
||||||
|
* application to pass in one of the file descriptors that have been
|
||||||
|
* detected to have "action" on them and let libcurl perform.
|
||||||
|
* See man page for details.
|
||||||
|
*/
|
||||||
|
#define CURL_POLL_NONE 0
|
||||||
|
#define CURL_POLL_IN 1
|
||||||
|
#define CURL_POLL_OUT 2
|
||||||
|
#define CURL_POLL_INOUT 3
|
||||||
|
#define CURL_POLL_REMOVE 4
|
||||||
|
|
||||||
|
#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD
|
||||||
|
|
||||||
|
#define CURL_CSELECT_IN 0x01
|
||||||
|
#define CURL_CSELECT_OUT 0x02
|
||||||
|
#define CURL_CSELECT_ERR 0x04
|
||||||
|
|
||||||
|
typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */
|
||||||
|
curl_socket_t s, /* socket */
|
||||||
|
int what, /* see above */
|
||||||
|
void *userp, /* private callback
|
||||||
|
pointer */
|
||||||
|
void *socketp); /* private socket
|
||||||
|
pointer */
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_timer_callback
|
||||||
|
*
|
||||||
|
* Desc: Called by libcurl whenever the library detects a change in the
|
||||||
|
* maximum number of milliseconds the app is allowed to wait before
|
||||||
|
* curl_multi_socket() or curl_multi_perform() must be called
|
||||||
|
* (to allow libcurl's timed events to take place).
|
||||||
|
*
|
||||||
|
* Returns: The callback should return zero.
|
||||||
|
*/
|
||||||
|
typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */
|
||||||
|
long timeout_ms, /* see above */
|
||||||
|
void *userp); /* private callback
|
||||||
|
pointer */
|
||||||
|
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
|
||||||
|
curl_socket_t s,
|
||||||
|
int ev_bitmask,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
|
||||||
|
int *running_handles);
|
||||||
|
|
||||||
|
#ifndef CURL_ALLOW_OLD_MULTI_SOCKET
|
||||||
|
/* This macro below was added in 7.16.3 to push users who recompile to use
|
||||||
|
the new curl_multi_socket_action() instead of the old curl_multi_socket()
|
||||||
|
*/
|
||||||
|
#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_timeout()
|
||||||
|
*
|
||||||
|
* Desc: Returns the maximum number of milliseconds the app is allowed to
|
||||||
|
* wait before curl_multi_socket() or curl_multi_perform() must be
|
||||||
|
* called (to allow libcurl's timed events to take place).
|
||||||
|
*
|
||||||
|
* Returns: CURLM error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
|
||||||
|
long *milliseconds);
|
||||||
|
|
||||||
|
#undef CINIT /* re-using the same name as in curl.h */
|
||||||
|
|
||||||
|
#ifdef CURL_ISOCPP
|
||||||
|
#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num
|
||||||
|
#else
|
||||||
|
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
|
||||||
|
#define LONG CURLOPTTYPE_LONG
|
||||||
|
#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT
|
||||||
|
#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
|
||||||
|
#define OFF_T CURLOPTTYPE_OFF_T
|
||||||
|
#define CINIT(name,type,number) CURLMOPT_/**/name = type + number
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* This is the socket callback function pointer */
|
||||||
|
CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1),
|
||||||
|
|
||||||
|
/* This is the argument passed to the socket callback */
|
||||||
|
CINIT(SOCKETDATA, OBJECTPOINT, 2),
|
||||||
|
|
||||||
|
/* set to 1 to enable pipelining for this multi handle */
|
||||||
|
CINIT(PIPELINING, LONG, 3),
|
||||||
|
|
||||||
|
/* This is the timer callback function pointer */
|
||||||
|
CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4),
|
||||||
|
|
||||||
|
/* This is the argument passed to the timer callback */
|
||||||
|
CINIT(TIMERDATA, OBJECTPOINT, 5),
|
||||||
|
|
||||||
|
/* maximum number of entries in the connection cache */
|
||||||
|
CINIT(MAXCONNECTS, LONG, 6),
|
||||||
|
|
||||||
|
/* maximum number of (pipelining) connections to one host */
|
||||||
|
CINIT(MAX_HOST_CONNECTIONS, LONG, 7),
|
||||||
|
|
||||||
|
/* maximum number of requests in a pipeline */
|
||||||
|
CINIT(MAX_PIPELINE_LENGTH, LONG, 8),
|
||||||
|
|
||||||
|
/* a connection with a content-length longer than this
|
||||||
|
will not be considered for pipelining */
|
||||||
|
CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9),
|
||||||
|
|
||||||
|
/* a connection with a chunk length longer than this
|
||||||
|
will not be considered for pipelining */
|
||||||
|
CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10),
|
||||||
|
|
||||||
|
/* a list of site names(+port) that are blacklisted from
|
||||||
|
pipelining */
|
||||||
|
CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11),
|
||||||
|
|
||||||
|
/* a list of server types that are blacklisted from
|
||||||
|
pipelining */
|
||||||
|
CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12),
|
||||||
|
|
||||||
|
/* maximum number of open connections in total */
|
||||||
|
CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13),
|
||||||
|
|
||||||
|
/* This is the server push callback function pointer */
|
||||||
|
CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14),
|
||||||
|
|
||||||
|
/* This is the argument passed to the server push callback */
|
||||||
|
CINIT(PUSHDATA, OBJECTPOINT, 15),
|
||||||
|
|
||||||
|
/* maximum number of concurrent streams to support on a connection */
|
||||||
|
CINIT(MAX_CONCURRENT_STREAMS, LONG, 16),
|
||||||
|
|
||||||
|
CURLMOPT_LASTENTRY /* the last unused */
|
||||||
|
} CURLMoption;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_setopt()
|
||||||
|
*
|
||||||
|
* Desc: Sets options for the multi handle.
|
||||||
|
*
|
||||||
|
* Returns: CURLM error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle,
|
||||||
|
CURLMoption option, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_multi_assign()
|
||||||
|
*
|
||||||
|
* Desc: This function sets an association in the multi handle between the
|
||||||
|
* given socket and a private pointer of the application. This is
|
||||||
|
* (only) useful for curl_multi_socket uses.
|
||||||
|
*
|
||||||
|
* Returns: CURLM error code.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,
|
||||||
|
curl_socket_t sockfd, void *sockp);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name: curl_push_callback
|
||||||
|
*
|
||||||
|
* Desc: This callback gets called when a new stream is being pushed by the
|
||||||
|
* server. It approves or denies the new stream.
|
||||||
|
*
|
||||||
|
* Returns: CURL_PUSH_OK or CURL_PUSH_DENY.
|
||||||
|
*/
|
||||||
|
#define CURL_PUSH_OK 0
|
||||||
|
#define CURL_PUSH_DENY 1
|
||||||
|
|
||||||
|
struct curl_pushheaders; /* forward declaration only */
|
||||||
|
|
||||||
|
CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h,
|
||||||
|
size_t num);
|
||||||
|
CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
|
typedef int (*curl_push_callback)(CURL *parent,
|
||||||
|
CURL *easy,
|
||||||
|
size_t num_headers,
|
||||||
|
struct curl_pushheaders *headers,
|
||||||
|
void *userp);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end of extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
33
chargingstation-aiter/include/curl/stdcheaders.h
Normal file
33
chargingstation-aiter/include/curl/stdcheaders.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#ifndef CURLINC_STDCHEADERS_H
|
||||||
|
#define CURLINC_STDCHEADERS_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
size_t fread(void *, size_t, size_t, FILE *);
|
||||||
|
size_t fwrite(const void *, size_t, size_t, FILE *);
|
||||||
|
|
||||||
|
int strcasecmp(const char *, const char *);
|
||||||
|
int strncasecmp(const char *, const char *, size_t);
|
||||||
|
|
||||||
|
#endif /* CURLINC_STDCHEADERS_H */
|
504
chargingstation-aiter/include/curl/system.h
Normal file
504
chargingstation-aiter/include/curl/system.h
Normal file
@ -0,0 +1,504 @@
|
|||||||
|
#ifndef CURLINC_SYSTEM_H
|
||||||
|
#define CURLINC_SYSTEM_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to keep one section per platform, compiler and architecture, otherwise,
|
||||||
|
* if an existing section is reused for a different one and later on the
|
||||||
|
* original is adjusted, probably the piggybacking one can be adversely
|
||||||
|
* changed.
|
||||||
|
*
|
||||||
|
* In order to differentiate between platforms/compilers/architectures use
|
||||||
|
* only compiler built in predefined preprocessor symbols.
|
||||||
|
*
|
||||||
|
* curl_off_t
|
||||||
|
* ----------
|
||||||
|
*
|
||||||
|
* For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit
|
||||||
|
* wide signed integral data type. The width of this data type must remain
|
||||||
|
* constant and independent of any possible large file support settings.
|
||||||
|
*
|
||||||
|
* As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit
|
||||||
|
* wide signed integral data type if there is no 64-bit type.
|
||||||
|
*
|
||||||
|
* As a general rule, curl_off_t shall not be mapped to off_t. This rule shall
|
||||||
|
* only be violated if off_t is the only 64-bit data type available and the
|
||||||
|
* size of off_t is independent of large file support settings. Keep your
|
||||||
|
* build on the safe side avoiding an off_t gating. If you have a 64-bit
|
||||||
|
* off_t then take for sure that another 64-bit data type exists, dig deeper
|
||||||
|
* and you will find it.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__DJGPP__) || defined(__GO32__)
|
||||||
|
# if defined(__DJGPP__) && (__DJGPP__ > 1)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__SALFORDC__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
|
# if (__BORLANDC__ < 0x520)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__TURBOC__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# if defined(__386__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__POCC__)
|
||||||
|
# if (__POCC__ < 280)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__LCC__)
|
||||||
|
# if defined(__e2k__) /* MCST eLbrus C Compiler */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# else /* Local (or Little) C Compiler */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__SYMBIAN32__)
|
||||||
|
# if defined(__EABI__) /* Treat all ARM compilers equally */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__CW32__)
|
||||||
|
# pragma longlong on
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__VC32__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
|
||||||
|
|
||||||
|
#elif defined(__MWERKS__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(_WIN32_WCE)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__MINGW32__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_WS2TCPIP_H 1
|
||||||
|
|
||||||
|
#elif defined(__VMS)
|
||||||
|
# if defined(__VAX)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
|
||||||
|
|
||||||
|
#elif defined(__OS400__)
|
||||||
|
# if defined(__ILEC400__)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__MVS__)
|
||||||
|
# if defined(__IBMC__) || defined(__IBMCPP__)
|
||||||
|
# if defined(_ILP32)
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# endif
|
||||||
|
# if defined(_LONG_LONG)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__370__)
|
||||||
|
# if defined(__IBMC__) || defined(__IBMCPP__)
|
||||||
|
# if defined(_ILP32)
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# endif
|
||||||
|
# if defined(_LONG_LONG)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(_LP64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(TPF)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
#elif defined(__TINYC__) /* also known as tcc */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */
|
||||||
|
# if !defined(__LP64) && (defined(__ILP32) || \
|
||||||
|
defined(__i386) || \
|
||||||
|
defined(__sparcv8) || \
|
||||||
|
defined(__sparcv8plus))
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__LP64) || \
|
||||||
|
defined(__amd64) || defined(__sparcv9)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
#elif defined(__xlc__) /* IBM xlc compiler */
|
||||||
|
# if !defined(_LP64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
/* ===================================== */
|
||||||
|
/* KEEP MSVC THE PENULTIMATE ENTRY */
|
||||||
|
/* ===================================== */
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T __int64
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "I64d"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "I64u"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T i64
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ui64
|
||||||
|
# else
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
|
||||||
|
/* ===================================== */
|
||||||
|
/* KEEP GENERIC GCC THE LAST ENTRY */
|
||||||
|
/* ===================================== */
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && !defined(_SCO_DS)
|
||||||
|
# if !defined(__LP64__) && \
|
||||||
|
(defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \
|
||||||
|
defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \
|
||||||
|
defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
|
||||||
|
defined(__XTENSA__) || \
|
||||||
|
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \
|
||||||
|
(defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L))
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "lld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "llu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T LL
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU ULL
|
||||||
|
# elif defined(__LP64__) || \
|
||||||
|
defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
|
||||||
|
defined(__e2k__) || \
|
||||||
|
(defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
|
||||||
|
(defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# endif
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
|
||||||
|
# define CURL_PULL_SYS_TYPES_H 1
|
||||||
|
# define CURL_PULL_SYS_SOCKET_H 1
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* generic "safe guess" on old 32 bit style */
|
||||||
|
# define CURL_TYPEOF_CURL_OFF_T long
|
||||||
|
# define CURL_FORMAT_CURL_OFF_T "ld"
|
||||||
|
# define CURL_FORMAT_CURL_OFF_TU "lu"
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_T L
|
||||||
|
# define CURL_SUFFIX_CURL_OFF_TU UL
|
||||||
|
# define CURL_TYPEOF_CURL_SOCKLEN_T int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _AIX
|
||||||
|
/* AIX needs <sys/poll.h> */
|
||||||
|
#define CURL_PULL_SYS_POLL_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */
|
||||||
|
/* ws2tcpip.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_WS2TCPIP_H
|
||||||
|
# include <winsock2.h>
|
||||||
|
# include <windows.h>
|
||||||
|
# include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */
|
||||||
|
/* sys/types.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_SYS_TYPES_H
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */
|
||||||
|
/* sys/socket.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_SYS_SOCKET_H
|
||||||
|
# include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */
|
||||||
|
/* sys/poll.h is required here to properly make type definitions below. */
|
||||||
|
#ifdef CURL_PULL_SYS_POLL_H
|
||||||
|
# include <sys/poll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Data type definition of curl_socklen_t. */
|
||||||
|
#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
|
||||||
|
typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Data type definition of curl_off_t. */
|
||||||
|
|
||||||
|
#ifdef CURL_TYPEOF_CURL_OFF_T
|
||||||
|
typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
|
||||||
|
* these to be visible and exported by the external libcurl interface API,
|
||||||
|
* while also making them visible to the library internals, simply including
|
||||||
|
* curl_setup.h, without actually needing to include curl.h internally.
|
||||||
|
* If some day this section would grow big enough, all this should be moved
|
||||||
|
* to its own header file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Figure out if we can use the ## preprocessor operator, which is supported
|
||||||
|
* by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
|
||||||
|
* or __cplusplus so we need to carefully check for them too.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
|
||||||
|
defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
|
||||||
|
defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
|
||||||
|
defined(__ILEC400__)
|
||||||
|
/* This compiler is believed to have an ISO compatible preprocessor */
|
||||||
|
#define CURL_ISOCPP
|
||||||
|
#else
|
||||||
|
/* This compiler is believed NOT to have an ISO compatible preprocessor */
|
||||||
|
#undef CURL_ISOCPP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros for minimum-width signed and unsigned curl_off_t integer constants.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
|
||||||
|
# define CURLINC_OFF_T_C_HLPR2(x) x
|
||||||
|
# define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x)
|
||||||
|
# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
|
||||||
|
CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
|
||||||
|
# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
|
||||||
|
CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
|
||||||
|
#else
|
||||||
|
# ifdef CURL_ISOCPP
|
||||||
|
# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
|
||||||
|
# else
|
||||||
|
# define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
|
||||||
|
# endif
|
||||||
|
# define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix)
|
||||||
|
# define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
|
||||||
|
# define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CURLINC_SYSTEM_H */
|
699
chargingstation-aiter/include/curl/typecheck-gcc.h
Normal file
699
chargingstation-aiter/include/curl/typecheck-gcc.h
Normal file
@ -0,0 +1,699 @@
|
|||||||
|
#ifndef CURLINC_TYPECHECK_GCC_H
|
||||||
|
#define CURLINC_TYPECHECK_GCC_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* wraps curl_easy_setopt() with typechecking */
|
||||||
|
|
||||||
|
/* To add a new kind of warning, add an
|
||||||
|
* if(curlcheck_sometype_option(_curl_opt))
|
||||||
|
* if(!curlcheck_sometype(value))
|
||||||
|
* _curl_easy_setopt_err_sometype();
|
||||||
|
* block and define curlcheck_sometype_option, curlcheck_sometype and
|
||||||
|
* _curl_easy_setopt_err_sometype below
|
||||||
|
*
|
||||||
|
* NOTE: We use two nested 'if' statements here instead of the && operator, in
|
||||||
|
* order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x
|
||||||
|
* when compiling with -Wlogical-op.
|
||||||
|
*
|
||||||
|
* To add an option that uses the same type as an existing option, you'll just
|
||||||
|
* need to extend the appropriate _curl_*_option macro
|
||||||
|
*/
|
||||||
|
#define curl_easy_setopt(handle, option, value) \
|
||||||
|
__extension__({ \
|
||||||
|
__typeof__(option) _curl_opt = option; \
|
||||||
|
if(__builtin_constant_p(_curl_opt)) { \
|
||||||
|
if(curlcheck_long_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_long(value)) \
|
||||||
|
_curl_easy_setopt_err_long(); \
|
||||||
|
if(curlcheck_off_t_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_off_t(value)) \
|
||||||
|
_curl_easy_setopt_err_curl_off_t(); \
|
||||||
|
if(curlcheck_string_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_string(value)) \
|
||||||
|
_curl_easy_setopt_err_string(); \
|
||||||
|
if(curlcheck_write_cb_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_write_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_write_callback(); \
|
||||||
|
if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \
|
||||||
|
if(!curlcheck_resolver_start_callback(value)) \
|
||||||
|
_curl_easy_setopt_err_resolver_start_callback(); \
|
||||||
|
if((_curl_opt) == CURLOPT_READFUNCTION) \
|
||||||
|
if(!curlcheck_read_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_read_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
|
||||||
|
if(!curlcheck_ioctl_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_ioctl_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
|
||||||
|
if(!curlcheck_sockopt_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_sockopt_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
|
||||||
|
if(!curlcheck_opensocket_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_opensocket_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
|
||||||
|
if(!curlcheck_progress_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_progress_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
|
||||||
|
if(!curlcheck_debug_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_debug_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
|
||||||
|
if(!curlcheck_ssl_ctx_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_ssl_ctx_cb(); \
|
||||||
|
if(curlcheck_conv_cb_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_conv_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_conv_cb(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SEEKFUNCTION) \
|
||||||
|
if(!curlcheck_seek_cb(value)) \
|
||||||
|
_curl_easy_setopt_err_seek_cb(); \
|
||||||
|
if(curlcheck_cb_data_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_cb_data(value)) \
|
||||||
|
_curl_easy_setopt_err_cb_data(); \
|
||||||
|
if((_curl_opt) == CURLOPT_ERRORBUFFER) \
|
||||||
|
if(!curlcheck_error_buffer(value)) \
|
||||||
|
_curl_easy_setopt_err_error_buffer(); \
|
||||||
|
if((_curl_opt) == CURLOPT_STDERR) \
|
||||||
|
if(!curlcheck_FILE(value)) \
|
||||||
|
_curl_easy_setopt_err_FILE(); \
|
||||||
|
if(curlcheck_postfields_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_postfields(value)) \
|
||||||
|
_curl_easy_setopt_err_postfields(); \
|
||||||
|
if((_curl_opt) == CURLOPT_HTTPPOST) \
|
||||||
|
if(!curlcheck_arr((value), struct curl_httppost)) \
|
||||||
|
_curl_easy_setopt_err_curl_httpost(); \
|
||||||
|
if((_curl_opt) == CURLOPT_MIMEPOST) \
|
||||||
|
if(!curlcheck_ptr((value), curl_mime)) \
|
||||||
|
_curl_easy_setopt_err_curl_mimepost(); \
|
||||||
|
if(curlcheck_slist_option(_curl_opt)) \
|
||||||
|
if(!curlcheck_arr((value), struct curl_slist)) \
|
||||||
|
_curl_easy_setopt_err_curl_slist(); \
|
||||||
|
if((_curl_opt) == CURLOPT_SHARE) \
|
||||||
|
if(!curlcheck_ptr((value), CURLSH)) \
|
||||||
|
_curl_easy_setopt_err_CURLSH(); \
|
||||||
|
} \
|
||||||
|
curl_easy_setopt(handle, _curl_opt, value); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/* wraps curl_easy_getinfo() with typechecking */
|
||||||
|
#define curl_easy_getinfo(handle, info, arg) \
|
||||||
|
__extension__({ \
|
||||||
|
__typeof__(info) _curl_info = info; \
|
||||||
|
if(__builtin_constant_p(_curl_info)) { \
|
||||||
|
if(curlcheck_string_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), char *)) \
|
||||||
|
_curl_easy_getinfo_err_string(); \
|
||||||
|
if(curlcheck_long_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), long)) \
|
||||||
|
_curl_easy_getinfo_err_long(); \
|
||||||
|
if(curlcheck_double_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), double)) \
|
||||||
|
_curl_easy_getinfo_err_double(); \
|
||||||
|
if(curlcheck_slist_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), struct curl_slist *)) \
|
||||||
|
_curl_easy_getinfo_err_curl_slist(); \
|
||||||
|
if(curlcheck_tlssessioninfo_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), struct curl_tlssessioninfo *)) \
|
||||||
|
_curl_easy_getinfo_err_curl_tlssesssioninfo(); \
|
||||||
|
if(curlcheck_certinfo_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), struct curl_certinfo *)) \
|
||||||
|
_curl_easy_getinfo_err_curl_certinfo(); \
|
||||||
|
if(curlcheck_socket_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), curl_socket_t)) \
|
||||||
|
_curl_easy_getinfo_err_curl_socket(); \
|
||||||
|
if(curlcheck_off_t_info(_curl_info)) \
|
||||||
|
if(!curlcheck_arr((arg), curl_off_t)) \
|
||||||
|
_curl_easy_getinfo_err_curl_off_t(); \
|
||||||
|
} \
|
||||||
|
curl_easy_getinfo(handle, _curl_info, arg); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For now, just make sure that the functions are called with three arguments
|
||||||
|
*/
|
||||||
|
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
|
||||||
|
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
|
||||||
|
|
||||||
|
|
||||||
|
/* the actual warnings, triggered by calling the _curl_easy_setopt_err*
|
||||||
|
* functions */
|
||||||
|
|
||||||
|
/* To define a new warning, use _CURL_WARNING(identifier, "message") */
|
||||||
|
#define CURLWARNING(id, message) \
|
||||||
|
static void __attribute__((__warning__(message))) \
|
||||||
|
__attribute__((__unused__)) __attribute__((__noinline__)) \
|
||||||
|
id(void) { __asm__(""); }
|
||||||
|
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_long,
|
||||||
|
"curl_easy_setopt expects a long argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_curl_off_t,
|
||||||
|
"curl_easy_setopt expects a curl_off_t argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_string,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"string ('char *' or char[]) argument for this option"
|
||||||
|
)
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_write_callback,
|
||||||
|
"curl_easy_setopt expects a curl_write_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_resolver_start_callback,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"curl_resolver_start_callback argument for this option"
|
||||||
|
)
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_read_cb,
|
||||||
|
"curl_easy_setopt expects a curl_read_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_ioctl_cb,
|
||||||
|
"curl_easy_setopt expects a curl_ioctl_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_sockopt_cb,
|
||||||
|
"curl_easy_setopt expects a curl_sockopt_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_opensocket_cb,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"curl_opensocket_callback argument for this option"
|
||||||
|
)
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_progress_cb,
|
||||||
|
"curl_easy_setopt expects a curl_progress_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_debug_cb,
|
||||||
|
"curl_easy_setopt expects a curl_debug_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb,
|
||||||
|
"curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_conv_cb,
|
||||||
|
"curl_easy_setopt expects a curl_conv_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_seek_cb,
|
||||||
|
"curl_easy_setopt expects a curl_seek_callback argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_cb_data,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"private data pointer as argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_error_buffer,
|
||||||
|
"curl_easy_setopt expects a "
|
||||||
|
"char buffer of CURL_ERROR_SIZE as argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_FILE,
|
||||||
|
"curl_easy_setopt expects a 'FILE *' argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_postfields,
|
||||||
|
"curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_curl_httpost,
|
||||||
|
"curl_easy_setopt expects a 'struct curl_httppost *' "
|
||||||
|
"argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_curl_mimepost,
|
||||||
|
"curl_easy_setopt expects a 'curl_mime *' "
|
||||||
|
"argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_curl_slist,
|
||||||
|
"curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
|
||||||
|
CURLWARNING(_curl_easy_setopt_err_CURLSH,
|
||||||
|
"curl_easy_setopt expects a CURLSH* argument for this option")
|
||||||
|
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_string,
|
||||||
|
"curl_easy_getinfo expects a pointer to 'char *' for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_long,
|
||||||
|
"curl_easy_getinfo expects a pointer to long for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_double,
|
||||||
|
"curl_easy_getinfo expects a pointer to double for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_curl_slist,
|
||||||
|
"curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
|
||||||
|
"curl_easy_getinfo expects a pointer to "
|
||||||
|
"'struct curl_tlssessioninfo *' for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_curl_certinfo,
|
||||||
|
"curl_easy_getinfo expects a pointer to "
|
||||||
|
"'struct curl_certinfo *' for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_curl_socket,
|
||||||
|
"curl_easy_getinfo expects a pointer to curl_socket_t for this info")
|
||||||
|
CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
|
||||||
|
"curl_easy_getinfo expects a pointer to curl_off_t for this info")
|
||||||
|
|
||||||
|
/* groups of curl_easy_setops options that take the same type of argument */
|
||||||
|
|
||||||
|
/* To add a new option to one of the groups, just add
|
||||||
|
* (option) == CURLOPT_SOMETHING
|
||||||
|
* to the or-expression. If the option takes a long or curl_off_t, you don't
|
||||||
|
* have to do anything
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a long argument */
|
||||||
|
#define curlcheck_long_option(option) \
|
||||||
|
(0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
|
||||||
|
|
||||||
|
#define curlcheck_off_t_option(option) \
|
||||||
|
((option) > CURLOPTTYPE_OFF_T)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a char* argument */
|
||||||
|
#define curlcheck_string_option(option) \
|
||||||
|
((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \
|
||||||
|
(option) == CURLOPT_ACCEPT_ENCODING || \
|
||||||
|
(option) == CURLOPT_ALTSVC || \
|
||||||
|
(option) == CURLOPT_CAINFO || \
|
||||||
|
(option) == CURLOPT_CAPATH || \
|
||||||
|
(option) == CURLOPT_COOKIE || \
|
||||||
|
(option) == CURLOPT_COOKIEFILE || \
|
||||||
|
(option) == CURLOPT_COOKIEJAR || \
|
||||||
|
(option) == CURLOPT_COOKIELIST || \
|
||||||
|
(option) == CURLOPT_CRLFILE || \
|
||||||
|
(option) == CURLOPT_CUSTOMREQUEST || \
|
||||||
|
(option) == CURLOPT_DEFAULT_PROTOCOL || \
|
||||||
|
(option) == CURLOPT_DNS_INTERFACE || \
|
||||||
|
(option) == CURLOPT_DNS_LOCAL_IP4 || \
|
||||||
|
(option) == CURLOPT_DNS_LOCAL_IP6 || \
|
||||||
|
(option) == CURLOPT_DNS_SERVERS || \
|
||||||
|
(option) == CURLOPT_DOH_URL || \
|
||||||
|
(option) == CURLOPT_EGDSOCKET || \
|
||||||
|
(option) == CURLOPT_FTPPORT || \
|
||||||
|
(option) == CURLOPT_FTP_ACCOUNT || \
|
||||||
|
(option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \
|
||||||
|
(option) == CURLOPT_INTERFACE || \
|
||||||
|
(option) == CURLOPT_ISSUERCERT || \
|
||||||
|
(option) == CURLOPT_KEYPASSWD || \
|
||||||
|
(option) == CURLOPT_KRBLEVEL || \
|
||||||
|
(option) == CURLOPT_LOGIN_OPTIONS || \
|
||||||
|
(option) == CURLOPT_MAIL_AUTH || \
|
||||||
|
(option) == CURLOPT_MAIL_FROM || \
|
||||||
|
(option) == CURLOPT_NETRC_FILE || \
|
||||||
|
(option) == CURLOPT_NOPROXY || \
|
||||||
|
(option) == CURLOPT_PASSWORD || \
|
||||||
|
(option) == CURLOPT_PINNEDPUBLICKEY || \
|
||||||
|
(option) == CURLOPT_PRE_PROXY || \
|
||||||
|
(option) == CURLOPT_PROXY || \
|
||||||
|
(option) == CURLOPT_PROXYPASSWORD || \
|
||||||
|
(option) == CURLOPT_PROXYUSERNAME || \
|
||||||
|
(option) == CURLOPT_PROXYUSERPWD || \
|
||||||
|
(option) == CURLOPT_PROXY_CAINFO || \
|
||||||
|
(option) == CURLOPT_PROXY_CAPATH || \
|
||||||
|
(option) == CURLOPT_PROXY_CRLFILE || \
|
||||||
|
(option) == CURLOPT_PROXY_KEYPASSWD || \
|
||||||
|
(option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \
|
||||||
|
(option) == CURLOPT_PROXY_SERVICE_NAME || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLCERT || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLCERTTYPE || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLKEY || \
|
||||||
|
(option) == CURLOPT_PROXY_SSLKEYTYPE || \
|
||||||
|
(option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \
|
||||||
|
(option) == CURLOPT_PROXY_TLS13_CIPHERS || \
|
||||||
|
(option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \
|
||||||
|
(option) == CURLOPT_PROXY_TLSAUTH_TYPE || \
|
||||||
|
(option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \
|
||||||
|
(option) == CURLOPT_RANDOM_FILE || \
|
||||||
|
(option) == CURLOPT_RANGE || \
|
||||||
|
(option) == CURLOPT_REFERER || \
|
||||||
|
(option) == CURLOPT_REQUEST_TARGET || \
|
||||||
|
(option) == CURLOPT_RTSP_SESSION_ID || \
|
||||||
|
(option) == CURLOPT_RTSP_STREAM_URI || \
|
||||||
|
(option) == CURLOPT_RTSP_TRANSPORT || \
|
||||||
|
(option) == CURLOPT_SASL_AUTHZID || \
|
||||||
|
(option) == CURLOPT_SERVICE_NAME || \
|
||||||
|
(option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \
|
||||||
|
(option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \
|
||||||
|
(option) == CURLOPT_SSH_KNOWNHOSTS || \
|
||||||
|
(option) == CURLOPT_SSH_PRIVATE_KEYFILE || \
|
||||||
|
(option) == CURLOPT_SSH_PUBLIC_KEYFILE || \
|
||||||
|
(option) == CURLOPT_SSLCERT || \
|
||||||
|
(option) == CURLOPT_SSLCERTTYPE || \
|
||||||
|
(option) == CURLOPT_SSLENGINE || \
|
||||||
|
(option) == CURLOPT_SSLKEY || \
|
||||||
|
(option) == CURLOPT_SSLKEYTYPE || \
|
||||||
|
(option) == CURLOPT_SSL_CIPHER_LIST || \
|
||||||
|
(option) == CURLOPT_TLS13_CIPHERS || \
|
||||||
|
(option) == CURLOPT_TLSAUTH_PASSWORD || \
|
||||||
|
(option) == CURLOPT_TLSAUTH_TYPE || \
|
||||||
|
(option) == CURLOPT_TLSAUTH_USERNAME || \
|
||||||
|
(option) == CURLOPT_UNIX_SOCKET_PATH || \
|
||||||
|
(option) == CURLOPT_URL || \
|
||||||
|
(option) == CURLOPT_USERAGENT || \
|
||||||
|
(option) == CURLOPT_USERNAME || \
|
||||||
|
(option) == CURLOPT_USERPWD || \
|
||||||
|
(option) == CURLOPT_XOAUTH2_BEARER || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a curl_write_callback argument */
|
||||||
|
#define curlcheck_write_cb_option(option) \
|
||||||
|
((option) == CURLOPT_HEADERFUNCTION || \
|
||||||
|
(option) == CURLOPT_WRITEFUNCTION)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a curl_conv_callback argument */
|
||||||
|
#define curlcheck_conv_cb_option(option) \
|
||||||
|
((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \
|
||||||
|
(option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \
|
||||||
|
(option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a data argument to pass to a callback */
|
||||||
|
#define curlcheck_cb_data_option(option) \
|
||||||
|
((option) == CURLOPT_CHUNK_DATA || \
|
||||||
|
(option) == CURLOPT_CLOSESOCKETDATA || \
|
||||||
|
(option) == CURLOPT_DEBUGDATA || \
|
||||||
|
(option) == CURLOPT_FNMATCH_DATA || \
|
||||||
|
(option) == CURLOPT_HEADERDATA || \
|
||||||
|
(option) == CURLOPT_INTERLEAVEDATA || \
|
||||||
|
(option) == CURLOPT_IOCTLDATA || \
|
||||||
|
(option) == CURLOPT_OPENSOCKETDATA || \
|
||||||
|
(option) == CURLOPT_PRIVATE || \
|
||||||
|
(option) == CURLOPT_PROGRESSDATA || \
|
||||||
|
(option) == CURLOPT_READDATA || \
|
||||||
|
(option) == CURLOPT_SEEKDATA || \
|
||||||
|
(option) == CURLOPT_SOCKOPTDATA || \
|
||||||
|
(option) == CURLOPT_SSH_KEYDATA || \
|
||||||
|
(option) == CURLOPT_SSL_CTX_DATA || \
|
||||||
|
(option) == CURLOPT_WRITEDATA || \
|
||||||
|
(option) == CURLOPT_RESOLVER_START_DATA || \
|
||||||
|
(option) == CURLOPT_TRAILERDATA || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a POST data argument (void* or char*) */
|
||||||
|
#define curlcheck_postfields_option(option) \
|
||||||
|
((option) == CURLOPT_POSTFIELDS || \
|
||||||
|
(option) == CURLOPT_COPYPOSTFIELDS || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* evaluates to true if option takes a struct curl_slist * argument */
|
||||||
|
#define curlcheck_slist_option(option) \
|
||||||
|
((option) == CURLOPT_HTTP200ALIASES || \
|
||||||
|
(option) == CURLOPT_HTTPHEADER || \
|
||||||
|
(option) == CURLOPT_MAIL_RCPT || \
|
||||||
|
(option) == CURLOPT_POSTQUOTE || \
|
||||||
|
(option) == CURLOPT_PREQUOTE || \
|
||||||
|
(option) == CURLOPT_PROXYHEADER || \
|
||||||
|
(option) == CURLOPT_QUOTE || \
|
||||||
|
(option) == CURLOPT_RESOLVE || \
|
||||||
|
(option) == CURLOPT_TELNETOPTIONS || \
|
||||||
|
(option) == CURLOPT_CONNECT_TO || \
|
||||||
|
0)
|
||||||
|
|
||||||
|
/* groups of curl_easy_getinfo infos that take the same type of argument */
|
||||||
|
|
||||||
|
/* evaluates to true if info expects a pointer to char * argument */
|
||||||
|
#define curlcheck_string_info(info) \
|
||||||
|
(CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
|
||||||
|
|
||||||
|
/* evaluates to true if info expects a pointer to long argument */
|
||||||
|
#define curlcheck_long_info(info) \
|
||||||
|
(CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)
|
||||||
|
|
||||||
|
/* evaluates to true if info expects a pointer to double argument */
|
||||||
|
#define curlcheck_double_info(info) \
|
||||||
|
(CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_slist * argument */
|
||||||
|
#define curlcheck_slist_info(info) \
|
||||||
|
(((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
|
||||||
|
#define curlcheck_tlssessioninfo_info(info) \
|
||||||
|
(((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_certinfo * argument */
|
||||||
|
#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
|
||||||
|
|
||||||
|
/* true if info expects a pointer to struct curl_socket_t argument */
|
||||||
|
#define curlcheck_socket_info(info) \
|
||||||
|
(CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)
|
||||||
|
|
||||||
|
/* true if info expects a pointer to curl_off_t argument */
|
||||||
|
#define curlcheck_off_t_info(info) \
|
||||||
|
(CURLINFO_OFF_T < (info))
|
||||||
|
|
||||||
|
|
||||||
|
/* typecheck helpers -- check whether given expression has requested type*/
|
||||||
|
|
||||||
|
/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros,
|
||||||
|
* otherwise define a new macro. Search for __builtin_types_compatible_p
|
||||||
|
* in the GCC manual.
|
||||||
|
* NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
|
||||||
|
* the actual expression passed to the curl_easy_setopt macro. This
|
||||||
|
* means that you can only apply the sizeof and __typeof__ operators, no
|
||||||
|
* == or whatsoever.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* XXX: should evaluate to true if expr is a pointer */
|
||||||
|
#define curlcheck_any_ptr(expr) \
|
||||||
|
(sizeof(expr) == sizeof(void *))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is NULL */
|
||||||
|
/* XXX: must not evaluate expr, so this check is not accurate */
|
||||||
|
#define curlcheck_NULL(expr) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is type*, const type* or NULL */
|
||||||
|
#define curlcheck_ptr(expr, type) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), type *) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), const type *))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is one of type[], type*, NULL or const type* */
|
||||||
|
#define curlcheck_arr(expr, type) \
|
||||||
|
(curlcheck_ptr((expr), type) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), type []))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is a string */
|
||||||
|
#define curlcheck_string(expr) \
|
||||||
|
(curlcheck_arr((expr), char) || \
|
||||||
|
curlcheck_arr((expr), signed char) || \
|
||||||
|
curlcheck_arr((expr), unsigned char))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is a long (no matter the signedness)
|
||||||
|
* XXX: for now, int is also accepted (and therefore short and char, which
|
||||||
|
* are promoted to int when passed to a variadic function) */
|
||||||
|
#define curlcheck_long(expr) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), long) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed long) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned long) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), int) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed int) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned int) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), short) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed short) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned short) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), char) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), signed char) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), unsigned char))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_off_t */
|
||||||
|
#define curlcheck_off_t(expr) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), curl_off_t))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
|
||||||
|
/* XXX: also check size of an char[] array? */
|
||||||
|
#define curlcheck_error_buffer(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), char *) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(expr), char[]))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type (const) void* or (const) FILE* */
|
||||||
|
#if 0
|
||||||
|
#define curlcheck_cb_data(expr) \
|
||||||
|
(curlcheck_ptr((expr), void) || \
|
||||||
|
curlcheck_ptr((expr), FILE))
|
||||||
|
#else /* be less strict */
|
||||||
|
#define curlcheck_cb_data(expr) \
|
||||||
|
curlcheck_any_ptr(expr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type FILE* */
|
||||||
|
#define curlcheck_FILE(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(expr), FILE *)))
|
||||||
|
|
||||||
|
/* evaluates to true if expr can be passed as POST data (void* or char*) */
|
||||||
|
#define curlcheck_postfields(expr) \
|
||||||
|
(curlcheck_ptr((expr), void) || \
|
||||||
|
curlcheck_arr((expr), char) || \
|
||||||
|
curlcheck_arr((expr), unsigned char))
|
||||||
|
|
||||||
|
/* helper: __builtin_types_compatible_p distinguishes between functions and
|
||||||
|
* function pointers, hide it */
|
||||||
|
#define curlcheck_cb_compatible(func, type) \
|
||||||
|
(__builtin_types_compatible_p(__typeof__(func), type) || \
|
||||||
|
__builtin_types_compatible_p(__typeof__(func) *, type))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_resolver_start_callback */
|
||||||
|
#define curlcheck_resolver_start_callback(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_resolver_start_callback))
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_read_callback or "similar" */
|
||||||
|
#define curlcheck_read_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), __typeof__(fread) *) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_read_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_read_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_read_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_read_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_read_callback4) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_read_callback5) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_read_callback6))
|
||||||
|
typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
|
||||||
|
typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
|
||||||
|
typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
|
||||||
|
typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_write_callback or "similar" */
|
||||||
|
#define curlcheck_write_cb(expr) \
|
||||||
|
(curlcheck_read_cb(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), __typeof__(fwrite) *) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_write_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_write_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_write_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_write_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_write_callback4) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_write_callback5) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_write_callback6))
|
||||||
|
typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
|
||||||
|
const void *);
|
||||||
|
typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *);
|
||||||
|
typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *);
|
||||||
|
typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
|
||||||
|
const void *);
|
||||||
|
typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
|
||||||
|
#define curlcheck_ioctl_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_ioctl_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ioctl_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ioctl_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ioctl_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ioctl_callback4))
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
|
||||||
|
typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
|
||||||
|
#define curlcheck_sockopt_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_sockopt_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_sockopt_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_sockopt_callback2))
|
||||||
|
typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
|
||||||
|
typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
|
||||||
|
curlsocktype);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_opensocket_callback or
|
||||||
|
"similar" */
|
||||||
|
#define curlcheck_opensocket_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_opensocket_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_opensocket_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_opensocket_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_opensocket_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_opensocket_callback4))
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback1)
|
||||||
|
(void *, curlsocktype, struct curl_sockaddr *);
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback2)
|
||||||
|
(void *, curlsocktype, const struct curl_sockaddr *);
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback3)
|
||||||
|
(const void *, curlsocktype, struct curl_sockaddr *);
|
||||||
|
typedef curl_socket_t (*_curl_opensocket_callback4)
|
||||||
|
(const void *, curlsocktype, const struct curl_sockaddr *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_progress_callback or "similar" */
|
||||||
|
#define curlcheck_progress_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_progress_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_progress_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_progress_callback2))
|
||||||
|
typedef int (*_curl_progress_callback1)(void *,
|
||||||
|
double, double, double, double);
|
||||||
|
typedef int (*_curl_progress_callback2)(const void *,
|
||||||
|
double, double, double, double);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_debug_callback or "similar" */
|
||||||
|
#define curlcheck_debug_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_debug_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback4) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback5) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback6) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback7) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_debug_callback8))
|
||||||
|
typedef int (*_curl_debug_callback1) (CURL *,
|
||||||
|
curl_infotype, char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback2) (CURL *,
|
||||||
|
curl_infotype, char *, size_t, const void *);
|
||||||
|
typedef int (*_curl_debug_callback3) (CURL *,
|
||||||
|
curl_infotype, const char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback4) (CURL *,
|
||||||
|
curl_infotype, const char *, size_t, const void *);
|
||||||
|
typedef int (*_curl_debug_callback5) (CURL *,
|
||||||
|
curl_infotype, unsigned char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback6) (CURL *,
|
||||||
|
curl_infotype, unsigned char *, size_t, const void *);
|
||||||
|
typedef int (*_curl_debug_callback7) (CURL *,
|
||||||
|
curl_infotype, const unsigned char *, size_t, void *);
|
||||||
|
typedef int (*_curl_debug_callback8) (CURL *,
|
||||||
|
curl_infotype, const unsigned char *, size_t, const void *);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
|
||||||
|
/* this is getting even messier... */
|
||||||
|
#define curlcheck_ssl_ctx_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8))
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *,
|
||||||
|
const void *);
|
||||||
|
#ifdef HEADER_SSL_H
|
||||||
|
/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX
|
||||||
|
* this will of course break if we're included before OpenSSL headers...
|
||||||
|
*/
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *);
|
||||||
|
typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX,
|
||||||
|
const void *);
|
||||||
|
#else
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6;
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7;
|
||||||
|
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_conv_callback or "similar" */
|
||||||
|
#define curlcheck_conv_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_conv_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_conv_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_conv_callback2) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_conv_callback3) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_conv_callback4))
|
||||||
|
typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
|
||||||
|
typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
|
||||||
|
typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
|
||||||
|
typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);
|
||||||
|
|
||||||
|
/* evaluates to true if expr is of type curl_seek_callback or "similar" */
|
||||||
|
#define curlcheck_seek_cb(expr) \
|
||||||
|
(curlcheck_NULL(expr) || \
|
||||||
|
curlcheck_cb_compatible((expr), curl_seek_callback) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_seek_callback1) || \
|
||||||
|
curlcheck_cb_compatible((expr), _curl_seek_callback2))
|
||||||
|
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
|
||||||
|
typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CURLINC_TYPECHECK_GCC_H */
|
125
chargingstation-aiter/include/curl/urlapi.h
Normal file
125
chargingstation-aiter/include/curl/urlapi.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#ifndef CURLINC_URLAPI_H
|
||||||
|
#define CURLINC_URLAPI_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "curl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* the error codes for the URL API */
|
||||||
|
typedef enum {
|
||||||
|
CURLUE_OK,
|
||||||
|
CURLUE_BAD_HANDLE, /* 1 */
|
||||||
|
CURLUE_BAD_PARTPOINTER, /* 2 */
|
||||||
|
CURLUE_MALFORMED_INPUT, /* 3 */
|
||||||
|
CURLUE_BAD_PORT_NUMBER, /* 4 */
|
||||||
|
CURLUE_UNSUPPORTED_SCHEME, /* 5 */
|
||||||
|
CURLUE_URLDECODE, /* 6 */
|
||||||
|
CURLUE_OUT_OF_MEMORY, /* 7 */
|
||||||
|
CURLUE_USER_NOT_ALLOWED, /* 8 */
|
||||||
|
CURLUE_UNKNOWN_PART, /* 9 */
|
||||||
|
CURLUE_NO_SCHEME, /* 10 */
|
||||||
|
CURLUE_NO_USER, /* 11 */
|
||||||
|
CURLUE_NO_PASSWORD, /* 12 */
|
||||||
|
CURLUE_NO_OPTIONS, /* 13 */
|
||||||
|
CURLUE_NO_HOST, /* 14 */
|
||||||
|
CURLUE_NO_PORT, /* 15 */
|
||||||
|
CURLUE_NO_QUERY, /* 16 */
|
||||||
|
CURLUE_NO_FRAGMENT /* 17 */
|
||||||
|
} CURLUcode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLUPART_URL,
|
||||||
|
CURLUPART_SCHEME,
|
||||||
|
CURLUPART_USER,
|
||||||
|
CURLUPART_PASSWORD,
|
||||||
|
CURLUPART_OPTIONS,
|
||||||
|
CURLUPART_HOST,
|
||||||
|
CURLUPART_PORT,
|
||||||
|
CURLUPART_PATH,
|
||||||
|
CURLUPART_QUERY,
|
||||||
|
CURLUPART_FRAGMENT,
|
||||||
|
CURLUPART_ZONEID /* added in 7.65.0 */
|
||||||
|
} CURLUPart;
|
||||||
|
|
||||||
|
#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */
|
||||||
|
#define CURLU_NO_DEFAULT_PORT (1<<1) /* act as if no port number was set,
|
||||||
|
if the port number matches the
|
||||||
|
default for the scheme */
|
||||||
|
#define CURLU_DEFAULT_SCHEME (1<<2) /* return default scheme if
|
||||||
|
missing */
|
||||||
|
#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */
|
||||||
|
#define CURLU_PATH_AS_IS (1<<4) /* leave dot sequences */
|
||||||
|
#define CURLU_DISALLOW_USER (1<<5) /* no user+password allowed */
|
||||||
|
#define CURLU_URLDECODE (1<<6) /* URL decode on get */
|
||||||
|
#define CURLU_URLENCODE (1<<7) /* URL encode on set */
|
||||||
|
#define CURLU_APPENDQUERY (1<<8) /* append a form style part */
|
||||||
|
#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */
|
||||||
|
#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the
|
||||||
|
scheme is unknown. */
|
||||||
|
|
||||||
|
typedef struct Curl_URL CURLU;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url() creates a new CURLU handle and returns a pointer to it.
|
||||||
|
* Must be freed with curl_url_cleanup().
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLU *curl_url(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_cleanup() frees the CURLU handle and related resources used for
|
||||||
|
* the URL parsing. It will not free strings previously returned with the URL
|
||||||
|
* API.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN void curl_url_cleanup(CURLU *handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_dup() duplicates a CURLU handle and returns a new copy. The new
|
||||||
|
* handle must also be freed with curl_url_cleanup().
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLU *curl_url_dup(CURLU *in);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_get() extracts a specific part of the URL from a CURLU
|
||||||
|
* handle. Returns error code. The returned pointer MUST be freed with
|
||||||
|
* curl_free() afterwards.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLUcode curl_url_get(CURLU *handle, CURLUPart what,
|
||||||
|
char **part, unsigned int flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* curl_url_set() sets a specific part of the URL in a CURLU handle. Returns
|
||||||
|
* error code. The passed in string will be copied. Passing a NULL instead of
|
||||||
|
* a part string, clears that part.
|
||||||
|
*/
|
||||||
|
CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what,
|
||||||
|
const char *part, unsigned int flags);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end of extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CURLINC_URLAPI_H */
|
39
chargingstation-aiter/include/drm_func.h
Normal file
39
chargingstation-aiter/include/drm_func.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef __DRM_FUNC_H__
|
||||||
|
#define __DRM_FUNC_H__
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/fcntl.h>// open function
|
||||||
|
#include <unistd.h> // close function
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include "libdrm/drm_fourcc.h"
|
||||||
|
#include "xf86drm.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef int (* FUNC_DRM_IOCTL)(int fd, unsigned long request, void *arg);
|
||||||
|
|
||||||
|
typedef struct _drm_context{
|
||||||
|
void *drm_handle;
|
||||||
|
FUNC_DRM_IOCTL io_func;
|
||||||
|
} drm_context;
|
||||||
|
|
||||||
|
int drm_init(drm_context *drm_ctx);
|
||||||
|
|
||||||
|
void* drm_buf_alloc(drm_context *drm_ctx,int drm_fd, int TexWidth, int TexHeight,int bpp,int *fd,unsigned int *handle,size_t *actual_size);
|
||||||
|
|
||||||
|
int drm_buf_destroy(drm_context *drm_ctx,int drm_fd,int buf_fd, int handle,void *drm_buf,size_t size);
|
||||||
|
|
||||||
|
void drm_deinit(drm_context *drm_ctx, int drm_fd);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /*__DRM_FUNC_H__*/
|
5258
chargingstation-aiter/include/json.hpp
Normal file
5258
chargingstation-aiter/include/json.hpp
Normal file
File diff suppressed because it is too large
Load Diff
BIN
chargingstation-aiter/include/librtsp/._librtsp.a
Normal file
BIN
chargingstation-aiter/include/librtsp/._librtsp.a
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/librtsp/._rtsp_demo.h
Normal file
BIN
chargingstation-aiter/include/librtsp/._rtsp_demo.h
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/librtsp/librtsp.a
Normal file
BIN
chargingstation-aiter/include/librtsp/librtsp.a
Normal file
Binary file not shown.
64
chargingstation-aiter/include/librtsp/rtsp_demo.h
Normal file
64
chargingstation-aiter/include/librtsp/rtsp_demo.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// Copyright 2020 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef __RTSP_DEMO_H__
|
||||||
|
#define __RTSP_DEMO_H__
|
||||||
|
/*
|
||||||
|
* a simple RTSP server demo
|
||||||
|
* RTP over UDP/TCP H264/G711a
|
||||||
|
* */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum rtsp_codec_id {
|
||||||
|
RTSP_CODEC_ID_NONE = 0,
|
||||||
|
RTSP_CODEC_ID_VIDEO_H264 = 0x0001, /*codec_data is SPS + PPS frames*/
|
||||||
|
RTSP_CODEC_ID_VIDEO_H265, /*codec_data is VPS + SPS + PPS frames*/
|
||||||
|
RTSP_CODEC_ID_VIDEO_MPEG4, /*now not support*/
|
||||||
|
RTSP_CODEC_ID_AUDIO_G711A = 0x4001, /*codec_data is NULL*/
|
||||||
|
RTSP_CODEC_ID_AUDIO_G711U, /*codec_data is NULL*/
|
||||||
|
RTSP_CODEC_ID_AUDIO_G726, /*codec_data is bitrate (int)*/
|
||||||
|
RTSP_CODEC_ID_AUDIO_MP3, /*codec_data is audio specific config (2bytes). frame
|
||||||
|
type is MP3*/
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void *rtsp_demo_handle;
|
||||||
|
typedef void *rtsp_session_handle;
|
||||||
|
|
||||||
|
rtsp_demo_handle rtsp_new_demo(int port);
|
||||||
|
rtsp_demo_handle create_rtsp_demo(int port);
|
||||||
|
int rtsp_do_event(rtsp_demo_handle demo);
|
||||||
|
rtsp_session_handle rtsp_new_session(rtsp_demo_handle demo, const char *path);
|
||||||
|
rtsp_session_handle create_rtsp_session(rtsp_demo_handle demo,
|
||||||
|
const char *path);
|
||||||
|
int rtsp_set_video(rtsp_session_handle session, int codec_id,
|
||||||
|
const uint8_t *codec_data, int data_len);
|
||||||
|
|
||||||
|
int rtsp_set_audio(rtsp_session_handle session, int codec_id,
|
||||||
|
const uint8_t *codec_data, int data_len);
|
||||||
|
|
||||||
|
int rtsp_sever_tx_video(rtsp_demo_handle demo, rtsp_session_handle session,
|
||||||
|
const uint8_t *frame, int len, uint64_t ts);
|
||||||
|
int rtsp_tx_video(rtsp_session_handle session, const uint8_t *frame, int len,
|
||||||
|
uint64_t ts);
|
||||||
|
int rtsp_tx_audio(rtsp_session_handle session, const uint8_t *frame, int len,
|
||||||
|
uint64_t ts);
|
||||||
|
void rtsp_del_session(rtsp_session_handle session);
|
||||||
|
void rtsp_del_demo(rtsp_demo_handle demo);
|
||||||
|
|
||||||
|
uint64_t rtsp_get_reltime(void);
|
||||||
|
uint64_t rtsp_get_ntptime(void);
|
||||||
|
int rtsp_sync_video_ts(rtsp_session_handle session, uint64_t ts,
|
||||||
|
uint64_t ntptime);
|
||||||
|
int rtsp_sync_audio_ts(rtsp_session_handle session, uint64_t ts,
|
||||||
|
uint64_t ntptime);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
BIN
chargingstation-aiter/include/nlohmann/._adl_serializer.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/._adl_serializer.hpp
Normal file
Binary file not shown.
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/._detail
Normal file
BIN
chargingstation-aiter/include/nlohmann/._detail
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/._json.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/._json.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/._json_fwd.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/._json_fwd.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/._ordered_map.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/._ordered_map.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/._thirdparty
Normal file
BIN
chargingstation-aiter/include/nlohmann/._thirdparty
Normal file
Binary file not shown.
55
chargingstation-aiter/include/nlohmann/adl_serializer.hpp
Normal file
55
chargingstation-aiter/include/nlohmann/adl_serializer.hpp
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
#include <nlohmann/detail/conversions/from_json.hpp>
|
||||||
|
#include <nlohmann/detail/conversions/to_json.hpp>
|
||||||
|
#include <nlohmann/detail/meta/identity_tag.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
/// @sa https://json.nlohmann.me/api/adl_serializer/
|
||||||
|
template<typename ValueType, typename>
|
||||||
|
struct adl_serializer
|
||||||
|
{
|
||||||
|
/// @brief convert a JSON value to any value type
|
||||||
|
/// @sa https://json.nlohmann.me/api/adl_serializer/from_json/
|
||||||
|
template<typename BasicJsonType, typename TargetType = ValueType>
|
||||||
|
static auto from_json(BasicJsonType && j, TargetType& val) noexcept(
|
||||||
|
noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))
|
||||||
|
-> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void())
|
||||||
|
{
|
||||||
|
::nlohmann::from_json(std::forward<BasicJsonType>(j), val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief convert a JSON value to any value type
|
||||||
|
/// @sa https://json.nlohmann.me/api/adl_serializer/from_json/
|
||||||
|
template<typename BasicJsonType, typename TargetType = ValueType>
|
||||||
|
static auto from_json(BasicJsonType && j) noexcept(
|
||||||
|
noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {})))
|
||||||
|
-> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {}))
|
||||||
|
{
|
||||||
|
return ::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief convert any value type to a JSON value
|
||||||
|
/// @sa https://json.nlohmann.me/api/adl_serializer/to_json/
|
||||||
|
template<typename BasicJsonType, typename TargetType = ValueType>
|
||||||
|
static auto to_json(BasicJsonType& j, TargetType && val) noexcept(
|
||||||
|
noexcept(::nlohmann::to_json(j, std::forward<TargetType>(val))))
|
||||||
|
-> decltype(::nlohmann::to_json(j, std::forward<TargetType>(val)), void())
|
||||||
|
{
|
||||||
|
::nlohmann::to_json(j, std::forward<TargetType>(val));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,103 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint> // uint8_t, uint64_t
|
||||||
|
#include <tuple> // tie
|
||||||
|
#include <utility> // move
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
/// @brief an internal type for a backed binary type
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/
|
||||||
|
template<typename BinaryType>
|
||||||
|
class byte_container_with_subtype : public BinaryType
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using container_type = BinaryType;
|
||||||
|
using subtype_type = std::uint64_t;
|
||||||
|
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/
|
||||||
|
byte_container_with_subtype() noexcept(noexcept(container_type()))
|
||||||
|
: container_type()
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/
|
||||||
|
byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))
|
||||||
|
: container_type(b)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/
|
||||||
|
byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))
|
||||||
|
: container_type(std::move(b))
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/
|
||||||
|
byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b)))
|
||||||
|
: container_type(b)
|
||||||
|
, m_subtype(subtype_)
|
||||||
|
, m_has_subtype(true)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/
|
||||||
|
byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))
|
||||||
|
: container_type(std::move(b))
|
||||||
|
, m_subtype(subtype_)
|
||||||
|
, m_has_subtype(true)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool operator==(const byte_container_with_subtype& rhs) const
|
||||||
|
{
|
||||||
|
return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==
|
||||||
|
std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const byte_container_with_subtype& rhs) const
|
||||||
|
{
|
||||||
|
return !(rhs == *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief sets the binary subtype
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/
|
||||||
|
void set_subtype(subtype_type subtype_) noexcept
|
||||||
|
{
|
||||||
|
m_subtype = subtype_;
|
||||||
|
m_has_subtype = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief return the binary subtype
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/
|
||||||
|
constexpr subtype_type subtype() const noexcept
|
||||||
|
{
|
||||||
|
return m_has_subtype ? m_subtype : static_cast<subtype_type>(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief return whether the value has a subtype
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/
|
||||||
|
constexpr bool has_subtype() const noexcept
|
||||||
|
{
|
||||||
|
return m_has_subtype;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief clears the binary subtype
|
||||||
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/
|
||||||
|
void clear_subtype() noexcept
|
||||||
|
{
|
||||||
|
m_subtype = 0;
|
||||||
|
m_has_subtype = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
subtype_type m_subtype = 0;
|
||||||
|
bool m_has_subtype = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
BIN
chargingstation-aiter/include/nlohmann/detail/._abi_macros.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._abi_macros.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._conversions
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._conversions
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._exceptions.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._exceptions.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._hash.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._hash.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._input
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._input
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._iterators
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._iterators
Normal file
Binary file not shown.
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._json_pointer.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._json_pointer.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._json_ref.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._json_ref.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._macro_scope.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._macro_scope.hpp
Normal file
Binary file not shown.
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._meta
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._meta
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._output
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._output
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/._value_t.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/._value_t.hpp
Normal file
Binary file not shown.
100
chargingstation-aiter/include/nlohmann/detail/abi_macros.hpp
Normal file
100
chargingstation-aiter/include/nlohmann/detail/abi_macros.hpp
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// This file contains all macro definitions affecting or depending on the ABI
|
||||||
|
|
||||||
|
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
|
||||||
|
#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
|
||||||
|
#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3
|
||||||
|
#warning "Already included a different version of the library!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
|
||||||
|
#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum)
|
||||||
|
#define NLOHMANN_JSON_VERSION_PATCH 3 // NOLINT(modernize-macro-to-enum)
|
||||||
|
|
||||||
|
#ifndef JSON_DIAGNOSTICS
|
||||||
|
#define JSON_DIAGNOSTICS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if JSON_DIAGNOSTICS
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag
|
||||||
|
#else
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
|
||||||
|
#else
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Construct the namespace ABI tags component
|
||||||
|
#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b
|
||||||
|
#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \
|
||||||
|
NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b)
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_ABI_TAGS \
|
||||||
|
NLOHMANN_JSON_ABI_TAGS_CONCAT( \
|
||||||
|
NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
|
||||||
|
NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON)
|
||||||
|
|
||||||
|
// Construct the namespace version component
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \
|
||||||
|
_v ## major ## _ ## minor ## _ ## patch
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \
|
||||||
|
NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch)
|
||||||
|
|
||||||
|
#if NLOHMANN_JSON_NAMESPACE_NO_VERSION
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_VERSION
|
||||||
|
#else
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_VERSION \
|
||||||
|
NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \
|
||||||
|
NLOHMANN_JSON_VERSION_MINOR, \
|
||||||
|
NLOHMANN_JSON_VERSION_PATCH)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Combine namespace components
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \
|
||||||
|
NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b)
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE \
|
||||||
|
nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \
|
||||||
|
NLOHMANN_JSON_ABI_TAGS, \
|
||||||
|
NLOHMANN_JSON_NAMESPACE_VERSION)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_BEGIN \
|
||||||
|
namespace nlohmann \
|
||||||
|
{ \
|
||||||
|
inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \
|
||||||
|
NLOHMANN_JSON_ABI_TAGS, \
|
||||||
|
NLOHMANN_JSON_NAMESPACE_VERSION) \
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_END \
|
||||||
|
} /* namespace (inline namespace) NOLINT(readability/namespace) */ \
|
||||||
|
} // namespace nlohmann
|
||||||
|
#endif
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,497 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm> // transform
|
||||||
|
#include <array> // array
|
||||||
|
#include <forward_list> // forward_list
|
||||||
|
#include <iterator> // inserter, front_inserter, end
|
||||||
|
#include <map> // map
|
||||||
|
#include <string> // string
|
||||||
|
#include <tuple> // tuple, make_tuple
|
||||||
|
#include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible
|
||||||
|
#include <unordered_map> // unordered_map
|
||||||
|
#include <utility> // pair, declval
|
||||||
|
#include <valarray> // valarray
|
||||||
|
|
||||||
|
#include <nlohmann/detail/exceptions.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
#include <nlohmann/detail/meta/identity_tag.hpp>
|
||||||
|
#include <nlohmann/detail/meta/std_fs.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_null()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be null, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
n = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// overloads for basic_json template parameters
|
||||||
|
template < typename BasicJsonType, typename ArithmeticType,
|
||||||
|
enable_if_t < std::is_arithmetic<ArithmeticType>::value&&
|
||||||
|
!std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
|
||||||
|
int > = 0 >
|
||||||
|
void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
|
||||||
|
{
|
||||||
|
switch (static_cast<value_t>(j))
|
||||||
|
{
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case value_t::number_integer:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case value_t::number_float:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::object:
|
||||||
|
case value_t::array:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_boolean()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be boolean, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_string()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <
|
||||||
|
typename BasicJsonType, typename StringType,
|
||||||
|
enable_if_t <
|
||||||
|
std::is_assignable<StringType&, const typename BasicJsonType::string_t>::value
|
||||||
|
&& is_detected_exact<typename BasicJsonType::string_t::value_type, value_type_t, StringType>::value
|
||||||
|
&& !std::is_same<typename BasicJsonType::string_t, StringType>::value
|
||||||
|
&& !is_json_ref<StringType>::value, int > = 0 >
|
||||||
|
inline void from_json(const BasicJsonType& j, StringType& s)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_string()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
|
||||||
|
s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val)
|
||||||
|
{
|
||||||
|
get_arithmetic_value(j, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val)
|
||||||
|
{
|
||||||
|
get_arithmetic_value(j, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val)
|
||||||
|
{
|
||||||
|
get_arithmetic_value(j, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
|
template<typename BasicJsonType, typename EnumType,
|
||||||
|
enable_if_t<std::is_enum<EnumType>::value, int> = 0>
|
||||||
|
inline void from_json(const BasicJsonType& j, EnumType& e)
|
||||||
|
{
|
||||||
|
typename std::underlying_type<EnumType>::type val;
|
||||||
|
get_arithmetic_value(j, val);
|
||||||
|
e = static_cast<EnumType>(val);
|
||||||
|
}
|
||||||
|
#endif // JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
|
|
||||||
|
// forward_list doesn't have an insert method
|
||||||
|
template<typename BasicJsonType, typename T, typename Allocator,
|
||||||
|
enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>
|
||||||
|
inline void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
l.clear();
|
||||||
|
std::transform(j.rbegin(), j.rend(),
|
||||||
|
std::front_inserter(l), [](const BasicJsonType & i)
|
||||||
|
{
|
||||||
|
return i.template get<T>();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// valarray doesn't have an insert method
|
||||||
|
template<typename BasicJsonType, typename T,
|
||||||
|
enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>
|
||||||
|
inline void from_json(const BasicJsonType& j, std::valarray<T>& l)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
l.resize(j.size());
|
||||||
|
std::transform(j.begin(), j.end(), std::begin(l),
|
||||||
|
[](const BasicJsonType & elem)
|
||||||
|
{
|
||||||
|
return elem.template get<T>();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N>
|
||||||
|
auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
arr[i] = j.at(i).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)
|
||||||
|
{
|
||||||
|
arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, std::size_t N>
|
||||||
|
auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr,
|
||||||
|
priority_tag<2> /*unused*/)
|
||||||
|
-> decltype(j.template get<T>(), void())
|
||||||
|
{
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
arr[i] = j.at(i).template get<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename ConstructibleArrayType,
|
||||||
|
enable_if_t<
|
||||||
|
std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,
|
||||||
|
int> = 0>
|
||||||
|
auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/)
|
||||||
|
-> decltype(
|
||||||
|
arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),
|
||||||
|
j.template get<typename ConstructibleArrayType::value_type>(),
|
||||||
|
void())
|
||||||
|
{
|
||||||
|
using std::end;
|
||||||
|
|
||||||
|
ConstructibleArrayType ret;
|
||||||
|
ret.reserve(j.size());
|
||||||
|
std::transform(j.begin(), j.end(),
|
||||||
|
std::inserter(ret, end(ret)), [](const BasicJsonType & i)
|
||||||
|
{
|
||||||
|
// get<BasicJsonType>() returns *this, this won't call a from_json
|
||||||
|
// method when value_type is BasicJsonType
|
||||||
|
return i.template get<typename ConstructibleArrayType::value_type>();
|
||||||
|
});
|
||||||
|
arr = std::move(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename ConstructibleArrayType,
|
||||||
|
enable_if_t<
|
||||||
|
std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,
|
||||||
|
int> = 0>
|
||||||
|
inline void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,
|
||||||
|
priority_tag<0> /*unused*/)
|
||||||
|
{
|
||||||
|
using std::end;
|
||||||
|
|
||||||
|
ConstructibleArrayType ret;
|
||||||
|
std::transform(
|
||||||
|
j.begin(), j.end(), std::inserter(ret, end(ret)),
|
||||||
|
[](const BasicJsonType & i)
|
||||||
|
{
|
||||||
|
// get<BasicJsonType>() returns *this, this won't call a from_json
|
||||||
|
// method when value_type is BasicJsonType
|
||||||
|
return i.template get<typename ConstructibleArrayType::value_type>();
|
||||||
|
});
|
||||||
|
arr = std::move(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename ConstructibleArrayType,
|
||||||
|
enable_if_t <
|
||||||
|
is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value&&
|
||||||
|
!is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value&&
|
||||||
|
!is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value&&
|
||||||
|
!std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value&&
|
||||||
|
!is_basic_json<ConstructibleArrayType>::value,
|
||||||
|
int > = 0 >
|
||||||
|
auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
|
||||||
|
-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),
|
||||||
|
j.template get<typename ConstructibleArrayType::value_type>(),
|
||||||
|
void())
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
|
||||||
|
from_json_array_impl(j, arr, priority_tag<3> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename T, std::size_t... Idx >
|
||||||
|
std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJsonType&& j,
|
||||||
|
identity_tag<std::array<T, sizeof...(Idx)>> /*unused*/, index_sequence<Idx...> /*unused*/)
|
||||||
|
{
|
||||||
|
return { { std::forward<BasicJsonType>(j).at(Idx).template get<T>()... } };
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename T, std::size_t N >
|
||||||
|
auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)
|
||||||
|
-> decltype(from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {}))
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
|
||||||
|
return from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_binary()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be binary, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
|
||||||
|
bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename ConstructibleObjectType,
|
||||||
|
enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>
|
||||||
|
inline void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_object()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be object, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
|
||||||
|
ConstructibleObjectType ret;
|
||||||
|
const auto* inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();
|
||||||
|
using value_type = typename ConstructibleObjectType::value_type;
|
||||||
|
std::transform(
|
||||||
|
inner_object->begin(), inner_object->end(),
|
||||||
|
std::inserter(ret, ret.begin()),
|
||||||
|
[](typename BasicJsonType::object_t::value_type const & p)
|
||||||
|
{
|
||||||
|
return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());
|
||||||
|
});
|
||||||
|
obj = std::move(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// overload for arithmetic types, not chosen for basic_json template arguments
|
||||||
|
// (BooleanType, etc..); note: Is it really necessary to provide explicit
|
||||||
|
// overloads for boolean_t etc. in case of a custom BooleanType which is not
|
||||||
|
// an arithmetic type?
|
||||||
|
template < typename BasicJsonType, typename ArithmeticType,
|
||||||
|
enable_if_t <
|
||||||
|
std::is_arithmetic<ArithmeticType>::value&&
|
||||||
|
!std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value&&
|
||||||
|
!std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value&&
|
||||||
|
!std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value&&
|
||||||
|
!std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
|
||||||
|
int > = 0 >
|
||||||
|
inline void from_json(const BasicJsonType& j, ArithmeticType& val)
|
||||||
|
{
|
||||||
|
switch (static_cast<value_t>(j))
|
||||||
|
{
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case value_t::number_integer:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case value_t::number_float:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case value_t::boolean:
|
||||||
|
{
|
||||||
|
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::object:
|
||||||
|
case value_t::array:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename... Args, std::size_t... Idx>
|
||||||
|
std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, index_sequence<Idx...> /*unused*/)
|
||||||
|
{
|
||||||
|
return std::make_tuple(std::forward<BasicJsonType>(j).at(Idx).template get<Args>()...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, class A1, class A2 >
|
||||||
|
std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::pair<A1, A2>> /*unused*/, priority_tag<0> /*unused*/)
|
||||||
|
{
|
||||||
|
return {std::forward<BasicJsonType>(j).at(0).template get<A1>(),
|
||||||
|
std::forward<BasicJsonType>(j).at(1).template get<A2>()};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename A1, typename A2>
|
||||||
|
inline void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, priority_tag<1> /*unused*/)
|
||||||
|
{
|
||||||
|
p = from_json_tuple_impl(std::forward<BasicJsonType>(j), identity_tag<std::pair<A1, A2>> {}, priority_tag<0> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename... Args>
|
||||||
|
std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::tuple<Args...>> /*unused*/, priority_tag<2> /*unused*/)
|
||||||
|
{
|
||||||
|
return from_json_tuple_impl_base<BasicJsonType, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename... Args>
|
||||||
|
inline void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t, priority_tag<3> /*unused*/)
|
||||||
|
{
|
||||||
|
t = from_json_tuple_impl_base<BasicJsonType, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename TupleRelated>
|
||||||
|
auto from_json(BasicJsonType&& j, TupleRelated&& t)
|
||||||
|
-> decltype(from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {}))
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
|
||||||
|
return from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator,
|
||||||
|
typename = enable_if_t < !std::is_constructible <
|
||||||
|
typename BasicJsonType::string_t, Key >::value >>
|
||||||
|
inline void from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
m.clear();
|
||||||
|
for (const auto& p : j)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!p.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j));
|
||||||
|
}
|
||||||
|
m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator,
|
||||||
|
typename = enable_if_t < !std::is_constructible <
|
||||||
|
typename BasicJsonType::string_t, Key >::value >>
|
||||||
|
inline void from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
m.clear();
|
||||||
|
for (const auto& p : j)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!p.is_array()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j));
|
||||||
|
}
|
||||||
|
m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void from_json(const BasicJsonType& j, std_fs::path& p)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!j.is_string()))
|
||||||
|
{
|
||||||
|
JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j));
|
||||||
|
}
|
||||||
|
p = *j.template get_ptr<const typename BasicJsonType::string_t*>();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct from_json_fn
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType, typename T>
|
||||||
|
auto operator()(const BasicJsonType& j, T&& val) const
|
||||||
|
noexcept(noexcept(from_json(j, std::forward<T>(val))))
|
||||||
|
-> decltype(from_json(j, std::forward<T>(val)))
|
||||||
|
{
|
||||||
|
return from_json(j, std::forward<T>(val));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_CPP_17
|
||||||
|
/// namespace to hold default `from_json` function
|
||||||
|
/// to see why this is required:
|
||||||
|
/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html
|
||||||
|
namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
JSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definitions-in-headers)
|
||||||
|
detail::static_const<detail::from_json_fn>::value;
|
||||||
|
#ifndef JSON_HAS_CPP_17
|
||||||
|
} // namespace
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,447 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm> // copy
|
||||||
|
#include <iterator> // begin, end
|
||||||
|
#include <string> // string
|
||||||
|
#include <tuple> // tuple, get
|
||||||
|
#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
|
||||||
|
#include <utility> // move, forward, declval, pair
|
||||||
|
#include <valarray> // valarray
|
||||||
|
#include <vector> // vector
|
||||||
|
|
||||||
|
#include <nlohmann/detail/iterators/iteration_proxy.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
#include <nlohmann/detail/meta/std_fs.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
// constructors //
|
||||||
|
//////////////////
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note all external_constructor<>::construct functions need to call
|
||||||
|
* j.m_data.m_value.destroy(j.m_data.m_type) to avoid a memory leak in case j contains an
|
||||||
|
* allocated value (e.g., a string). See bug issue
|
||||||
|
* https://github.com/nlohmann/json/issues/2865 for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<value_t> struct external_constructor;
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::boolean>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::boolean;
|
||||||
|
j.m_data.m_value = b;
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::string>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::string;
|
||||||
|
j.m_data.m_value = s;
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::string;
|
||||||
|
j.m_data.m_value = std::move(s);
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename CompatibleStringType,
|
||||||
|
enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
|
||||||
|
int > = 0 >
|
||||||
|
static void construct(BasicJsonType& j, const CompatibleStringType& str)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::string;
|
||||||
|
j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::binary>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::binary;
|
||||||
|
j.m_data.m_value = typename BasicJsonType::binary_t(b);
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::binary;
|
||||||
|
j.m_data.m_value = typename BasicJsonType::binary_t(std::move(b));
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::number_float>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::number_float;
|
||||||
|
j.m_data.m_value = val;
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::number_unsigned>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::number_unsigned;
|
||||||
|
j.m_data.m_value = val;
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::number_integer>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::number_integer;
|
||||||
|
j.m_data.m_value = val;
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::array>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::array;
|
||||||
|
j.m_data.m_value = arr;
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::array;
|
||||||
|
j.m_data.m_value = std::move(arr);
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename CompatibleArrayType,
|
||||||
|
enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
|
||||||
|
int > = 0 >
|
||||||
|
static void construct(BasicJsonType& j, const CompatibleArrayType& arr)
|
||||||
|
{
|
||||||
|
using std::begin;
|
||||||
|
using std::end;
|
||||||
|
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::array;
|
||||||
|
j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, const std::vector<bool>& arr)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::array;
|
||||||
|
j.m_data.m_value = value_t::array;
|
||||||
|
j.m_data.m_value.array->reserve(arr.size());
|
||||||
|
for (const bool x : arr)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.array->push_back(x);
|
||||||
|
j.set_parent(j.m_data.m_value.array->back());
|
||||||
|
}
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T,
|
||||||
|
enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
|
||||||
|
static void construct(BasicJsonType& j, const std::valarray<T>& arr)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::array;
|
||||||
|
j.m_data.m_value = value_t::array;
|
||||||
|
j.m_data.m_value.array->resize(arr.size());
|
||||||
|
if (arr.size() > 0)
|
||||||
|
{
|
||||||
|
std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin());
|
||||||
|
}
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct external_constructor<value_t::object>
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::object;
|
||||||
|
j.m_data.m_value = obj;
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
|
||||||
|
{
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::object;
|
||||||
|
j.m_data.m_value = std::move(obj);
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename CompatibleObjectType,
|
||||||
|
enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 >
|
||||||
|
static void construct(BasicJsonType& j, const CompatibleObjectType& obj)
|
||||||
|
{
|
||||||
|
using std::begin;
|
||||||
|
using std::end;
|
||||||
|
|
||||||
|
j.m_data.m_value.destroy(j.m_data.m_type);
|
||||||
|
j.m_data.m_type = value_t::object;
|
||||||
|
j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
|
||||||
|
j.set_parents();
|
||||||
|
j.assert_invariant();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////
|
||||||
|
// to_json //
|
||||||
|
/////////////
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T,
|
||||||
|
enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, T b) noexcept
|
||||||
|
{
|
||||||
|
external_constructor<value_t::boolean>::construct(j, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename BoolRef,
|
||||||
|
enable_if_t <
|
||||||
|
((std::is_same<std::vector<bool>::reference, BoolRef>::value
|
||||||
|
&& !std::is_same <std::vector<bool>::reference, typename BasicJsonType::boolean_t&>::value)
|
||||||
|
|| (std::is_same<std::vector<bool>::const_reference, BoolRef>::value
|
||||||
|
&& !std::is_same <detail::uncvref_t<std::vector<bool>::const_reference>,
|
||||||
|
typename BasicJsonType::boolean_t >::value))
|
||||||
|
&& std::is_convertible<const BoolRef&, typename BasicJsonType::boolean_t>::value, int > = 0 >
|
||||||
|
inline void to_json(BasicJsonType& j, const BoolRef& b) noexcept
|
||||||
|
{
|
||||||
|
external_constructor<value_t::boolean>::construct(j, static_cast<typename BasicJsonType::boolean_t>(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename CompatibleString,
|
||||||
|
enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, const CompatibleString& s)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::string>::construct(j, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::string>::construct(j, std::move(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename FloatType,
|
||||||
|
enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, FloatType val) noexcept
|
||||||
|
{
|
||||||
|
external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename CompatibleNumberUnsignedType,
|
||||||
|
enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept
|
||||||
|
{
|
||||||
|
external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename CompatibleNumberIntegerType,
|
||||||
|
enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept
|
||||||
|
{
|
||||||
|
external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
|
template<typename BasicJsonType, typename EnumType,
|
||||||
|
enable_if_t<std::is_enum<EnumType>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, EnumType e) noexcept
|
||||||
|
{
|
||||||
|
using underlying_type = typename std::underlying_type<EnumType>::type;
|
||||||
|
static constexpr value_t integral_value_t = std::is_unsigned<underlying_type>::value ? value_t::number_unsigned : value_t::number_integer;
|
||||||
|
external_constructor<integral_value_t>::construct(j, static_cast<underlying_type>(e));
|
||||||
|
}
|
||||||
|
#endif // JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void to_json(BasicJsonType& j, const std::vector<bool>& e)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::array>::construct(j, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename CompatibleArrayType,
|
||||||
|
enable_if_t < is_compatible_array_type<BasicJsonType,
|
||||||
|
CompatibleArrayType>::value&&
|
||||||
|
!is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&&
|
||||||
|
!is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&
|
||||||
|
!std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&
|
||||||
|
!is_basic_json<CompatibleArrayType>::value,
|
||||||
|
int > = 0 >
|
||||||
|
inline void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::array>::construct(j, arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::binary>::construct(j, bin);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T,
|
||||||
|
enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, const std::valarray<T>& arr)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::array>::construct(j, std::move(arr));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::array>::construct(j, std::move(arr));
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename CompatibleObjectType,
|
||||||
|
enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value, int > = 0 >
|
||||||
|
inline void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::object>::construct(j, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::object>::construct(j, std::move(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <
|
||||||
|
typename BasicJsonType, typename T, std::size_t N,
|
||||||
|
enable_if_t < !std::is_constructible<typename BasicJsonType::string_t,
|
||||||
|
const T(&)[N]>::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
int > = 0 >
|
||||||
|
inline void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
{
|
||||||
|
external_constructor<value_t::array>::construct(j, arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >
|
||||||
|
inline void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
|
||||||
|
{
|
||||||
|
j = { p.first, p.second };
|
||||||
|
}
|
||||||
|
|
||||||
|
// for https://github.com/nlohmann/json/pull/1134
|
||||||
|
template<typename BasicJsonType, typename T,
|
||||||
|
enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, const T& b)
|
||||||
|
{
|
||||||
|
j = { {b.key(), b.value()} };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename Tuple, std::size_t... Idx>
|
||||||
|
inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> /*unused*/)
|
||||||
|
{
|
||||||
|
j = { std::get<Idx>(t)... };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
|
||||||
|
inline void to_json(BasicJsonType& j, const T& t)
|
||||||
|
{
|
||||||
|
to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
inline void to_json(BasicJsonType& j, const std_fs::path& p)
|
||||||
|
{
|
||||||
|
j = p.string();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct to_json_fn
|
||||||
|
{
|
||||||
|
template<typename BasicJsonType, typename T>
|
||||||
|
auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val))))
|
||||||
|
-> decltype(to_json(j, std::forward<T>(val)), void())
|
||||||
|
{
|
||||||
|
return to_json(j, std::forward<T>(val));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_CPP_17
|
||||||
|
/// namespace to hold default `to_json` function
|
||||||
|
/// to see why this is required:
|
||||||
|
/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html
|
||||||
|
namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
JSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-in-headers)
|
||||||
|
detail::static_const<detail::to_json_fn>::value;
|
||||||
|
#ifndef JSON_HAS_CPP_17
|
||||||
|
} // namespace
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
257
chargingstation-aiter/include/nlohmann/detail/exceptions.hpp
Normal file
257
chargingstation-aiter/include/nlohmann/detail/exceptions.hpp
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef> // nullptr_t
|
||||||
|
#include <exception> // exception
|
||||||
|
#if JSON_DIAGNOSTICS
|
||||||
|
#include <numeric> // accumulate
|
||||||
|
#endif
|
||||||
|
#include <stdexcept> // runtime_error
|
||||||
|
#include <string> // to_string
|
||||||
|
#include <vector> // vector
|
||||||
|
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
#include <nlohmann/detail/string_escape.hpp>
|
||||||
|
#include <nlohmann/detail/input/position_t.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// exceptions //
|
||||||
|
////////////////
|
||||||
|
|
||||||
|
/// @brief general exception of the @ref basic_json class
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/exception/
|
||||||
|
class exception : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// returns the explanatory string
|
||||||
|
const char* what() const noexcept override
|
||||||
|
{
|
||||||
|
return m.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// the id of the exception
|
||||||
|
const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
JSON_HEDLEY_NON_NULL(3)
|
||||||
|
exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing)
|
||||||
|
|
||||||
|
static std::string name(const std::string& ename, int id_)
|
||||||
|
{
|
||||||
|
return concat("[json.exception.", ename, '.', std::to_string(id_), "] ");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string diagnostics(std::nullptr_t /*leaf_element*/)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static std::string diagnostics(const BasicJsonType* leaf_element)
|
||||||
|
{
|
||||||
|
#if JSON_DIAGNOSTICS
|
||||||
|
std::vector<std::string> tokens;
|
||||||
|
for (const auto* current = leaf_element; current != nullptr && current->m_parent != nullptr; current = current->m_parent)
|
||||||
|
{
|
||||||
|
switch (current->m_parent->type())
|
||||||
|
{
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
for (std::size_t i = 0; i < current->m_parent->m_data.m_value.array->size(); ++i)
|
||||||
|
{
|
||||||
|
if (¤t->m_parent->m_data.m_value.array->operator[](i) == current)
|
||||||
|
{
|
||||||
|
tokens.emplace_back(std::to_string(i));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
for (const auto& element : *current->m_parent->m_data.m_value.object)
|
||||||
|
{
|
||||||
|
if (&element.second == current)
|
||||||
|
{
|
||||||
|
tokens.emplace_back(element.first.c_str());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null: // LCOV_EXCL_LINE
|
||||||
|
case value_t::string: // LCOV_EXCL_LINE
|
||||||
|
case value_t::boolean: // LCOV_EXCL_LINE
|
||||||
|
case value_t::number_integer: // LCOV_EXCL_LINE
|
||||||
|
case value_t::number_unsigned: // LCOV_EXCL_LINE
|
||||||
|
case value_t::number_float: // LCOV_EXCL_LINE
|
||||||
|
case value_t::binary: // LCOV_EXCL_LINE
|
||||||
|
case value_t::discarded: // LCOV_EXCL_LINE
|
||||||
|
default: // LCOV_EXCL_LINE
|
||||||
|
break; // LCOV_EXCL_LINE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tokens.empty())
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
auto str = std::accumulate(tokens.rbegin(), tokens.rend(), std::string{},
|
||||||
|
[](const std::string & a, const std::string & b)
|
||||||
|
{
|
||||||
|
return concat(a, '/', detail::escape(b));
|
||||||
|
});
|
||||||
|
return concat('(', str, ") ");
|
||||||
|
#else
|
||||||
|
static_cast<void>(leaf_element);
|
||||||
|
return "";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// an exception object as storage for error messages
|
||||||
|
std::runtime_error m;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief exception indicating a parse error
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/parse_error/
|
||||||
|
class parse_error : public exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*!
|
||||||
|
@brief create a parse error exception
|
||||||
|
@param[in] id_ the id of the exception
|
||||||
|
@param[in] pos the position where the error occurred (or with
|
||||||
|
chars_read_total=0 if the position cannot be
|
||||||
|
determined)
|
||||||
|
@param[in] what_arg the explanatory string
|
||||||
|
@return parse_error object
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
|
static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)
|
||||||
|
{
|
||||||
|
const std::string w = concat(exception::name("parse_error", id_), "parse error",
|
||||||
|
position_string(pos), ": ", exception::diagnostics(context), what_arg);
|
||||||
|
return {id_, pos.chars_read_total, w.c_str()};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
|
static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)
|
||||||
|
{
|
||||||
|
const std::string w = concat(exception::name("parse_error", id_), "parse error",
|
||||||
|
(byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
|
||||||
|
": ", exception::diagnostics(context), what_arg);
|
||||||
|
return {id_, byte_, w.c_str()};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief byte index of the parse error
|
||||||
|
|
||||||
|
The byte index of the last read character in the input file.
|
||||||
|
|
||||||
|
@note For an input with n bytes, 1 is the index of the first character and
|
||||||
|
n+1 is the index of the terminating null byte or the end of file.
|
||||||
|
This also holds true when reading a byte vector (CBOR or MessagePack).
|
||||||
|
*/
|
||||||
|
const std::size_t byte;
|
||||||
|
|
||||||
|
private:
|
||||||
|
parse_error(int id_, std::size_t byte_, const char* what_arg)
|
||||||
|
: exception(id_, what_arg), byte(byte_) {}
|
||||||
|
|
||||||
|
static std::string position_string(const position_t& pos)
|
||||||
|
{
|
||||||
|
return concat(" at line ", std::to_string(pos.lines_read + 1),
|
||||||
|
", column ", std::to_string(pos.chars_read_current_line));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief exception indicating errors with iterators
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/
|
||||||
|
class invalid_iterator : public exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
|
static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
|
{
|
||||||
|
const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
|
||||||
|
return {id_, w.c_str()};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
JSON_HEDLEY_NON_NULL(3)
|
||||||
|
invalid_iterator(int id_, const char* what_arg)
|
||||||
|
: exception(id_, what_arg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief exception indicating executing a member function with a wrong type
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/type_error/
|
||||||
|
class type_error : public exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
|
static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
|
{
|
||||||
|
const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
|
||||||
|
return {id_, w.c_str()};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
JSON_HEDLEY_NON_NULL(3)
|
||||||
|
type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief exception indicating access out of the defined range
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/
|
||||||
|
class out_of_range : public exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
|
static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
|
{
|
||||||
|
const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
|
||||||
|
return {id_, w.c_str()};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
JSON_HEDLEY_NON_NULL(3)
|
||||||
|
out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief exception indicating other library errors
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/other_error/
|
||||||
|
class other_error : public exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
|
||||||
|
static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)
|
||||||
|
{
|
||||||
|
const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
|
||||||
|
return {id_, w.c_str()};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
JSON_HEDLEY_NON_NULL(3)
|
||||||
|
other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
129
chargingstation-aiter/include/nlohmann/detail/hash.hpp
Normal file
129
chargingstation-aiter/include/nlohmann/detail/hash.hpp
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint> // uint8_t
|
||||||
|
#include <cstddef> // size_t
|
||||||
|
#include <functional> // hash
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
// boost::hash_combine
|
||||||
|
inline std::size_t combine(std::size_t seed, std::size_t h) noexcept
|
||||||
|
{
|
||||||
|
seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief hash a JSON value
|
||||||
|
|
||||||
|
The hash function tries to rely on std::hash where possible. Furthermore, the
|
||||||
|
type of the JSON value is taken into account to have different hash values for
|
||||||
|
null, 0, 0U, and false, etc.
|
||||||
|
|
||||||
|
@tparam BasicJsonType basic_json specialization
|
||||||
|
@param j JSON value to hash
|
||||||
|
@return hash value of j
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
std::size_t hash(const BasicJsonType& j)
|
||||||
|
{
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
|
||||||
|
const auto type = static_cast<std::size_t>(j.type());
|
||||||
|
switch (j.type())
|
||||||
|
{
|
||||||
|
case BasicJsonType::value_t::null:
|
||||||
|
case BasicJsonType::value_t::discarded:
|
||||||
|
{
|
||||||
|
return combine(type, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::object:
|
||||||
|
{
|
||||||
|
auto seed = combine(type, j.size());
|
||||||
|
for (const auto& element : j.items())
|
||||||
|
{
|
||||||
|
const auto h = std::hash<string_t> {}(element.key());
|
||||||
|
seed = combine(seed, h);
|
||||||
|
seed = combine(seed, hash(element.value()));
|
||||||
|
}
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::array:
|
||||||
|
{
|
||||||
|
auto seed = combine(type, j.size());
|
||||||
|
for (const auto& element : j)
|
||||||
|
{
|
||||||
|
seed = combine(seed, hash(element));
|
||||||
|
}
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::string:
|
||||||
|
{
|
||||||
|
const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>());
|
||||||
|
return combine(type, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::boolean:
|
||||||
|
{
|
||||||
|
const auto h = std::hash<bool> {}(j.template get<bool>());
|
||||||
|
return combine(type, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::number_integer:
|
||||||
|
{
|
||||||
|
const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>());
|
||||||
|
return combine(type, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::number_unsigned:
|
||||||
|
{
|
||||||
|
const auto h = std::hash<number_unsigned_t> {}(j.template get<number_unsigned_t>());
|
||||||
|
return combine(type, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::number_float:
|
||||||
|
{
|
||||||
|
const auto h = std::hash<number_float_t> {}(j.template get<number_float_t>());
|
||||||
|
return combine(type, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
case BasicJsonType::value_t::binary:
|
||||||
|
{
|
||||||
|
auto seed = combine(type, j.get_binary().size());
|
||||||
|
const auto h = std::hash<bool> {}(j.get_binary().has_subtype());
|
||||||
|
seed = combine(seed, h);
|
||||||
|
seed = combine(seed, static_cast<std::size_t>(j.get_binary().subtype()));
|
||||||
|
for (const auto byte : j.get_binary())
|
||||||
|
{
|
||||||
|
seed = combine(seed, std::hash<std::uint8_t> {}(byte));
|
||||||
|
}
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: // LCOV_EXCL_LINE
|
||||||
|
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
|
||||||
|
return 0; // LCOV_EXCL_LINE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/input/._lexer.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/input/._lexer.hpp
Normal file
Binary file not shown.
BIN
chargingstation-aiter/include/nlohmann/detail/input/._parser.hpp
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/input/._parser.hpp
Normal file
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,492 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <array> // array
|
||||||
|
#include <cstddef> // size_t
|
||||||
|
#include <cstring> // strlen
|
||||||
|
#include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next
|
||||||
|
#include <memory> // shared_ptr, make_shared, addressof
|
||||||
|
#include <numeric> // accumulate
|
||||||
|
#include <string> // string, char_traits
|
||||||
|
#include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer
|
||||||
|
#include <utility> // pair, declval
|
||||||
|
|
||||||
|
#ifndef JSON_NO_IO
|
||||||
|
#include <cstdio> // FILE *
|
||||||
|
#include <istream> // istream
|
||||||
|
#endif // JSON_NO_IO
|
||||||
|
|
||||||
|
#include <nlohmann/detail/iterators/iterator_traits.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
/// the supported input formats
|
||||||
|
enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata };
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
// input adapters //
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
#ifndef JSON_NO_IO
|
||||||
|
/*!
|
||||||
|
Input adapter for stdio file access. This adapter read only 1 byte and do not use any
|
||||||
|
buffer. This adapter is a very low level adapter.
|
||||||
|
*/
|
||||||
|
class file_input_adapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using char_type = char;
|
||||||
|
|
||||||
|
JSON_HEDLEY_NON_NULL(2)
|
||||||
|
explicit file_input_adapter(std::FILE* f) noexcept
|
||||||
|
: m_file(f)
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_file != nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make class move-only
|
||||||
|
file_input_adapter(const file_input_adapter&) = delete;
|
||||||
|
file_input_adapter(file_input_adapter&&) noexcept = default;
|
||||||
|
file_input_adapter& operator=(const file_input_adapter&) = delete;
|
||||||
|
file_input_adapter& operator=(file_input_adapter&&) = delete;
|
||||||
|
~file_input_adapter() = default;
|
||||||
|
|
||||||
|
std::char_traits<char>::int_type get_character() noexcept
|
||||||
|
{
|
||||||
|
return std::fgetc(m_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// the file pointer to read from
|
||||||
|
std::FILE* m_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at
|
||||||
|
beginning of input. Does not support changing the underlying std::streambuf
|
||||||
|
in mid-input. Maintains underlying std::istream and std::streambuf to support
|
||||||
|
subsequent use of standard std::istream operations to process any input
|
||||||
|
characters following those used in parsing the JSON input. Clears the
|
||||||
|
std::istream flags; any input errors (e.g., EOF) will be detected by the first
|
||||||
|
subsequent call for input from the std::istream.
|
||||||
|
*/
|
||||||
|
class input_stream_adapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using char_type = char;
|
||||||
|
|
||||||
|
~input_stream_adapter()
|
||||||
|
{
|
||||||
|
// clear stream flags; we use underlying streambuf I/O, do not
|
||||||
|
// maintain ifstream flags, except eof
|
||||||
|
if (is != nullptr)
|
||||||
|
{
|
||||||
|
is->clear(is->rdstate() & std::ios::eofbit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit input_stream_adapter(std::istream& i)
|
||||||
|
: is(&i), sb(i.rdbuf())
|
||||||
|
{}
|
||||||
|
|
||||||
|
// delete because of pointer members
|
||||||
|
input_stream_adapter(const input_stream_adapter&) = delete;
|
||||||
|
input_stream_adapter& operator=(input_stream_adapter&) = delete;
|
||||||
|
input_stream_adapter& operator=(input_stream_adapter&&) = delete;
|
||||||
|
|
||||||
|
input_stream_adapter(input_stream_adapter&& rhs) noexcept
|
||||||
|
: is(rhs.is), sb(rhs.sb)
|
||||||
|
{
|
||||||
|
rhs.is = nullptr;
|
||||||
|
rhs.sb = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::istream/std::streambuf use std::char_traits<char>::to_int_type, to
|
||||||
|
// ensure that std::char_traits<char>::eof() and the character 0xFF do not
|
||||||
|
// end up as the same value, e.g. 0xFFFFFFFF.
|
||||||
|
std::char_traits<char>::int_type get_character()
|
||||||
|
{
|
||||||
|
auto res = sb->sbumpc();
|
||||||
|
// set eof manually, as we don't use the istream interface.
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(res == std::char_traits<char>::eof()))
|
||||||
|
{
|
||||||
|
is->clear(is->rdstate() | std::ios::eofbit);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// the associated input stream
|
||||||
|
std::istream* is = nullptr;
|
||||||
|
std::streambuf* sb = nullptr;
|
||||||
|
};
|
||||||
|
#endif // JSON_NO_IO
|
||||||
|
|
||||||
|
// General-purpose iterator-based adapter. It might not be as fast as
|
||||||
|
// theoretically possible for some containers, but it is extremely versatile.
|
||||||
|
template<typename IteratorType>
|
||||||
|
class iterator_input_adapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using char_type = typename std::iterator_traits<IteratorType>::value_type;
|
||||||
|
|
||||||
|
iterator_input_adapter(IteratorType first, IteratorType last)
|
||||||
|
: current(std::move(first)), end(std::move(last))
|
||||||
|
{}
|
||||||
|
|
||||||
|
typename char_traits<char_type>::int_type get_character()
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_LIKELY(current != end))
|
||||||
|
{
|
||||||
|
auto result = char_traits<char_type>::to_int_type(*current);
|
||||||
|
std::advance(current, 1);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return char_traits<char_type>::eof();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
IteratorType current;
|
||||||
|
IteratorType end;
|
||||||
|
|
||||||
|
template<typename BaseInputAdapter, size_t T>
|
||||||
|
friend struct wide_string_input_helper;
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return current == end;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename BaseInputAdapter, size_t T>
|
||||||
|
struct wide_string_input_helper;
|
||||||
|
|
||||||
|
template<typename BaseInputAdapter>
|
||||||
|
struct wide_string_input_helper<BaseInputAdapter, 4>
|
||||||
|
{
|
||||||
|
// UTF-32
|
||||||
|
static void fill_buffer(BaseInputAdapter& input,
|
||||||
|
std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
|
||||||
|
size_t& utf8_bytes_index,
|
||||||
|
size_t& utf8_bytes_filled)
|
||||||
|
{
|
||||||
|
utf8_bytes_index = 0;
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(input.empty()))
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = std::char_traits<char>::eof();
|
||||||
|
utf8_bytes_filled = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// get the current character
|
||||||
|
const auto wc = input.get_character();
|
||||||
|
|
||||||
|
// UTF-32 to UTF-8 encoding
|
||||||
|
if (wc < 0x80)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
|
||||||
|
utf8_bytes_filled = 1;
|
||||||
|
}
|
||||||
|
else if (wc <= 0x7FF)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));
|
||||||
|
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
|
||||||
|
utf8_bytes_filled = 2;
|
||||||
|
}
|
||||||
|
else if (wc <= 0xFFFF)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));
|
||||||
|
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
|
||||||
|
utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
|
||||||
|
utf8_bytes_filled = 3;
|
||||||
|
}
|
||||||
|
else if (wc <= 0x10FFFF)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));
|
||||||
|
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));
|
||||||
|
utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
|
||||||
|
utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
|
||||||
|
utf8_bytes_filled = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// unknown character
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
|
||||||
|
utf8_bytes_filled = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename BaseInputAdapter>
|
||||||
|
struct wide_string_input_helper<BaseInputAdapter, 2>
|
||||||
|
{
|
||||||
|
// UTF-16
|
||||||
|
static void fill_buffer(BaseInputAdapter& input,
|
||||||
|
std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
|
||||||
|
size_t& utf8_bytes_index,
|
||||||
|
size_t& utf8_bytes_filled)
|
||||||
|
{
|
||||||
|
utf8_bytes_index = 0;
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(input.empty()))
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = std::char_traits<char>::eof();
|
||||||
|
utf8_bytes_filled = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// get the current character
|
||||||
|
const auto wc = input.get_character();
|
||||||
|
|
||||||
|
// UTF-16 to UTF-8 encoding
|
||||||
|
if (wc < 0x80)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
|
||||||
|
utf8_bytes_filled = 1;
|
||||||
|
}
|
||||||
|
else if (wc <= 0x7FF)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));
|
||||||
|
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
|
||||||
|
utf8_bytes_filled = 2;
|
||||||
|
}
|
||||||
|
else if (0xD800 > wc || wc >= 0xE000)
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));
|
||||||
|
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
|
||||||
|
utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
|
||||||
|
utf8_bytes_filled = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!input.empty()))
|
||||||
|
{
|
||||||
|
const auto wc2 = static_cast<unsigned int>(input.get_character());
|
||||||
|
const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));
|
||||||
|
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));
|
||||||
|
utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));
|
||||||
|
utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu));
|
||||||
|
utf8_bytes_filled = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
|
||||||
|
utf8_bytes_filled = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Wraps another input adapter to convert wide character types into individual bytes.
|
||||||
|
template<typename BaseInputAdapter, typename WideCharType>
|
||||||
|
class wide_string_input_adapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using char_type = char;
|
||||||
|
|
||||||
|
wide_string_input_adapter(BaseInputAdapter base)
|
||||||
|
: base_adapter(base) {}
|
||||||
|
|
||||||
|
typename std::char_traits<char>::int_type get_character() noexcept
|
||||||
|
{
|
||||||
|
// check if buffer needs to be filled
|
||||||
|
if (utf8_bytes_index == utf8_bytes_filled)
|
||||||
|
{
|
||||||
|
fill_buffer<sizeof(WideCharType)>();
|
||||||
|
|
||||||
|
JSON_ASSERT(utf8_bytes_filled > 0);
|
||||||
|
JSON_ASSERT(utf8_bytes_index == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// use buffer
|
||||||
|
JSON_ASSERT(utf8_bytes_filled > 0);
|
||||||
|
JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);
|
||||||
|
return utf8_bytes[utf8_bytes_index++];
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
BaseInputAdapter base_adapter;
|
||||||
|
|
||||||
|
template<size_t T>
|
||||||
|
void fill_buffer()
|
||||||
|
{
|
||||||
|
wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// a buffer for UTF-8 bytes
|
||||||
|
std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
|
||||||
|
|
||||||
|
/// index to the utf8_codes array for the next valid byte
|
||||||
|
std::size_t utf8_bytes_index = 0;
|
||||||
|
/// number of valid bytes in the utf8_codes array
|
||||||
|
std::size_t utf8_bytes_filled = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename IteratorType, typename Enable = void>
|
||||||
|
struct iterator_input_adapter_factory
|
||||||
|
{
|
||||||
|
using iterator_type = IteratorType;
|
||||||
|
using char_type = typename std::iterator_traits<iterator_type>::value_type;
|
||||||
|
using adapter_type = iterator_input_adapter<iterator_type>;
|
||||||
|
|
||||||
|
static adapter_type create(IteratorType first, IteratorType last)
|
||||||
|
{
|
||||||
|
return adapter_type(std::move(first), std::move(last));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct is_iterator_of_multibyte
|
||||||
|
{
|
||||||
|
using value_type = typename std::iterator_traits<T>::value_type;
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
value = sizeof(value_type) > 1
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename IteratorType>
|
||||||
|
struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>>
|
||||||
|
{
|
||||||
|
using iterator_type = IteratorType;
|
||||||
|
using char_type = typename std::iterator_traits<iterator_type>::value_type;
|
||||||
|
using base_adapter_type = iterator_input_adapter<iterator_type>;
|
||||||
|
using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>;
|
||||||
|
|
||||||
|
static adapter_type create(IteratorType first, IteratorType last)
|
||||||
|
{
|
||||||
|
return adapter_type(base_adapter_type(std::move(first), std::move(last)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// General purpose iterator-based input
|
||||||
|
template<typename IteratorType>
|
||||||
|
typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last)
|
||||||
|
{
|
||||||
|
using factory_type = iterator_input_adapter_factory<IteratorType>;
|
||||||
|
return factory_type::create(first, last);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convenience shorthand from container to iterator
|
||||||
|
// Enables ADL on begin(container) and end(container)
|
||||||
|
// Encloses the using declarations in namespace for not to leak them to outside scope
|
||||||
|
|
||||||
|
namespace container_input_adapter_factory_impl
|
||||||
|
{
|
||||||
|
|
||||||
|
using std::begin;
|
||||||
|
using std::end;
|
||||||
|
|
||||||
|
template<typename ContainerType, typename Enable = void>
|
||||||
|
struct container_input_adapter_factory {};
|
||||||
|
|
||||||
|
template<typename ContainerType>
|
||||||
|
struct container_input_adapter_factory< ContainerType,
|
||||||
|
void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>
|
||||||
|
{
|
||||||
|
using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>())));
|
||||||
|
|
||||||
|
static adapter_type create(const ContainerType& container)
|
||||||
|
{
|
||||||
|
return input_adapter(begin(container), end(container));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace container_input_adapter_factory_impl
|
||||||
|
|
||||||
|
template<typename ContainerType>
|
||||||
|
typename container_input_adapter_factory_impl::container_input_adapter_factory<ContainerType>::adapter_type input_adapter(const ContainerType& container)
|
||||||
|
{
|
||||||
|
return container_input_adapter_factory_impl::container_input_adapter_factory<ContainerType>::create(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef JSON_NO_IO
|
||||||
|
// Special cases with fast paths
|
||||||
|
inline file_input_adapter input_adapter(std::FILE* file)
|
||||||
|
{
|
||||||
|
return file_input_adapter(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline input_stream_adapter input_adapter(std::istream& stream)
|
||||||
|
{
|
||||||
|
return input_stream_adapter(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline input_stream_adapter input_adapter(std::istream&& stream)
|
||||||
|
{
|
||||||
|
return input_stream_adapter(stream);
|
||||||
|
}
|
||||||
|
#endif // JSON_NO_IO
|
||||||
|
|
||||||
|
using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));
|
||||||
|
|
||||||
|
// Null-delimited strings, and the like.
|
||||||
|
template < typename CharT,
|
||||||
|
typename std::enable_if <
|
||||||
|
std::is_pointer<CharT>::value&&
|
||||||
|
!std::is_array<CharT>::value&&
|
||||||
|
std::is_integral<typename std::remove_pointer<CharT>::type>::value&&
|
||||||
|
sizeof(typename std::remove_pointer<CharT>::type) == 1,
|
||||||
|
int >::type = 0 >
|
||||||
|
contiguous_bytes_input_adapter input_adapter(CharT b)
|
||||||
|
{
|
||||||
|
auto length = std::strlen(reinterpret_cast<const char*>(b));
|
||||||
|
const auto* ptr = reinterpret_cast<const char*>(b);
|
||||||
|
return input_adapter(ptr, ptr + length);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, std::size_t N>
|
||||||
|
auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
|
||||||
|
{
|
||||||
|
return input_adapter(array, array + N);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This class only handles inputs of input_buffer_adapter type.
|
||||||
|
// It's required so that expressions like {ptr, len} can be implicitly cast
|
||||||
|
// to the correct adapter.
|
||||||
|
class span_input_adapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template < typename CharT,
|
||||||
|
typename std::enable_if <
|
||||||
|
std::is_pointer<CharT>::value&&
|
||||||
|
std::is_integral<typename std::remove_pointer<CharT>::type>::value&&
|
||||||
|
sizeof(typename std::remove_pointer<CharT>::type) == 1,
|
||||||
|
int >::type = 0 >
|
||||||
|
span_input_adapter(CharT b, std::size_t l)
|
||||||
|
: ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}
|
||||||
|
|
||||||
|
template<class IteratorType,
|
||||||
|
typename std::enable_if<
|
||||||
|
std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,
|
||||||
|
int>::type = 0>
|
||||||
|
span_input_adapter(IteratorType first, IteratorType last)
|
||||||
|
: ia(input_adapter(first, last)) {}
|
||||||
|
|
||||||
|
contiguous_bytes_input_adapter&& get()
|
||||||
|
{
|
||||||
|
return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
contiguous_bytes_input_adapter ia;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
727
chargingstation-aiter/include/nlohmann/detail/input/json_sax.hpp
Normal file
727
chargingstation-aiter/include/nlohmann/detail/input/json_sax.hpp
Normal file
@ -0,0 +1,727 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <string> // string
|
||||||
|
#include <utility> // move
|
||||||
|
#include <vector> // vector
|
||||||
|
|
||||||
|
#include <nlohmann/detail/exceptions.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief SAX interface
|
||||||
|
|
||||||
|
This class describes the SAX interface used by @ref nlohmann::json::sax_parse.
|
||||||
|
Each function is called in different situations while the input is parsed. The
|
||||||
|
boolean return value informs the parser whether to continue processing the
|
||||||
|
input.
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
struct json_sax
|
||||||
|
{
|
||||||
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
using binary_t = typename BasicJsonType::binary_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a null value was read
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool null() = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a boolean value was read
|
||||||
|
@param[in] val boolean value
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool boolean(bool val) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief an integer number was read
|
||||||
|
@param[in] val integer value
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool number_integer(number_integer_t val) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief an unsigned integer number was read
|
||||||
|
@param[in] val unsigned integer value
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool number_unsigned(number_unsigned_t val) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a floating-point number was read
|
||||||
|
@param[in] val floating-point value
|
||||||
|
@param[in] s raw token value
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool number_float(number_float_t val, const string_t& s) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a string value was read
|
||||||
|
@param[in] val string value
|
||||||
|
@return whether parsing should proceed
|
||||||
|
@note It is safe to move the passed string value.
|
||||||
|
*/
|
||||||
|
virtual bool string(string_t& val) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a binary value was read
|
||||||
|
@param[in] val binary value
|
||||||
|
@return whether parsing should proceed
|
||||||
|
@note It is safe to move the passed binary value.
|
||||||
|
*/
|
||||||
|
virtual bool binary(binary_t& val) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief the beginning of an object was read
|
||||||
|
@param[in] elements number of object elements or -1 if unknown
|
||||||
|
@return whether parsing should proceed
|
||||||
|
@note binary formats may report the number of elements
|
||||||
|
*/
|
||||||
|
virtual bool start_object(std::size_t elements) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief an object key was read
|
||||||
|
@param[in] val object key
|
||||||
|
@return whether parsing should proceed
|
||||||
|
@note It is safe to move the passed string.
|
||||||
|
*/
|
||||||
|
virtual bool key(string_t& val) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief the end of an object was read
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool end_object() = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief the beginning of an array was read
|
||||||
|
@param[in] elements number of array elements or -1 if unknown
|
||||||
|
@return whether parsing should proceed
|
||||||
|
@note binary formats may report the number of elements
|
||||||
|
*/
|
||||||
|
virtual bool start_array(std::size_t elements) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief the end of an array was read
|
||||||
|
@return whether parsing should proceed
|
||||||
|
*/
|
||||||
|
virtual bool end_array() = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a parse error occurred
|
||||||
|
@param[in] position the position in the input where the error occurs
|
||||||
|
@param[in] last_token the last read token
|
||||||
|
@param[in] ex an exception object describing the error
|
||||||
|
@return whether parsing should proceed (must return false)
|
||||||
|
*/
|
||||||
|
virtual bool parse_error(std::size_t position,
|
||||||
|
const std::string& last_token,
|
||||||
|
const detail::exception& ex) = 0;
|
||||||
|
|
||||||
|
json_sax() = default;
|
||||||
|
json_sax(const json_sax&) = default;
|
||||||
|
json_sax(json_sax&&) noexcept = default;
|
||||||
|
json_sax& operator=(const json_sax&) = default;
|
||||||
|
json_sax& operator=(json_sax&&) noexcept = default;
|
||||||
|
virtual ~json_sax() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
@brief SAX implementation to create a JSON value from SAX events
|
||||||
|
|
||||||
|
This class implements the @ref json_sax interface and processes the SAX events
|
||||||
|
to create a JSON value which makes it basically a DOM parser. The structure or
|
||||||
|
hierarchy of the JSON value is managed by the stack `ref_stack` which contains
|
||||||
|
a pointer to the respective array or object for each recursion depth.
|
||||||
|
|
||||||
|
After successful parsing, the value that is passed by reference to the
|
||||||
|
constructor contains the parsed value.
|
||||||
|
|
||||||
|
@tparam BasicJsonType the JSON type
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
class json_sax_dom_parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
using binary_t = typename BasicJsonType::binary_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@param[in,out] r reference to a JSON value that is manipulated while
|
||||||
|
parsing
|
||||||
|
@param[in] allow_exceptions_ whether parse errors yield exceptions
|
||||||
|
*/
|
||||||
|
explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true)
|
||||||
|
: root(r), allow_exceptions(allow_exceptions_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// make class move-only
|
||||||
|
json_sax_dom_parser(const json_sax_dom_parser&) = delete;
|
||||||
|
json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
|
||||||
|
json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
|
||||||
|
json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
|
||||||
|
~json_sax_dom_parser() = default;
|
||||||
|
|
||||||
|
bool null()
|
||||||
|
{
|
||||||
|
handle_value(nullptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool boolean(bool val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_integer(number_integer_t val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_unsigned(number_unsigned_t val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_float(number_float_t val, const string_t& /*unused*/)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool string(string_t& val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool binary(binary_t& val)
|
||||||
|
{
|
||||||
|
handle_value(std::move(val));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_object(std::size_t len)
|
||||||
|
{
|
||||||
|
ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
|
||||||
|
{
|
||||||
|
JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool key(string_t& val)
|
||||||
|
{
|
||||||
|
JSON_ASSERT(!ref_stack.empty());
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_object());
|
||||||
|
|
||||||
|
// add null at given key and store the reference for later
|
||||||
|
object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool end_object()
|
||||||
|
{
|
||||||
|
JSON_ASSERT(!ref_stack.empty());
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_object());
|
||||||
|
|
||||||
|
ref_stack.back()->set_parents();
|
||||||
|
ref_stack.pop_back();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_array(std::size_t len)
|
||||||
|
{
|
||||||
|
ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
|
||||||
|
{
|
||||||
|
JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool end_array()
|
||||||
|
{
|
||||||
|
JSON_ASSERT(!ref_stack.empty());
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_array());
|
||||||
|
|
||||||
|
ref_stack.back()->set_parents();
|
||||||
|
ref_stack.pop_back();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Exception>
|
||||||
|
bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,
|
||||||
|
const Exception& ex)
|
||||||
|
{
|
||||||
|
errored = true;
|
||||||
|
static_cast<void>(ex);
|
||||||
|
if (allow_exceptions)
|
||||||
|
{
|
||||||
|
JSON_THROW(ex);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool is_errored() const
|
||||||
|
{
|
||||||
|
return errored;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*!
|
||||||
|
@invariant If the ref stack is empty, then the passed value will be the new
|
||||||
|
root.
|
||||||
|
@invariant If the ref stack contains a value, then it is an array or an
|
||||||
|
object to which we can add elements
|
||||||
|
*/
|
||||||
|
template<typename Value>
|
||||||
|
JSON_HEDLEY_RETURNS_NON_NULL
|
||||||
|
BasicJsonType* handle_value(Value&& v)
|
||||||
|
{
|
||||||
|
if (ref_stack.empty())
|
||||||
|
{
|
||||||
|
root = BasicJsonType(std::forward<Value>(v));
|
||||||
|
return &root;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
|
||||||
|
|
||||||
|
if (ref_stack.back()->is_array())
|
||||||
|
{
|
||||||
|
ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
|
||||||
|
return &(ref_stack.back()->m_data.m_value.array->back());
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_object());
|
||||||
|
JSON_ASSERT(object_element);
|
||||||
|
*object_element = BasicJsonType(std::forward<Value>(v));
|
||||||
|
return object_element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// the parsed JSON value
|
||||||
|
BasicJsonType& root;
|
||||||
|
/// stack to model hierarchy of values
|
||||||
|
std::vector<BasicJsonType*> ref_stack {};
|
||||||
|
/// helper to hold the reference for the next object element
|
||||||
|
BasicJsonType* object_element = nullptr;
|
||||||
|
/// whether a syntax error occurred
|
||||||
|
bool errored = false;
|
||||||
|
/// whether to throw exceptions in case of errors
|
||||||
|
const bool allow_exceptions = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
class json_sax_dom_callback_parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
using binary_t = typename BasicJsonType::binary_t;
|
||||||
|
using parser_callback_t = typename BasicJsonType::parser_callback_t;
|
||||||
|
using parse_event_t = typename BasicJsonType::parse_event_t;
|
||||||
|
|
||||||
|
json_sax_dom_callback_parser(BasicJsonType& r,
|
||||||
|
const parser_callback_t cb,
|
||||||
|
const bool allow_exceptions_ = true)
|
||||||
|
: root(r), callback(cb), allow_exceptions(allow_exceptions_)
|
||||||
|
{
|
||||||
|
keep_stack.push_back(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make class move-only
|
||||||
|
json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;
|
||||||
|
json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
|
||||||
|
json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;
|
||||||
|
json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
|
||||||
|
~json_sax_dom_callback_parser() = default;
|
||||||
|
|
||||||
|
bool null()
|
||||||
|
{
|
||||||
|
handle_value(nullptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool boolean(bool val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_integer(number_integer_t val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_unsigned(number_unsigned_t val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_float(number_float_t val, const string_t& /*unused*/)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool string(string_t& val)
|
||||||
|
{
|
||||||
|
handle_value(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool binary(binary_t& val)
|
||||||
|
{
|
||||||
|
handle_value(std::move(val));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_object(std::size_t len)
|
||||||
|
{
|
||||||
|
// check callback for object start
|
||||||
|
const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);
|
||||||
|
keep_stack.push_back(keep);
|
||||||
|
|
||||||
|
auto val = handle_value(BasicJsonType::value_t::object, true);
|
||||||
|
ref_stack.push_back(val.second);
|
||||||
|
|
||||||
|
// check object limit
|
||||||
|
if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
|
||||||
|
{
|
||||||
|
JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool key(string_t& val)
|
||||||
|
{
|
||||||
|
BasicJsonType k = BasicJsonType(val);
|
||||||
|
|
||||||
|
// check callback for key
|
||||||
|
const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);
|
||||||
|
key_keep_stack.push_back(keep);
|
||||||
|
|
||||||
|
// add discarded value at given key and store the reference for later
|
||||||
|
if (keep && ref_stack.back())
|
||||||
|
{
|
||||||
|
object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool end_object()
|
||||||
|
{
|
||||||
|
if (ref_stack.back())
|
||||||
|
{
|
||||||
|
if (!callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))
|
||||||
|
{
|
||||||
|
// discard object
|
||||||
|
*ref_stack.back() = discarded;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ref_stack.back()->set_parents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(!ref_stack.empty());
|
||||||
|
JSON_ASSERT(!keep_stack.empty());
|
||||||
|
ref_stack.pop_back();
|
||||||
|
keep_stack.pop_back();
|
||||||
|
|
||||||
|
if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
|
||||||
|
{
|
||||||
|
// remove discarded value
|
||||||
|
for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->is_discarded())
|
||||||
|
{
|
||||||
|
ref_stack.back()->erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_array(std::size_t len)
|
||||||
|
{
|
||||||
|
const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);
|
||||||
|
keep_stack.push_back(keep);
|
||||||
|
|
||||||
|
auto val = handle_value(BasicJsonType::value_t::array, true);
|
||||||
|
ref_stack.push_back(val.second);
|
||||||
|
|
||||||
|
// check array limit
|
||||||
|
if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
|
||||||
|
{
|
||||||
|
JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool end_array()
|
||||||
|
{
|
||||||
|
bool keep = true;
|
||||||
|
|
||||||
|
if (ref_stack.back())
|
||||||
|
{
|
||||||
|
keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
|
||||||
|
if (keep)
|
||||||
|
{
|
||||||
|
ref_stack.back()->set_parents();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// discard array
|
||||||
|
*ref_stack.back() = discarded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(!ref_stack.empty());
|
||||||
|
JSON_ASSERT(!keep_stack.empty());
|
||||||
|
ref_stack.pop_back();
|
||||||
|
keep_stack.pop_back();
|
||||||
|
|
||||||
|
// remove discarded value
|
||||||
|
if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
|
||||||
|
{
|
||||||
|
ref_stack.back()->m_data.m_value.array->pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Exception>
|
||||||
|
bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,
|
||||||
|
const Exception& ex)
|
||||||
|
{
|
||||||
|
errored = true;
|
||||||
|
static_cast<void>(ex);
|
||||||
|
if (allow_exceptions)
|
||||||
|
{
|
||||||
|
JSON_THROW(ex);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool is_errored() const
|
||||||
|
{
|
||||||
|
return errored;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*!
|
||||||
|
@param[in] v value to add to the JSON value we build during parsing
|
||||||
|
@param[in] skip_callback whether we should skip calling the callback
|
||||||
|
function; this is required after start_array() and
|
||||||
|
start_object() SAX events, because otherwise we would call the
|
||||||
|
callback function with an empty array or object, respectively.
|
||||||
|
|
||||||
|
@invariant If the ref stack is empty, then the passed value will be the new
|
||||||
|
root.
|
||||||
|
@invariant If the ref stack contains a value, then it is an array or an
|
||||||
|
object to which we can add elements
|
||||||
|
|
||||||
|
@return pair of boolean (whether value should be kept) and pointer (to the
|
||||||
|
passed value in the ref_stack hierarchy; nullptr if not kept)
|
||||||
|
*/
|
||||||
|
template<typename Value>
|
||||||
|
std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)
|
||||||
|
{
|
||||||
|
JSON_ASSERT(!keep_stack.empty());
|
||||||
|
|
||||||
|
// do not handle this value if we know it would be added to a discarded
|
||||||
|
// container
|
||||||
|
if (!keep_stack.back())
|
||||||
|
{
|
||||||
|
return {false, nullptr};
|
||||||
|
}
|
||||||
|
|
||||||
|
// create value
|
||||||
|
auto value = BasicJsonType(std::forward<Value>(v));
|
||||||
|
|
||||||
|
// check callback
|
||||||
|
const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);
|
||||||
|
|
||||||
|
// do not handle this value if we just learnt it shall be discarded
|
||||||
|
if (!keep)
|
||||||
|
{
|
||||||
|
return {false, nullptr};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ref_stack.empty())
|
||||||
|
{
|
||||||
|
root = std::move(value);
|
||||||
|
return {true, & root};
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip this value if we already decided to skip the parent
|
||||||
|
// (https://github.com/nlohmann/json/issues/971#issuecomment-413678360)
|
||||||
|
if (!ref_stack.back())
|
||||||
|
{
|
||||||
|
return {false, nullptr};
|
||||||
|
}
|
||||||
|
|
||||||
|
// we now only expect arrays and objects
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
|
||||||
|
|
||||||
|
// array
|
||||||
|
if (ref_stack.back()->is_array())
|
||||||
|
{
|
||||||
|
ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
|
||||||
|
return {true, & (ref_stack.back()->m_data.m_value.array->back())};
|
||||||
|
}
|
||||||
|
|
||||||
|
// object
|
||||||
|
JSON_ASSERT(ref_stack.back()->is_object());
|
||||||
|
// check if we should store an element for the current key
|
||||||
|
JSON_ASSERT(!key_keep_stack.empty());
|
||||||
|
const bool store_element = key_keep_stack.back();
|
||||||
|
key_keep_stack.pop_back();
|
||||||
|
|
||||||
|
if (!store_element)
|
||||||
|
{
|
||||||
|
return {false, nullptr};
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(object_element);
|
||||||
|
*object_element = std::move(value);
|
||||||
|
return {true, object_element};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// the parsed JSON value
|
||||||
|
BasicJsonType& root;
|
||||||
|
/// stack to model hierarchy of values
|
||||||
|
std::vector<BasicJsonType*> ref_stack {};
|
||||||
|
/// stack to manage which values to keep
|
||||||
|
std::vector<bool> keep_stack {};
|
||||||
|
/// stack to manage which object keys to keep
|
||||||
|
std::vector<bool> key_keep_stack {};
|
||||||
|
/// helper to hold the reference for the next object element
|
||||||
|
BasicJsonType* object_element = nullptr;
|
||||||
|
/// whether a syntax error occurred
|
||||||
|
bool errored = false;
|
||||||
|
/// callback function
|
||||||
|
const parser_callback_t callback = nullptr;
|
||||||
|
/// whether to throw exceptions in case of errors
|
||||||
|
const bool allow_exceptions = true;
|
||||||
|
/// a discarded value for the callback
|
||||||
|
BasicJsonType discarded = BasicJsonType::value_t::discarded;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
class json_sax_acceptor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
using binary_t = typename BasicJsonType::binary_t;
|
||||||
|
|
||||||
|
bool null()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool boolean(bool /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_integer(number_integer_t /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_unsigned(number_unsigned_t /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool number_float(number_float_t /*unused*/, const string_t& /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool string(string_t& /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool binary(binary_t& /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_object(std::size_t /*unused*/ = static_cast<std::size_t>(-1))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool key(string_t& /*unused*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool end_object()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool start_array(std::size_t /*unused*/ = static_cast<std::size_t>(-1))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool end_array()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
1633
chargingstation-aiter/include/nlohmann/detail/input/lexer.hpp
Normal file
1633
chargingstation-aiter/include/nlohmann/detail/input/lexer.hpp
Normal file
File diff suppressed because it is too large
Load Diff
519
chargingstation-aiter/include/nlohmann/detail/input/parser.hpp
Normal file
519
chargingstation-aiter/include/nlohmann/detail/input/parser.hpp
Normal file
@ -0,0 +1,519 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cmath> // isfinite
|
||||||
|
#include <cstdint> // uint8_t
|
||||||
|
#include <functional> // function
|
||||||
|
#include <string> // string
|
||||||
|
#include <utility> // move
|
||||||
|
#include <vector> // vector
|
||||||
|
|
||||||
|
#include <nlohmann/detail/exceptions.hpp>
|
||||||
|
#include <nlohmann/detail/input/input_adapters.hpp>
|
||||||
|
#include <nlohmann/detail/input/json_sax.hpp>
|
||||||
|
#include <nlohmann/detail/input/lexer.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/meta/is_sax.hpp>
|
||||||
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
////////////
|
||||||
|
// parser //
|
||||||
|
////////////
|
||||||
|
|
||||||
|
enum class parse_event_t : std::uint8_t
|
||||||
|
{
|
||||||
|
/// the parser read `{` and started to process a JSON object
|
||||||
|
object_start,
|
||||||
|
/// the parser read `}` and finished processing a JSON object
|
||||||
|
object_end,
|
||||||
|
/// the parser read `[` and started to process a JSON array
|
||||||
|
array_start,
|
||||||
|
/// the parser read `]` and finished processing a JSON array
|
||||||
|
array_end,
|
||||||
|
/// the parser read a key of a value in an object
|
||||||
|
key,
|
||||||
|
/// the parser finished reading a JSON value
|
||||||
|
value
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
using parser_callback_t =
|
||||||
|
std::function<bool(int /*depth*/, parse_event_t /*event*/, BasicJsonType& /*parsed*/)>;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief syntax analysis
|
||||||
|
|
||||||
|
This class implements a recursive descent parser.
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType, typename InputAdapterType>
|
||||||
|
class parser
|
||||||
|
{
|
||||||
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
using lexer_t = lexer<BasicJsonType, InputAdapterType>;
|
||||||
|
using token_type = typename lexer_t::token_type;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// a parser reading from an input adapter
|
||||||
|
explicit parser(InputAdapterType&& adapter,
|
||||||
|
const parser_callback_t<BasicJsonType> cb = nullptr,
|
||||||
|
const bool allow_exceptions_ = true,
|
||||||
|
const bool skip_comments = false)
|
||||||
|
: callback(cb)
|
||||||
|
, m_lexer(std::move(adapter), skip_comments)
|
||||||
|
, allow_exceptions(allow_exceptions_)
|
||||||
|
{
|
||||||
|
// read first token
|
||||||
|
get_token();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief public parser interface
|
||||||
|
|
||||||
|
@param[in] strict whether to expect the last token to be EOF
|
||||||
|
@param[in,out] result parsed JSON value
|
||||||
|
|
||||||
|
@throw parse_error.101 in case of an unexpected token
|
||||||
|
@throw parse_error.102 if to_unicode fails or surrogate error
|
||||||
|
@throw parse_error.103 if to_unicode fails
|
||||||
|
*/
|
||||||
|
void parse(const bool strict, BasicJsonType& result)
|
||||||
|
{
|
||||||
|
if (callback)
|
||||||
|
{
|
||||||
|
json_sax_dom_callback_parser<BasicJsonType> sdp(result, callback, allow_exceptions);
|
||||||
|
sax_parse_internal(&sdp);
|
||||||
|
|
||||||
|
// in strict mode, input must be completely read
|
||||||
|
if (strict && (get_token() != token_type::end_of_input))
|
||||||
|
{
|
||||||
|
sdp.parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(),
|
||||||
|
exception_message(token_type::end_of_input, "value"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// in case of an error, return discarded value
|
||||||
|
if (sdp.is_errored())
|
||||||
|
{
|
||||||
|
result = value_t::discarded;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set top-level value to null if it was discarded by the callback
|
||||||
|
// function
|
||||||
|
if (result.is_discarded())
|
||||||
|
{
|
||||||
|
result = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
json_sax_dom_parser<BasicJsonType> sdp(result, allow_exceptions);
|
||||||
|
sax_parse_internal(&sdp);
|
||||||
|
|
||||||
|
// in strict mode, input must be completely read
|
||||||
|
if (strict && (get_token() != token_type::end_of_input))
|
||||||
|
{
|
||||||
|
sdp.parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// in case of an error, return discarded value
|
||||||
|
if (sdp.is_errored())
|
||||||
|
{
|
||||||
|
result = value_t::discarded;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.assert_invariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief public accept interface
|
||||||
|
|
||||||
|
@param[in] strict whether to expect the last token to be EOF
|
||||||
|
@return whether the input is a proper JSON text
|
||||||
|
*/
|
||||||
|
bool accept(const bool strict = true)
|
||||||
|
{
|
||||||
|
json_sax_acceptor<BasicJsonType> sax_acceptor;
|
||||||
|
return sax_parse(&sax_acceptor, strict);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename SAX>
|
||||||
|
JSON_HEDLEY_NON_NULL(2)
|
||||||
|
bool sax_parse(SAX* sax, const bool strict = true)
|
||||||
|
{
|
||||||
|
(void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};
|
||||||
|
const bool result = sax_parse_internal(sax);
|
||||||
|
|
||||||
|
// strict mode: next byte must be EOF
|
||||||
|
if (result && strict && (get_token() != token_type::end_of_input))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template<typename SAX>
|
||||||
|
JSON_HEDLEY_NON_NULL(2)
|
||||||
|
bool sax_parse_internal(SAX* sax)
|
||||||
|
{
|
||||||
|
// stack to remember the hierarchy of structured values we are parsing
|
||||||
|
// true = array; false = object
|
||||||
|
std::vector<bool> states;
|
||||||
|
// value to avoid a goto (see comment where set to true)
|
||||||
|
bool skip_to_state_evaluation = false;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (!skip_to_state_evaluation)
|
||||||
|
{
|
||||||
|
// invariant: get_token() was called before each iteration
|
||||||
|
switch (last_token)
|
||||||
|
{
|
||||||
|
case token_type::begin_object:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast<std::size_t>(-1))))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// closing } -> we are done
|
||||||
|
if (get_token() == token_type::end_object)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse key
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr));
|
||||||
|
}
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse separator (:)
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// remember we are now inside an object
|
||||||
|
states.push_back(false);
|
||||||
|
|
||||||
|
// parse values
|
||||||
|
get_token();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::begin_array:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast<std::size_t>(-1))))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// closing ] -> we are done
|
||||||
|
if (get_token() == token_type::end_array)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remember we are now inside an array
|
||||||
|
states.push_back(true);
|
||||||
|
|
||||||
|
// parse values (no need to call get_token)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::value_float:
|
||||||
|
{
|
||||||
|
const auto res = m_lexer.get_number_float();
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res)))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
out_of_range::create(406, concat("number overflow parsing '", m_lexer.get_token_string(), '\''), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string())))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::literal_false:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::literal_null:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->null()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::literal_true:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::value_integer:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer())))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::value_string:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string())))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::value_unsigned:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned())))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case token_type::parse_error:
|
||||||
|
{
|
||||||
|
// using "uninitialized" to avoid "expected" message
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), nullptr));
|
||||||
|
}
|
||||||
|
case token_type::end_of_input:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(m_lexer.get_position().chars_read_total == 1))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(),
|
||||||
|
"attempting to parse an empty input; check that your input string or stream contains the expected JSON", nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr));
|
||||||
|
}
|
||||||
|
case token_type::uninitialized:
|
||||||
|
case token_type::end_array:
|
||||||
|
case token_type::end_object:
|
||||||
|
case token_type::name_separator:
|
||||||
|
case token_type::value_separator:
|
||||||
|
case token_type::literal_or_value:
|
||||||
|
default: // the last token was unexpected
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
skip_to_state_evaluation = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we reached this line after we successfully parsed a value
|
||||||
|
if (states.empty())
|
||||||
|
{
|
||||||
|
// empty stack: we reached the end of the hierarchy: done
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (states.back()) // array
|
||||||
|
{
|
||||||
|
// comma -> next value
|
||||||
|
if (get_token() == token_type::value_separator)
|
||||||
|
{
|
||||||
|
// parse a new value
|
||||||
|
get_token();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// closing ]
|
||||||
|
if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array))
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are done with this array. Before we can parse a
|
||||||
|
// new value, we need to evaluate the new state first.
|
||||||
|
// By setting skip_to_state_evaluation to false, we
|
||||||
|
// are effectively jumping to the beginning of this if.
|
||||||
|
JSON_ASSERT(!states.empty());
|
||||||
|
states.pop_back();
|
||||||
|
skip_to_state_evaluation = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// states.back() is false -> object
|
||||||
|
|
||||||
|
// comma -> next value
|
||||||
|
if (get_token() == token_type::value_separator)
|
||||||
|
{
|
||||||
|
// parse key
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse separator (:)
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))
|
||||||
|
{
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse values
|
||||||
|
get_token();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// closing }
|
||||||
|
if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object))
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are done with this object. Before we can parse a
|
||||||
|
// new value, we need to evaluate the new state first.
|
||||||
|
// By setting skip_to_state_evaluation to false, we
|
||||||
|
// are effectively jumping to the beginning of this if.
|
||||||
|
JSON_ASSERT(!states.empty());
|
||||||
|
states.pop_back();
|
||||||
|
skip_to_state_evaluation = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sax->parse_error(m_lexer.get_position(),
|
||||||
|
m_lexer.get_token_string(),
|
||||||
|
parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), nullptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// get next token from lexer
|
||||||
|
token_type get_token()
|
||||||
|
{
|
||||||
|
return last_token = m_lexer.scan();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string exception_message(const token_type expected, const std::string& context)
|
||||||
|
{
|
||||||
|
std::string error_msg = "syntax error ";
|
||||||
|
|
||||||
|
if (!context.empty())
|
||||||
|
{
|
||||||
|
error_msg += concat("while parsing ", context, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
error_msg += "- ";
|
||||||
|
|
||||||
|
if (last_token == token_type::parse_error)
|
||||||
|
{
|
||||||
|
error_msg += concat(m_lexer.get_error_message(), "; last read: '",
|
||||||
|
m_lexer.get_token_string(), '\'');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error_msg += concat("unexpected ", lexer_t::token_type_name(last_token));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expected != token_type::uninitialized)
|
||||||
|
{
|
||||||
|
error_msg += concat("; expected ", lexer_t::token_type_name(expected));
|
||||||
|
}
|
||||||
|
|
||||||
|
return error_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// callback function
|
||||||
|
const parser_callback_t<BasicJsonType> callback = nullptr;
|
||||||
|
/// the type of the last read token
|
||||||
|
token_type last_token = token_type::uninitialized;
|
||||||
|
/// the lexer
|
||||||
|
lexer_t m_lexer;
|
||||||
|
/// whether to throw exceptions in case of errors
|
||||||
|
const bool allow_exceptions = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,37 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef> // size_t
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
/// struct to capture the start position of the current token
|
||||||
|
struct position_t
|
||||||
|
{
|
||||||
|
/// the total number of characters read
|
||||||
|
std::size_t chars_read_total = 0;
|
||||||
|
/// the number of characters read in the current line
|
||||||
|
std::size_t chars_read_current_line = 0;
|
||||||
|
/// the number of lines read
|
||||||
|
std::size_t lines_read = 0;
|
||||||
|
|
||||||
|
/// conversion to size_t to preserve SAX interface
|
||||||
|
constexpr operator size_t() const
|
||||||
|
{
|
||||||
|
return chars_read_total;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,35 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
#include <nlohmann/detail/iterators/primitive_iterator.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief an iterator value
|
||||||
|
|
||||||
|
@note This structure could easily be a union, but MSVC currently does not allow
|
||||||
|
unions members with complex constructors, see https://github.com/nlohmann/json/pull/105.
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType> struct internal_iterator
|
||||||
|
{
|
||||||
|
/// iterator for JSON objects
|
||||||
|
typename BasicJsonType::object_t::iterator object_iterator {};
|
||||||
|
/// iterator for JSON arrays
|
||||||
|
typename BasicJsonType::array_t::iterator array_iterator {};
|
||||||
|
/// generic iterator for all other types
|
||||||
|
primitive_iterator_t primitive_iterator {};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,751 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next
|
||||||
|
#include <type_traits> // conditional, is_const, remove_const
|
||||||
|
|
||||||
|
#include <nlohmann/detail/exceptions.hpp>
|
||||||
|
#include <nlohmann/detail/iterators/internal_iterator.hpp>
|
||||||
|
#include <nlohmann/detail/iterators/primitive_iterator.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
// forward declare, to be able to friend it later on
|
||||||
|
template<typename IteratorType> class iteration_proxy;
|
||||||
|
template<typename IteratorType> class iteration_proxy_value;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a template for a bidirectional iterator for the @ref basic_json class
|
||||||
|
This class implements a both iterators (iterator and const_iterator) for the
|
||||||
|
@ref basic_json class.
|
||||||
|
@note An iterator is called *initialized* when a pointer to a JSON value has
|
||||||
|
been set (e.g., by a constructor or a copy assignment). If the iterator is
|
||||||
|
default-constructed, it is *uninitialized* and most methods are undefined.
|
||||||
|
**The library uses assertions to detect calls on uninitialized iterators.**
|
||||||
|
@requirement The class satisfies the following concept requirements:
|
||||||
|
-
|
||||||
|
[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):
|
||||||
|
The iterator that can be moved can be moved in both directions (i.e.
|
||||||
|
incremented and decremented).
|
||||||
|
@since version 1.0.0, simplified in version 2.0.9, change to bidirectional
|
||||||
|
iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593)
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)
|
||||||
|
{
|
||||||
|
/// the iterator with BasicJsonType of different const-ness
|
||||||
|
using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;
|
||||||
|
/// allow basic_json to access private members
|
||||||
|
friend other_iter_impl;
|
||||||
|
friend BasicJsonType;
|
||||||
|
friend iteration_proxy<iter_impl>;
|
||||||
|
friend iteration_proxy_value<iter_impl>;
|
||||||
|
|
||||||
|
using object_t = typename BasicJsonType::object_t;
|
||||||
|
using array_t = typename BasicJsonType::array_t;
|
||||||
|
// make sure BasicJsonType is basic_json or const basic_json
|
||||||
|
static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value,
|
||||||
|
"iter_impl only accepts (const) basic_json");
|
||||||
|
// superficial check for the LegacyBidirectionalIterator named requirement
|
||||||
|
static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value
|
||||||
|
&& std::is_base_of<std::bidirectional_iterator_tag, typename std::iterator_traits<typename array_t::iterator>::iterator_category>::value,
|
||||||
|
"basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement.");
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17.
|
||||||
|
/// The C++ Standard has never required user-defined iterators to derive from std::iterator.
|
||||||
|
/// A user-defined iterator should provide publicly accessible typedefs named
|
||||||
|
/// iterator_category, value_type, difference_type, pointer, and reference.
|
||||||
|
/// Note that value_type is required to be non-const, even for constant iterators.
|
||||||
|
using iterator_category = std::bidirectional_iterator_tag;
|
||||||
|
|
||||||
|
/// the type of the values when the iterator is dereferenced
|
||||||
|
using value_type = typename BasicJsonType::value_type;
|
||||||
|
/// a type to represent differences between iterators
|
||||||
|
using difference_type = typename BasicJsonType::difference_type;
|
||||||
|
/// defines a pointer to the type iterated over (value_type)
|
||||||
|
using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,
|
||||||
|
typename BasicJsonType::const_pointer,
|
||||||
|
typename BasicJsonType::pointer>::type;
|
||||||
|
/// defines a reference to the type iterated over (value_type)
|
||||||
|
using reference =
|
||||||
|
typename std::conditional<std::is_const<BasicJsonType>::value,
|
||||||
|
typename BasicJsonType::const_reference,
|
||||||
|
typename BasicJsonType::reference>::type;
|
||||||
|
|
||||||
|
iter_impl() = default;
|
||||||
|
~iter_impl() = default;
|
||||||
|
iter_impl(iter_impl&&) noexcept = default;
|
||||||
|
iter_impl& operator=(iter_impl&&) noexcept = default;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief constructor for a given JSON instance
|
||||||
|
@param[in] object pointer to a JSON object for this iterator
|
||||||
|
@pre object != nullptr
|
||||||
|
@post The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
explicit iter_impl(pointer object) noexcept : m_object(object)
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
m_it.object_iterator = typename object_t::iterator();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
m_it.array_iterator = typename array_t::iterator();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
m_it.primitive_iterator = primitive_iterator_t();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@note The conventional copy constructor and copy assignment are implicitly
|
||||||
|
defined. Combined with the following converting constructor and
|
||||||
|
assignment, they support: (1) copy from iterator to iterator, (2)
|
||||||
|
copy from const iterator to const iterator, and (3) conversion from
|
||||||
|
iterator to const iterator. However conversion from const iterator
|
||||||
|
to iterator is not defined.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief const copy constructor
|
||||||
|
@param[in] other const iterator to copy from
|
||||||
|
@note This copy constructor had to be defined explicitly to circumvent a bug
|
||||||
|
occurring on msvc v19.0 compiler (VS 2015) debug build. For more
|
||||||
|
information refer to: https://github.com/nlohmann/json/issues/1608
|
||||||
|
*/
|
||||||
|
iter_impl(const iter_impl<const BasicJsonType>& other) noexcept
|
||||||
|
: m_object(other.m_object), m_it(other.m_it)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief converting assignment
|
||||||
|
@param[in] other const iterator to copy from
|
||||||
|
@return const/non-const iterator
|
||||||
|
@note It is not checked whether @a other is initialized.
|
||||||
|
*/
|
||||||
|
iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept
|
||||||
|
{
|
||||||
|
if (&other != this)
|
||||||
|
{
|
||||||
|
m_object = other.m_object;
|
||||||
|
m_it = other.m_it;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief converting constructor
|
||||||
|
@param[in] other non-const iterator to copy from
|
||||||
|
@note It is not checked whether @a other is initialized.
|
||||||
|
*/
|
||||||
|
iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept
|
||||||
|
: m_object(other.m_object), m_it(other.m_it)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief converting assignment
|
||||||
|
@param[in] other non-const iterator to copy from
|
||||||
|
@return const/non-const iterator
|
||||||
|
@note It is not checked whether @a other is initialized.
|
||||||
|
*/
|
||||||
|
iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept // NOLINT(cert-oop54-cpp)
|
||||||
|
{
|
||||||
|
m_object = other.m_object;
|
||||||
|
m_it = other.m_it;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_PRIVATE_UNLESS_TESTED:
|
||||||
|
/*!
|
||||||
|
@brief set the iterator to the first value
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
void set_begin() noexcept
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
m_it.object_iterator = m_object->m_data.m_value.object->begin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
m_it.array_iterator = m_object->m_data.m_value.array->begin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
{
|
||||||
|
// set to end so begin()==end() is true: null is empty
|
||||||
|
m_it.primitive_iterator.set_end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
m_it.primitive_iterator.set_begin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief set the iterator past the last value
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
void set_end() noexcept
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
m_it.object_iterator = m_object->m_data.m_value.object->end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
m_it.array_iterator = m_object->m_data.m_value.array->end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
m_it.primitive_iterator.set_end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*!
|
||||||
|
@brief return a reference to the value pointed to by the iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
reference operator*() const
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
|
||||||
|
return m_it.object_iterator->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
|
||||||
|
return *m_it.array_iterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
|
||||||
|
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
|
||||||
|
{
|
||||||
|
return *m_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief dereference the iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
pointer operator->() const
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
|
||||||
|
return &(m_it.object_iterator->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
|
||||||
|
return &*m_it.array_iterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
|
||||||
|
{
|
||||||
|
return m_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief post-increment (it++)
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl operator++(int)& // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
++(*this);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief pre-increment (++it)
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl& operator++()
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
std::advance(m_it.object_iterator, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
std::advance(m_it.array_iterator, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
++m_it.primitive_iterator;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief post-decrement (it--)
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl operator--(int)& // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
--(*this);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief pre-decrement (--it)
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl& operator--()
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
{
|
||||||
|
std::advance(m_it.object_iterator, -1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
std::advance(m_it.array_iterator, -1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
--m_it.primitive_iterator;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief comparison: equal
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
|
||||||
|
bool operator==(const IterImpl& other) const
|
||||||
|
{
|
||||||
|
// if objects are not the same, the comparison is undefined
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
|
||||||
|
{
|
||||||
|
JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
return (m_it.object_iterator == other.m_it.object_iterator);
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
return (m_it.array_iterator == other.m_it.array_iterator);
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief comparison: not equal
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
|
||||||
|
bool operator!=(const IterImpl& other) const
|
||||||
|
{
|
||||||
|
return !operator==(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief comparison: smaller
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
bool operator<(const iter_impl& other) const
|
||||||
|
{
|
||||||
|
// if objects are not the same, the comparison is undefined
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
|
||||||
|
{
|
||||||
|
JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", m_object));
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
return (m_it.array_iterator < other.m_it.array_iterator);
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
return (m_it.primitive_iterator < other.m_it.primitive_iterator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief comparison: less than or equal
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
bool operator<=(const iter_impl& other) const
|
||||||
|
{
|
||||||
|
return !other.operator < (*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief comparison: greater than
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
bool operator>(const iter_impl& other) const
|
||||||
|
{
|
||||||
|
return !operator<=(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief comparison: greater than or equal
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
bool operator>=(const iter_impl& other) const
|
||||||
|
{
|
||||||
|
return !operator<(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief add to iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl& operator+=(difference_type i)
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
std::advance(m_it.array_iterator, i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
m_it.primitive_iterator += i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief subtract from iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl& operator-=(difference_type i)
|
||||||
|
{
|
||||||
|
return operator+=(-i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief add to iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl operator+(difference_type i) const
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
result += i;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief addition of distance and iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
friend iter_impl operator+(difference_type i, const iter_impl& it)
|
||||||
|
{
|
||||||
|
auto result = it;
|
||||||
|
result += i;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief subtract from iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
iter_impl operator-(difference_type i) const
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
result -= i;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief return difference
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
difference_type operator-(const iter_impl& other) const
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
return m_it.array_iterator - other.m_it.array_iterator;
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
return m_it.primitive_iterator - other.m_it.primitive_iterator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief access to successor
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
reference operator[](difference_type n) const
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
switch (m_object->m_data.m_type)
|
||||||
|
{
|
||||||
|
case value_t::object:
|
||||||
|
JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", m_object));
|
||||||
|
|
||||||
|
case value_t::array:
|
||||||
|
return *std::next(m_it.array_iterator, n);
|
||||||
|
|
||||||
|
case value_t::null:
|
||||||
|
JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
|
||||||
|
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))
|
||||||
|
{
|
||||||
|
return *m_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief return the key of an object iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
const typename object_t::key_type& key() const
|
||||||
|
{
|
||||||
|
JSON_ASSERT(m_object != nullptr);
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_LIKELY(m_object->is_object()))
|
||||||
|
{
|
||||||
|
return m_it.object_iterator->first;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", m_object));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief return the value of an iterator
|
||||||
|
@pre The iterator is initialized; i.e. `m_object != nullptr`.
|
||||||
|
*/
|
||||||
|
reference value() const
|
||||||
|
{
|
||||||
|
return operator*();
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_PRIVATE_UNLESS_TESTED:
|
||||||
|
/// associated JSON instance
|
||||||
|
pointer m_object = nullptr;
|
||||||
|
/// the actual iterator of the associated instance
|
||||||
|
internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,242 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef> // size_t
|
||||||
|
#include <iterator> // input_iterator_tag
|
||||||
|
#include <string> // string, to_string
|
||||||
|
#include <tuple> // tuple_size, get, tuple_element
|
||||||
|
#include <utility> // move
|
||||||
|
|
||||||
|
#if JSON_HAS_RANGES
|
||||||
|
#include <ranges> // enable_borrowed_range
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<typename string_type>
|
||||||
|
void int_to_string( string_type& target, std::size_t value )
|
||||||
|
{
|
||||||
|
// For ADL
|
||||||
|
using std::to_string;
|
||||||
|
target = to_string(value);
|
||||||
|
}
|
||||||
|
template<typename IteratorType> class iteration_proxy_value
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
using value_type = iteration_proxy_value;
|
||||||
|
using pointer = value_type *;
|
||||||
|
using reference = value_type &;
|
||||||
|
using iterator_category = std::input_iterator_tag;
|
||||||
|
using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// the iterator
|
||||||
|
IteratorType anchor{};
|
||||||
|
/// an index for arrays (used to create key names)
|
||||||
|
std::size_t array_index = 0;
|
||||||
|
/// last stringified array index
|
||||||
|
mutable std::size_t array_index_last = 0;
|
||||||
|
/// a string representation of the array index
|
||||||
|
mutable string_type array_index_str = "0";
|
||||||
|
/// an empty string (to return a reference for primitive values)
|
||||||
|
string_type empty_str{};
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit iteration_proxy_value() = default;
|
||||||
|
explicit iteration_proxy_value(IteratorType it, std::size_t array_index_ = 0)
|
||||||
|
noexcept(std::is_nothrow_move_constructible<IteratorType>::value
|
||||||
|
&& std::is_nothrow_default_constructible<string_type>::value)
|
||||||
|
: anchor(std::move(it))
|
||||||
|
, array_index(array_index_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
iteration_proxy_value(iteration_proxy_value const&) = default;
|
||||||
|
iteration_proxy_value& operator=(iteration_proxy_value const&) = default;
|
||||||
|
// older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions
|
||||||
|
iteration_proxy_value(iteration_proxy_value&&)
|
||||||
|
noexcept(std::is_nothrow_move_constructible<IteratorType>::value
|
||||||
|
&& std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
|
||||||
|
iteration_proxy_value& operator=(iteration_proxy_value&&)
|
||||||
|
noexcept(std::is_nothrow_move_assignable<IteratorType>::value
|
||||||
|
&& std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
|
||||||
|
~iteration_proxy_value() = default;
|
||||||
|
|
||||||
|
/// dereference operator (needed for range-based for)
|
||||||
|
const iteration_proxy_value& operator*() const
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// increment operator (needed for range-based for)
|
||||||
|
iteration_proxy_value& operator++()
|
||||||
|
{
|
||||||
|
++anchor;
|
||||||
|
++array_index;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
iteration_proxy_value operator++(int)& // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
auto tmp = iteration_proxy_value(anchor, array_index);
|
||||||
|
++anchor;
|
||||||
|
++array_index;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// equality operator (needed for InputIterator)
|
||||||
|
bool operator==(const iteration_proxy_value& o) const
|
||||||
|
{
|
||||||
|
return anchor == o.anchor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// inequality operator (needed for range-based for)
|
||||||
|
bool operator!=(const iteration_proxy_value& o) const
|
||||||
|
{
|
||||||
|
return anchor != o.anchor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return key of the iterator
|
||||||
|
const string_type& key() const
|
||||||
|
{
|
||||||
|
JSON_ASSERT(anchor.m_object != nullptr);
|
||||||
|
|
||||||
|
switch (anchor.m_object->type())
|
||||||
|
{
|
||||||
|
// use integer array index as key
|
||||||
|
case value_t::array:
|
||||||
|
{
|
||||||
|
if (array_index != array_index_last)
|
||||||
|
{
|
||||||
|
int_to_string( array_index_str, array_index );
|
||||||
|
array_index_last = array_index;
|
||||||
|
}
|
||||||
|
return array_index_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// use key from the object
|
||||||
|
case value_t::object:
|
||||||
|
return anchor.key();
|
||||||
|
|
||||||
|
// use an empty key for all primitive types
|
||||||
|
case value_t::null:
|
||||||
|
case value_t::string:
|
||||||
|
case value_t::boolean:
|
||||||
|
case value_t::number_integer:
|
||||||
|
case value_t::number_unsigned:
|
||||||
|
case value_t::number_float:
|
||||||
|
case value_t::binary:
|
||||||
|
case value_t::discarded:
|
||||||
|
default:
|
||||||
|
return empty_str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return value of the iterator
|
||||||
|
typename IteratorType::reference value() const
|
||||||
|
{
|
||||||
|
return anchor.value();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// proxy class for the items() function
|
||||||
|
template<typename IteratorType> class iteration_proxy
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/// the container to iterate
|
||||||
|
typename IteratorType::pointer container = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit iteration_proxy() = default;
|
||||||
|
|
||||||
|
/// construct iteration proxy from a container
|
||||||
|
explicit iteration_proxy(typename IteratorType::reference cont) noexcept
|
||||||
|
: container(&cont) {}
|
||||||
|
|
||||||
|
iteration_proxy(iteration_proxy const&) = default;
|
||||||
|
iteration_proxy& operator=(iteration_proxy const&) = default;
|
||||||
|
iteration_proxy(iteration_proxy&&) noexcept = default;
|
||||||
|
iteration_proxy& operator=(iteration_proxy&&) noexcept = default;
|
||||||
|
~iteration_proxy() = default;
|
||||||
|
|
||||||
|
/// return iterator begin (needed for range-based for)
|
||||||
|
iteration_proxy_value<IteratorType> begin() const noexcept
|
||||||
|
{
|
||||||
|
return iteration_proxy_value<IteratorType>(container->begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return iterator end (needed for range-based for)
|
||||||
|
iteration_proxy_value<IteratorType> end() const noexcept
|
||||||
|
{
|
||||||
|
return iteration_proxy_value<IteratorType>(container->end());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Structured Bindings Support
|
||||||
|
// For further reference see https://blog.tartanllama.xyz/structured-bindings/
|
||||||
|
// And see https://github.com/nlohmann/json/pull/1391
|
||||||
|
template<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0>
|
||||||
|
auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key())
|
||||||
|
{
|
||||||
|
return i.key();
|
||||||
|
}
|
||||||
|
// Structured Bindings Support
|
||||||
|
// For further reference see https://blog.tartanllama.xyz/structured-bindings/
|
||||||
|
// And see https://github.com/nlohmann/json/pull/1391
|
||||||
|
template<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0>
|
||||||
|
auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value())
|
||||||
|
{
|
||||||
|
return i.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
||||||
|
// The Addition to the STD Namespace is required to add
|
||||||
|
// Structured Bindings Support to the iteration_proxy_value class
|
||||||
|
// For further reference see https://blog.tartanllama.xyz/structured-bindings/
|
||||||
|
// And see https://github.com/nlohmann/json/pull/1391
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
|
||||||
|
#if defined(__clang__)
|
||||||
|
// Fix: https://github.com/nlohmann/json/issues/1401
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wmismatched-tags"
|
||||||
|
#endif
|
||||||
|
template<typename IteratorType>
|
||||||
|
class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>> // NOLINT(cert-dcl58-cpp)
|
||||||
|
: public std::integral_constant<std::size_t, 2> {};
|
||||||
|
|
||||||
|
template<std::size_t N, typename IteratorType>
|
||||||
|
class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >> // NOLINT(cert-dcl58-cpp)
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using type = decltype(
|
||||||
|
get<N>(std::declval <
|
||||||
|
::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));
|
||||||
|
};
|
||||||
|
#if defined(__clang__)
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
#if JSON_HAS_RANGES
|
||||||
|
template <typename IteratorType>
|
||||||
|
inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy<IteratorType>> = true;
|
||||||
|
#endif
|
@ -0,0 +1,61 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iterator> // random_access_iterator_tag
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
#include <nlohmann/detail/meta/void_t.hpp>
|
||||||
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<typename It, typename = void>
|
||||||
|
struct iterator_types {};
|
||||||
|
|
||||||
|
template<typename It>
|
||||||
|
struct iterator_types <
|
||||||
|
It,
|
||||||
|
void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
|
||||||
|
typename It::reference, typename It::iterator_category >>
|
||||||
|
{
|
||||||
|
using difference_type = typename It::difference_type;
|
||||||
|
using value_type = typename It::value_type;
|
||||||
|
using pointer = typename It::pointer;
|
||||||
|
using reference = typename It::reference;
|
||||||
|
using iterator_category = typename It::iterator_category;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is required as some compilers implement std::iterator_traits in a way that
|
||||||
|
// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.
|
||||||
|
template<typename T, typename = void>
|
||||||
|
struct iterator_traits
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
|
||||||
|
: iterator_types<T>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
|
||||||
|
{
|
||||||
|
using iterator_category = std::random_access_iterator_tag;
|
||||||
|
using value_type = T;
|
||||||
|
using difference_type = ptrdiff_t;
|
||||||
|
using pointer = T*;
|
||||||
|
using reference = T&;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,130 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef> // ptrdiff_t
|
||||||
|
#include <iterator> // reverse_iterator
|
||||||
|
#include <utility> // declval
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
//////////////////////
|
||||||
|
// reverse_iterator //
|
||||||
|
//////////////////////
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a template for a reverse iterator class
|
||||||
|
|
||||||
|
@tparam Base the base iterator type to reverse. Valid types are @ref
|
||||||
|
iterator (to create @ref reverse_iterator) and @ref const_iterator (to
|
||||||
|
create @ref const_reverse_iterator).
|
||||||
|
|
||||||
|
@requirement The class satisfies the following concept requirements:
|
||||||
|
-
|
||||||
|
[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):
|
||||||
|
The iterator that can be moved can be moved in both directions (i.e.
|
||||||
|
incremented and decremented).
|
||||||
|
- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator):
|
||||||
|
It is possible to write to the pointed-to element (only if @a Base is
|
||||||
|
@ref iterator).
|
||||||
|
|
||||||
|
@since version 1.0.0
|
||||||
|
*/
|
||||||
|
template<typename Base>
|
||||||
|
class json_reverse_iterator : public std::reverse_iterator<Base>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
/// shortcut to the reverse iterator adapter
|
||||||
|
using base_iterator = std::reverse_iterator<Base>;
|
||||||
|
/// the reference type for the pointed-to element
|
||||||
|
using reference = typename Base::reference;
|
||||||
|
|
||||||
|
/// create reverse iterator from iterator
|
||||||
|
explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
|
||||||
|
: base_iterator(it) {}
|
||||||
|
|
||||||
|
/// create reverse iterator from base class
|
||||||
|
explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
|
||||||
|
|
||||||
|
/// post-increment (it++)
|
||||||
|
json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// pre-increment (++it)
|
||||||
|
json_reverse_iterator& operator++()
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator&>(base_iterator::operator++());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// post-decrement (it--)
|
||||||
|
json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// pre-decrement (--it)
|
||||||
|
json_reverse_iterator& operator--()
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator&>(base_iterator::operator--());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// add to iterator
|
||||||
|
json_reverse_iterator& operator+=(difference_type i)
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// add to iterator
|
||||||
|
json_reverse_iterator operator+(difference_type i) const
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// subtract from iterator
|
||||||
|
json_reverse_iterator operator-(difference_type i) const
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return difference
|
||||||
|
difference_type operator-(const json_reverse_iterator& other) const
|
||||||
|
{
|
||||||
|
return base_iterator(*this) - base_iterator(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// access to successor
|
||||||
|
reference operator[](difference_type n) const
|
||||||
|
{
|
||||||
|
return *(this->operator+(n));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the key of an object iterator
|
||||||
|
auto key() const -> decltype(std::declval<Base>().key())
|
||||||
|
{
|
||||||
|
auto it = --this->base();
|
||||||
|
return it.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the value of an iterator
|
||||||
|
reference value() const
|
||||||
|
{
|
||||||
|
auto it = --this->base();
|
||||||
|
return it.operator * ();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,132 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef> // ptrdiff_t
|
||||||
|
#include <limits> // numeric_limits
|
||||||
|
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
@brief an iterator for primitive JSON types
|
||||||
|
|
||||||
|
This class models an iterator for primitive JSON types (boolean, number,
|
||||||
|
string). It's only purpose is to allow the iterator/const_iterator classes
|
||||||
|
to "iterate" over primitive values. Internally, the iterator is modeled by
|
||||||
|
a `difference_type` variable. Value begin_value (`0`) models the begin,
|
||||||
|
end_value (`1`) models past the end.
|
||||||
|
*/
|
||||||
|
class primitive_iterator_t
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
static constexpr difference_type begin_value = 0;
|
||||||
|
static constexpr difference_type end_value = begin_value + 1;
|
||||||
|
|
||||||
|
JSON_PRIVATE_UNLESS_TESTED:
|
||||||
|
/// iterator as signed integer type
|
||||||
|
difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
|
||||||
|
|
||||||
|
public:
|
||||||
|
constexpr difference_type get_value() const noexcept
|
||||||
|
{
|
||||||
|
return m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// set iterator to a defined beginning
|
||||||
|
void set_begin() noexcept
|
||||||
|
{
|
||||||
|
m_it = begin_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// set iterator to a defined past the end
|
||||||
|
void set_end() noexcept
|
||||||
|
{
|
||||||
|
m_it = end_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return whether the iterator can be dereferenced
|
||||||
|
constexpr bool is_begin() const noexcept
|
||||||
|
{
|
||||||
|
return m_it == begin_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return whether the iterator is at end
|
||||||
|
constexpr bool is_end() const noexcept
|
||||||
|
{
|
||||||
|
return m_it == end_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.m_it == rhs.m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.m_it < rhs.m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t operator+(difference_type n) noexcept
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
result += n;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.m_it - rhs.m_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t& operator++() noexcept
|
||||||
|
{
|
||||||
|
++m_it;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t operator++(int)& noexcept // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
++m_it;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t& operator--() noexcept
|
||||||
|
{
|
||||||
|
--m_it;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t operator--(int)& noexcept // NOLINT(cert-dcl21-cpp)
|
||||||
|
{
|
||||||
|
auto result = *this;
|
||||||
|
--m_it;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t& operator+=(difference_type n) noexcept
|
||||||
|
{
|
||||||
|
m_it += n;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive_iterator_t& operator-=(difference_type n) noexcept
|
||||||
|
{
|
||||||
|
m_it -= n;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
@ -0,0 +1,39 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <type_traits> // conditional, is_same
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Default base class of the @ref basic_json class.
|
||||||
|
|
||||||
|
So that the correct implementations of the copy / move ctors / assign operators
|
||||||
|
of @ref basic_json do not require complex case distinctions
|
||||||
|
(no base class / custom base class used as customization point),
|
||||||
|
@ref basic_json always has a base class.
|
||||||
|
By default, this class is used because it is empty and thus has no effect
|
||||||
|
on the behavior of @ref basic_json.
|
||||||
|
*/
|
||||||
|
struct json_default_base {};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
using json_base_class = typename std::conditional <
|
||||||
|
std::is_same<T, void>::value,
|
||||||
|
json_default_base,
|
||||||
|
T
|
||||||
|
>::type;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
988
chargingstation-aiter/include/nlohmann/detail/json_pointer.hpp
Normal file
988
chargingstation-aiter/include/nlohmann/detail/json_pointer.hpp
Normal file
@ -0,0 +1,988 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm> // all_of
|
||||||
|
#include <cctype> // isdigit
|
||||||
|
#include <cerrno> // errno, ERANGE
|
||||||
|
#include <cstdlib> // strtoull
|
||||||
|
#ifndef JSON_NO_IO
|
||||||
|
#include <iosfwd> // ostream
|
||||||
|
#endif // JSON_NO_IO
|
||||||
|
#include <limits> // max
|
||||||
|
#include <numeric> // accumulate
|
||||||
|
#include <string> // string
|
||||||
|
#include <utility> // move
|
||||||
|
#include <vector> // vector
|
||||||
|
|
||||||
|
#include <nlohmann/detail/exceptions.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
#include <nlohmann/detail/string_escape.hpp>
|
||||||
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/
|
||||||
|
template<typename RefStringType>
|
||||||
|
class json_pointer
|
||||||
|
{
|
||||||
|
// allow basic_json to access private members
|
||||||
|
NLOHMANN_BASIC_JSON_TPL_DECLARATION
|
||||||
|
friend class basic_json;
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
friend class json_pointer;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct string_t_helper
|
||||||
|
{
|
||||||
|
using type = T;
|
||||||
|
};
|
||||||
|
|
||||||
|
NLOHMANN_BASIC_JSON_TPL_DECLARATION
|
||||||
|
struct string_t_helper<NLOHMANN_BASIC_JSON_TPL>
|
||||||
|
{
|
||||||
|
using type = StringType;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
// for backwards compatibility accept BasicJsonType
|
||||||
|
using string_t = typename string_t_helper<RefStringType>::type;
|
||||||
|
|
||||||
|
/// @brief create JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/
|
||||||
|
explicit json_pointer(const string_t& s = "")
|
||||||
|
: reference_tokens(split(s))
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// @brief return a string representation of the JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/to_string/
|
||||||
|
string_t to_string() const
|
||||||
|
{
|
||||||
|
return std::accumulate(reference_tokens.begin(), reference_tokens.end(),
|
||||||
|
string_t{},
|
||||||
|
[](const string_t& a, const string_t& b)
|
||||||
|
{
|
||||||
|
return detail::concat(a, '/', detail::escape(b));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief return a string representation of the JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_string/
|
||||||
|
JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string())
|
||||||
|
operator string_t() const
|
||||||
|
{
|
||||||
|
return to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef JSON_NO_IO
|
||||||
|
/// @brief write string representation of the JSON pointer to stream
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/
|
||||||
|
friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr)
|
||||||
|
{
|
||||||
|
o << ptr.to_string();
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// @brief append another JSON pointer at the end of this JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/
|
||||||
|
json_pointer& operator/=(const json_pointer& ptr)
|
||||||
|
{
|
||||||
|
reference_tokens.insert(reference_tokens.end(),
|
||||||
|
ptr.reference_tokens.begin(),
|
||||||
|
ptr.reference_tokens.end());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief append an unescaped reference token at the end of this JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/
|
||||||
|
json_pointer& operator/=(string_t token)
|
||||||
|
{
|
||||||
|
push_back(std::move(token));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief append an array index at the end of this JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/
|
||||||
|
json_pointer& operator/=(std::size_t array_idx)
|
||||||
|
{
|
||||||
|
return *this /= std::to_string(array_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/
|
||||||
|
friend json_pointer operator/(const json_pointer& lhs,
|
||||||
|
const json_pointer& rhs)
|
||||||
|
{
|
||||||
|
return json_pointer(lhs) /= rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/
|
||||||
|
friend json_pointer operator/(const json_pointer& lhs, string_t token) // NOLINT(performance-unnecessary-value-param)
|
||||||
|
{
|
||||||
|
return json_pointer(lhs) /= std::move(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/
|
||||||
|
friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx)
|
||||||
|
{
|
||||||
|
return json_pointer(lhs) /= array_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief returns the parent of this JSON pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/
|
||||||
|
json_pointer parent_pointer() const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_pointer res = *this;
|
||||||
|
res.pop_back();
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief remove last reference token
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/pop_back/
|
||||||
|
void pop_back()
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(empty()))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
reference_tokens.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief return last reference token
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/back/
|
||||||
|
const string_t& back() const
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(empty()))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
return reference_tokens.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief append an unescaped token at the end of the reference pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/push_back/
|
||||||
|
void push_back(const string_t& token)
|
||||||
|
{
|
||||||
|
reference_tokens.push_back(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief append an unescaped token at the end of the reference pointer
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/push_back/
|
||||||
|
void push_back(string_t&& token)
|
||||||
|
{
|
||||||
|
reference_tokens.push_back(std::move(token));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief return whether pointer points to the root document
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/empty/
|
||||||
|
bool empty() const noexcept
|
||||||
|
{
|
||||||
|
return reference_tokens.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*!
|
||||||
|
@param[in] s reference token to be converted into an array index
|
||||||
|
|
||||||
|
@return integer representation of @a s
|
||||||
|
|
||||||
|
@throw parse_error.106 if an array index begins with '0'
|
||||||
|
@throw parse_error.109 if an array index begins not with a digit
|
||||||
|
@throw out_of_range.404 if string @a s could not be converted to an integer
|
||||||
|
@throw out_of_range.410 if an array index exceeds size_type
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static typename BasicJsonType::size_type array_index(const string_t& s)
|
||||||
|
{
|
||||||
|
using size_type = typename BasicJsonType::size_type;
|
||||||
|
|
||||||
|
// error condition (cf. RFC 6901, Sect. 4)
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0'))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::parse_error::create(106, 0, detail::concat("array index '", s, "' must not begin with '0'"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// error condition (cf. RFC 6901, Sect. 4)
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9')))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::parse_error::create(109, 0, detail::concat("array index '", s, "' is not a number"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* p = s.c_str();
|
||||||
|
char* p_end = nullptr;
|
||||||
|
errno = 0; // strtoull doesn't reset errno
|
||||||
|
const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
|
||||||
|
if (p == p_end // invalid input or empty string
|
||||||
|
|| errno == ERANGE // out of range
|
||||||
|
|| JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", s, "'"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// only triggered on special platforms (like 32bit), see also
|
||||||
|
// https://github.com/nlohmann/json/pull/2203
|
||||||
|
if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)())) // NOLINT(runtime/int)
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::out_of_range::create(410, detail::concat("array index ", s, " exceeds size_type"), nullptr)); // LCOV_EXCL_LINE
|
||||||
|
}
|
||||||
|
|
||||||
|
return static_cast<size_type>(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_PRIVATE_UNLESS_TESTED:
|
||||||
|
json_pointer top() const
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(empty()))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
json_pointer result = *this;
|
||||||
|
result.reference_tokens = {reference_tokens[0]};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*!
|
||||||
|
@brief create and return a reference to the pointed to value
|
||||||
|
|
||||||
|
@complexity Linear in the number of reference tokens.
|
||||||
|
|
||||||
|
@throw parse_error.109 if array index is not a number
|
||||||
|
@throw type_error.313 if value cannot be unflattened
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
BasicJsonType& get_and_create(BasicJsonType& j) const
|
||||||
|
{
|
||||||
|
auto* result = &j;
|
||||||
|
|
||||||
|
// in case no reference tokens exist, return a reference to the JSON value
|
||||||
|
// j which will be overwritten by a primitive value
|
||||||
|
for (const auto& reference_token : reference_tokens)
|
||||||
|
{
|
||||||
|
switch (result->type())
|
||||||
|
{
|
||||||
|
case detail::value_t::null:
|
||||||
|
{
|
||||||
|
if (reference_token == "0")
|
||||||
|
{
|
||||||
|
// start a new array if reference token is 0
|
||||||
|
result = &result->operator[](0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// start a new object otherwise
|
||||||
|
result = &result->operator[](reference_token);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
// create an entry in the object
|
||||||
|
result = &result->operator[](reference_token);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
// create an entry in the array
|
||||||
|
result = &result->operator[](array_index<BasicJsonType>(reference_token));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The following code is only reached if there exists a reference
|
||||||
|
token _and_ the current value is primitive. In this case, we have
|
||||||
|
an error situation, because primitive values may only occur as
|
||||||
|
single value; that is, with an empty list of reference tokens.
|
||||||
|
*/
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", &j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief return a reference to the pointed to value
|
||||||
|
|
||||||
|
@note This version does not throw if a value is not present, but tries to
|
||||||
|
create nested values instead. For instance, calling this function
|
||||||
|
with pointer `"/this/that"` on a null value is equivalent to calling
|
||||||
|
`operator[]("this").operator[]("that")` on that value, effectively
|
||||||
|
changing the null value to an object.
|
||||||
|
|
||||||
|
@param[in] ptr a JSON value
|
||||||
|
|
||||||
|
@return reference to the JSON value pointed to by the JSON pointer
|
||||||
|
|
||||||
|
@complexity Linear in the length of the JSON pointer.
|
||||||
|
|
||||||
|
@throw parse_error.106 if an array index begins with '0'
|
||||||
|
@throw parse_error.109 if an array index was not a number
|
||||||
|
@throw out_of_range.404 if the JSON pointer can not be resolved
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
BasicJsonType& get_unchecked(BasicJsonType* ptr) const
|
||||||
|
{
|
||||||
|
for (const auto& reference_token : reference_tokens)
|
||||||
|
{
|
||||||
|
// convert null values to arrays or objects before continuing
|
||||||
|
if (ptr->is_null())
|
||||||
|
{
|
||||||
|
// check if reference token is a number
|
||||||
|
const bool nums =
|
||||||
|
std::all_of(reference_token.begin(), reference_token.end(),
|
||||||
|
[](const unsigned char x)
|
||||||
|
{
|
||||||
|
return std::isdigit(x);
|
||||||
|
});
|
||||||
|
|
||||||
|
// change value to array for numbers or "-" or to object otherwise
|
||||||
|
*ptr = (nums || reference_token == "-")
|
||||||
|
? detail::value_t::array
|
||||||
|
: detail::value_t::object;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ptr->type())
|
||||||
|
{
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
// use unchecked object access
|
||||||
|
ptr = &ptr->operator[](reference_token);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
if (reference_token == "-")
|
||||||
|
{
|
||||||
|
// explicitly treat "-" as index beyond the end
|
||||||
|
ptr = &ptr->operator[](ptr->m_data.m_value.array->size());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// convert array index to number; unchecked access
|
||||||
|
ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::null:
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@throw parse_error.106 if an array index begins with '0'
|
||||||
|
@throw parse_error.109 if an array index was not a number
|
||||||
|
@throw out_of_range.402 if the array index '-' is used
|
||||||
|
@throw out_of_range.404 if the JSON pointer can not be resolved
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
BasicJsonType& get_checked(BasicJsonType* ptr) const
|
||||||
|
{
|
||||||
|
for (const auto& reference_token : reference_tokens)
|
||||||
|
{
|
||||||
|
switch (ptr->type())
|
||||||
|
{
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
// note: at performs range check
|
||||||
|
ptr = &ptr->at(reference_token);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
||||||
|
{
|
||||||
|
// "-" always fails the range check
|
||||||
|
JSON_THROW(detail::out_of_range::create(402, detail::concat(
|
||||||
|
"array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
|
||||||
|
") is out of range"), ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// note: at performs range check
|
||||||
|
ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::null:
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief return a const reference to the pointed to value
|
||||||
|
|
||||||
|
@param[in] ptr a JSON value
|
||||||
|
|
||||||
|
@return const reference to the JSON value pointed to by the JSON
|
||||||
|
pointer
|
||||||
|
|
||||||
|
@throw parse_error.106 if an array index begins with '0'
|
||||||
|
@throw parse_error.109 if an array index was not a number
|
||||||
|
@throw out_of_range.402 if the array index '-' is used
|
||||||
|
@throw out_of_range.404 if the JSON pointer can not be resolved
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const
|
||||||
|
{
|
||||||
|
for (const auto& reference_token : reference_tokens)
|
||||||
|
{
|
||||||
|
switch (ptr->type())
|
||||||
|
{
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
// use unchecked object access
|
||||||
|
ptr = &ptr->operator[](reference_token);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
||||||
|
{
|
||||||
|
// "-" cannot be used for const access
|
||||||
|
JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), ") is out of range"), ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// use unchecked array access
|
||||||
|
ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::null:
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@throw parse_error.106 if an array index begins with '0'
|
||||||
|
@throw parse_error.109 if an array index was not a number
|
||||||
|
@throw out_of_range.402 if the array index '-' is used
|
||||||
|
@throw out_of_range.404 if the JSON pointer can not be resolved
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
const BasicJsonType& get_checked(const BasicJsonType* ptr) const
|
||||||
|
{
|
||||||
|
for (const auto& reference_token : reference_tokens)
|
||||||
|
{
|
||||||
|
switch (ptr->type())
|
||||||
|
{
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
// note: at performs range check
|
||||||
|
ptr = &ptr->at(reference_token);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
||||||
|
{
|
||||||
|
// "-" always fails the range check
|
||||||
|
JSON_THROW(detail::out_of_range::create(402, detail::concat(
|
||||||
|
"array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
|
||||||
|
") is out of range"), ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// note: at performs range check
|
||||||
|
ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::null:
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@throw parse_error.106 if an array index begins with '0'
|
||||||
|
@throw parse_error.109 if an array index was not a number
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
bool contains(const BasicJsonType* ptr) const
|
||||||
|
{
|
||||||
|
for (const auto& reference_token : reference_tokens)
|
||||||
|
{
|
||||||
|
switch (ptr->type())
|
||||||
|
{
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
if (!ptr->contains(reference_token))
|
||||||
|
{
|
||||||
|
// we did not find the key in the object
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = &ptr->operator[](reference_token);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
|
||||||
|
{
|
||||||
|
// "-" always fails the range check
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9")))
|
||||||
|
{
|
||||||
|
// invalid char
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9')))
|
||||||
|
{
|
||||||
|
// first char should be between '1' and '9'
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (std::size_t i = 1; i < reference_token.size(); i++)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9')))
|
||||||
|
{
|
||||||
|
// other char should be between '0' and '9'
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto idx = array_index<BasicJsonType>(reference_token);
|
||||||
|
if (idx >= ptr->size())
|
||||||
|
{
|
||||||
|
// index out of range
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = &ptr->operator[](idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::null:
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
// we do not expect primitive values if there is still a
|
||||||
|
// reference token to process
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no reference token left means we found a primitive value
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief split the string input to reference tokens
|
||||||
|
|
||||||
|
@note This function is only called by the json_pointer constructor.
|
||||||
|
All exceptions below are documented there.
|
||||||
|
|
||||||
|
@throw parse_error.107 if the pointer is not empty or begins with '/'
|
||||||
|
@throw parse_error.108 if character '~' is not followed by '0' or '1'
|
||||||
|
*/
|
||||||
|
static std::vector<string_t> split(const string_t& reference_string)
|
||||||
|
{
|
||||||
|
std::vector<string_t> result;
|
||||||
|
|
||||||
|
// special case: empty reference string -> no reference tokens
|
||||||
|
if (reference_string.empty())
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if nonempty reference string begins with slash
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::parse_error::create(107, 1, detail::concat("JSON pointer must be empty or begin with '/' - was: '", reference_string, "'"), nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// extract the reference tokens:
|
||||||
|
// - slash: position of the last read slash (or end of string)
|
||||||
|
// - start: position after the previous slash
|
||||||
|
for (
|
||||||
|
// search for the first slash after the first character
|
||||||
|
std::size_t slash = reference_string.find_first_of('/', 1),
|
||||||
|
// set the beginning of the first reference token
|
||||||
|
start = 1;
|
||||||
|
// we can stop if start == 0 (if slash == string_t::npos)
|
||||||
|
start != 0;
|
||||||
|
// set the beginning of the next reference token
|
||||||
|
// (will eventually be 0 if slash == string_t::npos)
|
||||||
|
start = (slash == string_t::npos) ? 0 : slash + 1,
|
||||||
|
// find next slash
|
||||||
|
slash = reference_string.find_first_of('/', start))
|
||||||
|
{
|
||||||
|
// use the text between the beginning of the reference token
|
||||||
|
// (start) and the last slash (slash).
|
||||||
|
auto reference_token = reference_string.substr(start, slash - start);
|
||||||
|
|
||||||
|
// check reference tokens are properly escaped
|
||||||
|
for (std::size_t pos = reference_token.find_first_of('~');
|
||||||
|
pos != string_t::npos;
|
||||||
|
pos = reference_token.find_first_of('~', pos + 1))
|
||||||
|
{
|
||||||
|
JSON_ASSERT(reference_token[pos] == '~');
|
||||||
|
|
||||||
|
// ~ must be followed by 0 or 1
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||
|
||||||
|
(reference_token[pos + 1] != '0' &&
|
||||||
|
reference_token[pos + 1] != '1')))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", nullptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally, store the reference token
|
||||||
|
detail::unescape(reference_token);
|
||||||
|
result.push_back(reference_token);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*!
|
||||||
|
@param[in] reference_string the reference string to the current value
|
||||||
|
@param[in] value the value to consider
|
||||||
|
@param[in,out] result the result object to insert values to
|
||||||
|
|
||||||
|
@note Empty objects or arrays are flattened to `null`.
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static void flatten(const string_t& reference_string,
|
||||||
|
const BasicJsonType& value,
|
||||||
|
BasicJsonType& result)
|
||||||
|
{
|
||||||
|
switch (value.type())
|
||||||
|
{
|
||||||
|
case detail::value_t::array:
|
||||||
|
{
|
||||||
|
if (value.m_data.m_value.array->empty())
|
||||||
|
{
|
||||||
|
// flatten empty array as null
|
||||||
|
result[reference_string] = nullptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// iterate array and use index as reference string
|
||||||
|
for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i)
|
||||||
|
{
|
||||||
|
flatten(detail::concat(reference_string, '/', std::to_string(i)),
|
||||||
|
value.m_data.m_value.array->operator[](i), result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::object:
|
||||||
|
{
|
||||||
|
if (value.m_data.m_value.object->empty())
|
||||||
|
{
|
||||||
|
// flatten empty object as null
|
||||||
|
result[reference_string] = nullptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// iterate object and use keys as reference string
|
||||||
|
for (const auto& element : *value.m_data.m_value.object)
|
||||||
|
{
|
||||||
|
flatten(detail::concat(reference_string, '/', detail::escape(element.first)), element.second, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case detail::value_t::null:
|
||||||
|
case detail::value_t::string:
|
||||||
|
case detail::value_t::boolean:
|
||||||
|
case detail::value_t::number_integer:
|
||||||
|
case detail::value_t::number_unsigned:
|
||||||
|
case detail::value_t::number_float:
|
||||||
|
case detail::value_t::binary:
|
||||||
|
case detail::value_t::discarded:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
// add primitive value with its reference string
|
||||||
|
result[reference_string] = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@param[in] value flattened JSON
|
||||||
|
|
||||||
|
@return unflattened JSON
|
||||||
|
|
||||||
|
@throw parse_error.109 if array index is not a number
|
||||||
|
@throw type_error.314 if value is not an object
|
||||||
|
@throw type_error.315 if object values are not primitive
|
||||||
|
@throw type_error.313 if value cannot be unflattened
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
static BasicJsonType
|
||||||
|
unflatten(const BasicJsonType& value)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!value.is_object()))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", &value));
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicJsonType result;
|
||||||
|
|
||||||
|
// iterate the JSON object values
|
||||||
|
for (const auto& element : *value.m_data.m_value.object)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))
|
||||||
|
{
|
||||||
|
JSON_THROW(detail::type_error::create(315, "values in object must be primitive", &element.second));
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign value to reference pointed to by JSON pointer; Note that if
|
||||||
|
// the JSON pointer is "" (i.e., points to the whole value), function
|
||||||
|
// get_and_create returns a reference to result itself. An assignment
|
||||||
|
// will then create a primitive value.
|
||||||
|
json_pointer(element.first).get_and_create(result) = element.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// can't use conversion operator because of ambiguity
|
||||||
|
json_pointer<string_t> convert() const&
|
||||||
|
{
|
||||||
|
json_pointer<string_t> result;
|
||||||
|
result.reference_tokens = reference_tokens;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_pointer<string_t> convert()&&
|
||||||
|
{
|
||||||
|
json_pointer<string_t> result;
|
||||||
|
result.reference_tokens = std::move(reference_tokens);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
#if JSON_HAS_THREE_WAY_COMPARISON
|
||||||
|
/// @brief compares two JSON pointers for equality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
template<typename RefStringTypeRhs>
|
||||||
|
bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept
|
||||||
|
{
|
||||||
|
return reference_tokens == rhs.reference_tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief compares JSON pointer and string for equality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer))
|
||||||
|
bool operator==(const string_t& rhs) const
|
||||||
|
{
|
||||||
|
return *this == json_pointer(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief 3-way compares two JSON pointers
|
||||||
|
template<typename RefStringTypeRhs>
|
||||||
|
std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD*
|
||||||
|
{
|
||||||
|
return reference_tokens <=> rhs.reference_tokens; // *NOPAD*
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/// @brief compares two JSON pointers for equality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
||||||
|
|
||||||
|
/// @brief compares JSON pointer and string for equality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
template<typename RefStringTypeLhs, typename StringType>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const StringType& rhs);
|
||||||
|
|
||||||
|
/// @brief compares string and JSON pointer for equality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
template<typename RefStringTypeRhs, typename StringType>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator==(const StringType& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs);
|
||||||
|
|
||||||
|
/// @brief compares two JSON pointers for inequality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
||||||
|
|
||||||
|
/// @brief compares JSON pointer and string for inequality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
|
||||||
|
template<typename RefStringTypeLhs, typename StringType>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const StringType& rhs);
|
||||||
|
|
||||||
|
/// @brief compares string and JSON pointer for inequality
|
||||||
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
|
||||||
|
template<typename RefStringTypeRhs, typename StringType>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator!=(const StringType& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs);
|
||||||
|
|
||||||
|
/// @brief compares two JSON pointer for less-than
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// the reference tokens
|
||||||
|
std::vector<string_t> reference_tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !JSON_HAS_THREE_WAY_COMPARISON
|
||||||
|
// functions cannot be defined inside class due to ODR violations
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.reference_tokens == rhs.reference_tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeLhs,
|
||||||
|
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
|
||||||
|
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))
|
||||||
|
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const StringType& rhs)
|
||||||
|
{
|
||||||
|
return lhs == json_pointer<RefStringTypeLhs>(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeRhs,
|
||||||
|
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
|
||||||
|
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))
|
||||||
|
inline bool operator==(const StringType& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs)
|
||||||
|
{
|
||||||
|
return json_pointer<RefStringTypeRhs>(lhs) == rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
||||||
|
{
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeLhs,
|
||||||
|
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
|
||||||
|
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))
|
||||||
|
inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const StringType& rhs)
|
||||||
|
{
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeRhs,
|
||||||
|
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
|
||||||
|
JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))
|
||||||
|
inline bool operator!=(const StringType& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs)
|
||||||
|
{
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
inline bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.reference_tokens < rhs.reference_tokens;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
78
chargingstation-aiter/include/nlohmann/detail/json_ref.hpp
Normal file
78
chargingstation-aiter/include/nlohmann/detail/json_ref.hpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <initializer_list>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
class json_ref
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using value_type = BasicJsonType;
|
||||||
|
|
||||||
|
json_ref(value_type&& value)
|
||||||
|
: owned_value(std::move(value))
|
||||||
|
{}
|
||||||
|
|
||||||
|
json_ref(const value_type& value)
|
||||||
|
: value_ref(&value)
|
||||||
|
{}
|
||||||
|
|
||||||
|
json_ref(std::initializer_list<json_ref> init)
|
||||||
|
: owned_value(init)
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <
|
||||||
|
class... Args,
|
||||||
|
enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
|
||||||
|
json_ref(Args && ... args)
|
||||||
|
: owned_value(std::forward<Args>(args)...)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// class should be movable only
|
||||||
|
json_ref(json_ref&&) noexcept = default;
|
||||||
|
json_ref(const json_ref&) = delete;
|
||||||
|
json_ref& operator=(const json_ref&) = delete;
|
||||||
|
json_ref& operator=(json_ref&&) = delete;
|
||||||
|
~json_ref() = default;
|
||||||
|
|
||||||
|
value_type moved_or_copied() const
|
||||||
|
{
|
||||||
|
if (value_ref == nullptr)
|
||||||
|
{
|
||||||
|
return std::move(owned_value);
|
||||||
|
}
|
||||||
|
return *value_ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
value_type const& operator*() const
|
||||||
|
{
|
||||||
|
return value_ref ? *value_ref : owned_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
value_type const* operator->() const
|
||||||
|
{
|
||||||
|
return &** this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable value_type owned_value = nullptr;
|
||||||
|
value_type const* value_ref = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
482
chargingstation-aiter/include/nlohmann/detail/macro_scope.hpp
Normal file
482
chargingstation-aiter/include/nlohmann/detail/macro_scope.hpp
Normal file
@ -0,0 +1,482 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <utility> // declval, pair
|
||||||
|
#include <nlohmann/detail/meta/detected.hpp>
|
||||||
|
#include <nlohmann/thirdparty/hedley/hedley.hpp>
|
||||||
|
|
||||||
|
// This file contains all internal macro definitions (except those affecting ABI)
|
||||||
|
// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
|
// exclude unsupported compilers
|
||||||
|
#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
|
||||||
|
#if defined(__clang__)
|
||||||
|
#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
|
||||||
|
#error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
|
||||||
|
#endif
|
||||||
|
#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
|
||||||
|
#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
|
||||||
|
#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// C++ language standard detection
|
||||||
|
// if the user manually specified the used c++ version this is skipped
|
||||||
|
#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11)
|
||||||
|
#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
|
||||||
|
#define JSON_HAS_CPP_20
|
||||||
|
#define JSON_HAS_CPP_17
|
||||||
|
#define JSON_HAS_CPP_14
|
||||||
|
#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
|
||||||
|
#define JSON_HAS_CPP_17
|
||||||
|
#define JSON_HAS_CPP_14
|
||||||
|
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
|
||||||
|
#define JSON_HAS_CPP_14
|
||||||
|
#endif
|
||||||
|
// the cpp 11 flag is always specified because it is the minimal required version
|
||||||
|
#define JSON_HAS_CPP_11
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __has_include
|
||||||
|
#if __has_include(<version>)
|
||||||
|
#include <version>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM)
|
||||||
|
#ifdef JSON_HAS_CPP_17
|
||||||
|
#if defined(__cpp_lib_filesystem)
|
||||||
|
#define JSON_HAS_FILESYSTEM 1
|
||||||
|
#elif defined(__cpp_lib_experimental_filesystem)
|
||||||
|
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
|
||||||
|
#elif !defined(__has_include)
|
||||||
|
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
|
||||||
|
#elif __has_include(<filesystem>)
|
||||||
|
#define JSON_HAS_FILESYSTEM 1
|
||||||
|
#elif __has_include(<experimental/filesystem>)
|
||||||
|
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/
|
||||||
|
#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support
|
||||||
|
#if defined(__clang_major__) && __clang_major__ < 7
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1914
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// no filesystem support before iOS 13
|
||||||
|
#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// no filesystem support before macOS Catalina
|
||||||
|
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_FILESYSTEM
|
||||||
|
#define JSON_HAS_FILESYSTEM 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_THREE_WAY_COMPARISON
|
||||||
|
#if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \
|
||||||
|
&& defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L
|
||||||
|
#define JSON_HAS_THREE_WAY_COMPARISON 1
|
||||||
|
#else
|
||||||
|
#define JSON_HAS_THREE_WAY_COMPARISON 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_RANGES
|
||||||
|
// ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error
|
||||||
|
#if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427
|
||||||
|
#define JSON_HAS_RANGES 0
|
||||||
|
#elif defined(__cpp_lib_ranges)
|
||||||
|
#define JSON_HAS_RANGES 1
|
||||||
|
#else
|
||||||
|
#define JSON_HAS_RANGES 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_HAS_STATIC_RTTI
|
||||||
|
#if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0
|
||||||
|
#define JSON_HAS_STATIC_RTTI 1
|
||||||
|
#else
|
||||||
|
#define JSON_HAS_STATIC_RTTI 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef JSON_HAS_CPP_17
|
||||||
|
#define JSON_INLINE_VARIABLE inline
|
||||||
|
#else
|
||||||
|
#define JSON_INLINE_VARIABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address)
|
||||||
|
#define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]]
|
||||||
|
#else
|
||||||
|
#define JSON_NO_UNIQUE_ADDRESS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// disable documentation warnings on clang
|
||||||
|
#if defined(__clang__)
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
||||||
|
#pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// allow disabling exceptions
|
||||||
|
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
|
||||||
|
#define JSON_THROW(exception) throw exception
|
||||||
|
#define JSON_TRY try
|
||||||
|
#define JSON_CATCH(exception) catch(exception)
|
||||||
|
#define JSON_INTERNAL_CATCH(exception) catch(exception)
|
||||||
|
#else
|
||||||
|
#include <cstdlib>
|
||||||
|
#define JSON_THROW(exception) std::abort()
|
||||||
|
#define JSON_TRY if(true)
|
||||||
|
#define JSON_CATCH(exception) if(false)
|
||||||
|
#define JSON_INTERNAL_CATCH(exception) if(false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// override exception macros
|
||||||
|
#if defined(JSON_THROW_USER)
|
||||||
|
#undef JSON_THROW
|
||||||
|
#define JSON_THROW JSON_THROW_USER
|
||||||
|
#endif
|
||||||
|
#if defined(JSON_TRY_USER)
|
||||||
|
#undef JSON_TRY
|
||||||
|
#define JSON_TRY JSON_TRY_USER
|
||||||
|
#endif
|
||||||
|
#if defined(JSON_CATCH_USER)
|
||||||
|
#undef JSON_CATCH
|
||||||
|
#define JSON_CATCH JSON_CATCH_USER
|
||||||
|
#undef JSON_INTERNAL_CATCH
|
||||||
|
#define JSON_INTERNAL_CATCH JSON_CATCH_USER
|
||||||
|
#endif
|
||||||
|
#if defined(JSON_INTERNAL_CATCH_USER)
|
||||||
|
#undef JSON_INTERNAL_CATCH
|
||||||
|
#define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// allow overriding assert
|
||||||
|
#if !defined(JSON_ASSERT)
|
||||||
|
#include <cassert> // assert
|
||||||
|
#define JSON_ASSERT(x) assert(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// allow to access some private functions (needed by the test suite)
|
||||||
|
#if defined(JSON_TESTS_PRIVATE)
|
||||||
|
#define JSON_PRIVATE_UNLESS_TESTED public
|
||||||
|
#else
|
||||||
|
#define JSON_PRIVATE_UNLESS_TESTED private
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief macro to briefly define a mapping between an enum and JSON
|
||||||
|
@def NLOHMANN_JSON_SERIALIZE_ENUM
|
||||||
|
@since version 3.4.0
|
||||||
|
*/
|
||||||
|
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
|
||||||
|
template<typename BasicJsonType> \
|
||||||
|
inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \
|
||||||
|
{ \
|
||||||
|
static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
|
||||||
|
static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
|
||||||
|
auto it = std::find_if(std::begin(m), std::end(m), \
|
||||||
|
[e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
|
||||||
|
{ \
|
||||||
|
return ej_pair.first == e; \
|
||||||
|
}); \
|
||||||
|
j = ((it != std::end(m)) ? it : std::begin(m))->second; \
|
||||||
|
} \
|
||||||
|
template<typename BasicJsonType> \
|
||||||
|
inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \
|
||||||
|
{ \
|
||||||
|
static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
|
||||||
|
static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
|
||||||
|
auto it = std::find_if(std::begin(m), std::end(m), \
|
||||||
|
[&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
|
||||||
|
{ \
|
||||||
|
return ej_pair.second == j; \
|
||||||
|
}); \
|
||||||
|
e = ((it != std::end(m)) ? it : std::begin(m))->first; \
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
|
||||||
|
// may be removed in the future once the class is split.
|
||||||
|
|
||||||
|
#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
|
||||||
|
template<template<typename, typename, typename...> class ObjectType, \
|
||||||
|
template<typename, typename...> class ArrayType, \
|
||||||
|
class StringType, class BooleanType, class NumberIntegerType, \
|
||||||
|
class NumberUnsignedType, class NumberFloatType, \
|
||||||
|
template<typename> class AllocatorType, \
|
||||||
|
template<typename, typename = void> class JSONSerializer, \
|
||||||
|
class BinaryType, \
|
||||||
|
class CustomBaseClass>
|
||||||
|
|
||||||
|
#define NLOHMANN_BASIC_JSON_TPL \
|
||||||
|
basic_json<ObjectType, ArrayType, StringType, BooleanType, \
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, \
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>
|
||||||
|
|
||||||
|
// Macros to simplify conversion from/to types
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_EXPAND( x ) x
|
||||||
|
#define NLOHMANN_JSON_GET_MACRO(_1, _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, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME
|
||||||
|
#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \
|
||||||
|
NLOHMANN_JSON_PASTE64, \
|
||||||
|
NLOHMANN_JSON_PASTE63, \
|
||||||
|
NLOHMANN_JSON_PASTE62, \
|
||||||
|
NLOHMANN_JSON_PASTE61, \
|
||||||
|
NLOHMANN_JSON_PASTE60, \
|
||||||
|
NLOHMANN_JSON_PASTE59, \
|
||||||
|
NLOHMANN_JSON_PASTE58, \
|
||||||
|
NLOHMANN_JSON_PASTE57, \
|
||||||
|
NLOHMANN_JSON_PASTE56, \
|
||||||
|
NLOHMANN_JSON_PASTE55, \
|
||||||
|
NLOHMANN_JSON_PASTE54, \
|
||||||
|
NLOHMANN_JSON_PASTE53, \
|
||||||
|
NLOHMANN_JSON_PASTE52, \
|
||||||
|
NLOHMANN_JSON_PASTE51, \
|
||||||
|
NLOHMANN_JSON_PASTE50, \
|
||||||
|
NLOHMANN_JSON_PASTE49, \
|
||||||
|
NLOHMANN_JSON_PASTE48, \
|
||||||
|
NLOHMANN_JSON_PASTE47, \
|
||||||
|
NLOHMANN_JSON_PASTE46, \
|
||||||
|
NLOHMANN_JSON_PASTE45, \
|
||||||
|
NLOHMANN_JSON_PASTE44, \
|
||||||
|
NLOHMANN_JSON_PASTE43, \
|
||||||
|
NLOHMANN_JSON_PASTE42, \
|
||||||
|
NLOHMANN_JSON_PASTE41, \
|
||||||
|
NLOHMANN_JSON_PASTE40, \
|
||||||
|
NLOHMANN_JSON_PASTE39, \
|
||||||
|
NLOHMANN_JSON_PASTE38, \
|
||||||
|
NLOHMANN_JSON_PASTE37, \
|
||||||
|
NLOHMANN_JSON_PASTE36, \
|
||||||
|
NLOHMANN_JSON_PASTE35, \
|
||||||
|
NLOHMANN_JSON_PASTE34, \
|
||||||
|
NLOHMANN_JSON_PASTE33, \
|
||||||
|
NLOHMANN_JSON_PASTE32, \
|
||||||
|
NLOHMANN_JSON_PASTE31, \
|
||||||
|
NLOHMANN_JSON_PASTE30, \
|
||||||
|
NLOHMANN_JSON_PASTE29, \
|
||||||
|
NLOHMANN_JSON_PASTE28, \
|
||||||
|
NLOHMANN_JSON_PASTE27, \
|
||||||
|
NLOHMANN_JSON_PASTE26, \
|
||||||
|
NLOHMANN_JSON_PASTE25, \
|
||||||
|
NLOHMANN_JSON_PASTE24, \
|
||||||
|
NLOHMANN_JSON_PASTE23, \
|
||||||
|
NLOHMANN_JSON_PASTE22, \
|
||||||
|
NLOHMANN_JSON_PASTE21, \
|
||||||
|
NLOHMANN_JSON_PASTE20, \
|
||||||
|
NLOHMANN_JSON_PASTE19, \
|
||||||
|
NLOHMANN_JSON_PASTE18, \
|
||||||
|
NLOHMANN_JSON_PASTE17, \
|
||||||
|
NLOHMANN_JSON_PASTE16, \
|
||||||
|
NLOHMANN_JSON_PASTE15, \
|
||||||
|
NLOHMANN_JSON_PASTE14, \
|
||||||
|
NLOHMANN_JSON_PASTE13, \
|
||||||
|
NLOHMANN_JSON_PASTE12, \
|
||||||
|
NLOHMANN_JSON_PASTE11, \
|
||||||
|
NLOHMANN_JSON_PASTE10, \
|
||||||
|
NLOHMANN_JSON_PASTE9, \
|
||||||
|
NLOHMANN_JSON_PASTE8, \
|
||||||
|
NLOHMANN_JSON_PASTE7, \
|
||||||
|
NLOHMANN_JSON_PASTE6, \
|
||||||
|
NLOHMANN_JSON_PASTE5, \
|
||||||
|
NLOHMANN_JSON_PASTE4, \
|
||||||
|
NLOHMANN_JSON_PASTE3, \
|
||||||
|
NLOHMANN_JSON_PASTE2, \
|
||||||
|
NLOHMANN_JSON_PASTE1)(__VA_ARGS__))
|
||||||
|
#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)
|
||||||
|
#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)
|
||||||
|
#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)
|
||||||
|
#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)
|
||||||
|
#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)
|
||||||
|
#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)
|
||||||
|
#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)
|
||||||
|
#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)
|
||||||
|
#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)
|
||||||
|
#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)
|
||||||
|
#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)
|
||||||
|
#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
|
||||||
|
#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
|
||||||
|
#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)
|
||||||
|
#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)
|
||||||
|
#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)
|
||||||
|
#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)
|
||||||
|
#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)
|
||||||
|
#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)
|
||||||
|
#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)
|
||||||
|
#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)
|
||||||
|
#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)
|
||||||
|
#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
|
||||||
|
#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)
|
||||||
|
#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)
|
||||||
|
#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)
|
||||||
|
#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)
|
||||||
|
#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)
|
||||||
|
#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)
|
||||||
|
#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)
|
||||||
|
#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)
|
||||||
|
#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)
|
||||||
|
#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)
|
||||||
|
#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)
|
||||||
|
#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)
|
||||||
|
#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)
|
||||||
|
#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)
|
||||||
|
#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)
|
||||||
|
#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)
|
||||||
|
#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)
|
||||||
|
#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)
|
||||||
|
#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)
|
||||||
|
#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)
|
||||||
|
#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)
|
||||||
|
#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)
|
||||||
|
#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)
|
||||||
|
#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)
|
||||||
|
#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)
|
||||||
|
#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)
|
||||||
|
#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)
|
||||||
|
#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)
|
||||||
|
#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)
|
||||||
|
#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)
|
||||||
|
#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)
|
||||||
|
#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)
|
||||||
|
#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)
|
||||||
|
#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)
|
||||||
|
#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)
|
||||||
|
#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)
|
||||||
|
#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)
|
||||||
|
#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)
|
||||||
|
#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)
|
||||||
|
#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;
|
||||||
|
#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);
|
||||||
|
#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief macro
|
||||||
|
@def NLOHMANN_DEFINE_TYPE_INTRUSIVE
|
||||||
|
@since version 3.9.0
|
||||||
|
*/
|
||||||
|
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \
|
||||||
|
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
|
friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||||
|
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
|
friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \
|
||||||
|
friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief macro
|
||||||
|
@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE
|
||||||
|
@since version 3.9.0
|
||||||
|
*/
|
||||||
|
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \
|
||||||
|
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
|
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \
|
||||||
|
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
|
||||||
|
inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
|
||||||
|
inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
|
||||||
|
|
||||||
|
// inspired from https://stackoverflow.com/a/26745591
|
||||||
|
// allows to call any std function as if (e.g. with begin):
|
||||||
|
// using std::begin; begin(x);
|
||||||
|
//
|
||||||
|
// it allows using the detected idiom to retrieve the return type
|
||||||
|
// of such an expression
|
||||||
|
#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \
|
||||||
|
namespace detail { \
|
||||||
|
using std::std_name; \
|
||||||
|
\
|
||||||
|
template<typename... T> \
|
||||||
|
using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
namespace detail2 { \
|
||||||
|
struct std_name##_tag \
|
||||||
|
{ \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
template<typename... T> \
|
||||||
|
std_name##_tag std_name(T&&...); \
|
||||||
|
\
|
||||||
|
template<typename... T> \
|
||||||
|
using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \
|
||||||
|
\
|
||||||
|
template<typename... T> \
|
||||||
|
struct would_call_std_##std_name \
|
||||||
|
{ \
|
||||||
|
static constexpr auto const value = ::nlohmann::detail:: \
|
||||||
|
is_detected_exact<std_name##_tag, result_of_##std_name, T...>::value; \
|
||||||
|
}; \
|
||||||
|
} /* namespace detail2 */ \
|
||||||
|
\
|
||||||
|
template<typename... T> \
|
||||||
|
struct would_call_std_##std_name : detail2::would_call_std_##std_name<T...> \
|
||||||
|
{ \
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
|
#define JSON_USE_IMPLICIT_CONVERSIONS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
|
#define JSON_EXPLICIT
|
||||||
|
#else
|
||||||
|
#define JSON_EXPLICIT explicit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
|
#define JSON_DISABLE_ENUM_SERIALIZATION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_USE_GLOBAL_UDLS
|
||||||
|
#define JSON_USE_GLOBAL_UDLS 1
|
||||||
|
#endif
|
@ -0,0 +1,45 @@
|
|||||||
|
// __ _____ _____ _____
|
||||||
|
// __| | __| | | | JSON for Modern C++
|
||||||
|
// | | |__ | | | | | | version 3.11.3
|
||||||
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// restore clang diagnostic settings
|
||||||
|
#if defined(__clang__)
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
#undef JSON_ASSERT
|
||||||
|
#undef JSON_INTERNAL_CATCH
|
||||||
|
#undef JSON_THROW
|
||||||
|
#undef JSON_PRIVATE_UNLESS_TESTED
|
||||||
|
#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
|
||||||
|
#undef NLOHMANN_BASIC_JSON_TPL
|
||||||
|
#undef JSON_EXPLICIT
|
||||||
|
#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL
|
||||||
|
#undef JSON_INLINE_VARIABLE
|
||||||
|
#undef JSON_NO_UNIQUE_ADDRESS
|
||||||
|
#undef JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
|
#undef JSON_USE_GLOBAL_UDLS
|
||||||
|
|
||||||
|
#ifndef JSON_TEST_KEEP_MACROS
|
||||||
|
#undef JSON_CATCH
|
||||||
|
#undef JSON_TRY
|
||||||
|
#undef JSON_HAS_CPP_11
|
||||||
|
#undef JSON_HAS_CPP_14
|
||||||
|
#undef JSON_HAS_CPP_17
|
||||||
|
#undef JSON_HAS_CPP_20
|
||||||
|
#undef JSON_HAS_FILESYSTEM
|
||||||
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#undef JSON_HAS_THREE_WAY_COMPARISON
|
||||||
|
#undef JSON_HAS_RANGES
|
||||||
|
#undef JSON_HAS_STATIC_RTTI
|
||||||
|
#undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
|
BIN
chargingstation-aiter/include/nlohmann/detail/meta/._call_std
Normal file
BIN
chargingstation-aiter/include/nlohmann/detail/meta/._call_std
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user