diff --git a/.gitignore b/.gitignore index ce0f5f867be4c632ab2915eafb736c5150937637..683bcea58a3a309d3b90ee42ed144f6b3af3fd54 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,7 @@ *.iml bin/ Gopkg.lock -vendor/ +/vendor temp/ yarn-error.log /.project -cmake-build-debug/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..13d1556a1cc151e854e4a42eceee7ce57486b213 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "cpp/proto"] + path = cpp/proto + url = git@code.vereign.com:code/vcl-proto.git diff --git a/cpp/.clang-tidy b/cpp/.clang-tidy new file mode 100644 index 0000000000000000000000000000000000000000..09a43d11558b23029276572fdd249961288076e0 --- /dev/null +++ b/cpp/.clang-tidy @@ -0,0 +1,35 @@ +--- +Checks: 'clang-diagnostic-*,clang-analyzer-*,modernize-*,-modernize-use-nodiscard,readability-*,-readability-container-size-empty,-readability-magic-numbers' +WarningsAsErrors: '' +HeaderFilterRegex: '' +AnalyzeTemporaryDtors: false +FormatStyle: none +CheckOptions: + - key: cert-dcl16-c.NewSuffixes + value: 'L;LL;LU;LLU' + - key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField + value: '0' + - key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors + value: '1' + - key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic + value: '1' + - key: google-readability-braces-around-statements.ShortStatementLines + value: '1' + - key: google-readability-function-size.StatementThreshold + value: '800' + - key: google-readability-namespace-comments.ShortNamespaceLines + value: '10' + - key: google-readability-namespace-comments.SpacesBeforeComments + value: '2' + - key: modernize-loop-convert.MaxCopySize + value: '16' + - key: modernize-loop-convert.MinConfidence + value: reasonable + - key: modernize-loop-convert.NamingStyle + value: CamelCase + - key: modernize-pass-by-value.IncludeStyle + value: llvm + - key: modernize-replace-auto-ptr.IncludeStyle + value: llvm + - key: modernize-use-nullptr.NullMacros + value: 'NULL' diff --git a/cpp/.ctagsignore b/cpp/.ctagsignore new file mode 100644 index 0000000000000000000000000000000000000000..008fe4b62e7589b66f2f2c36d7d4bc189502eda3 --- /dev/null +++ b/cpp/.ctagsignore @@ -0,0 +1,3 @@ +cmake-* +compile_commands.json +.clangd diff --git a/cpp/.gitignore b/cpp/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..48d08e65e0c7b04f833e2cb69913b72a86acc93c --- /dev/null +++ b/cpp/.gitignore @@ -0,0 +1,6 @@ +/cmake-* +/compile_commands.json +/.clangd +/tags + +/docs/doxy diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..35a77a1a47dd339cb229a2fc1ab63a90f3605997 --- /dev/null +++ b/cpp/CMakeLists.txt @@ -0,0 +1,191 @@ +cmake_minimum_required (VERSION 3.16.5) + +project (vereign) + +# Options +# FIXME: Add options docs in the README.md +option(VEREIGN_USE_LLD "Use the lld linker" OFF) +option(VEREIGN_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) +option(VEREIGN_USE_TIME_TRACE "Use compilation profiler" OFF) +option(VEREIGN_ENABLE_BENCHMARKING "Enable tests benchmarks" OFF) + +if (UNIX AND NOT APPLE) + set(LINUX TRUE) +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.0.24215.1") + message(FATAL_ERROR "Microsoft Visual C++ version MSVC 19.0.24215.1 required") + endif() +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0") + message(FATAL_ERROR "Insufficient clang version - clang 9.0+ required") + endif() +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7.5") + message(FATAL_ERROR "Insufficient GNU compiler version - 7.5+ required") + endif() +else() + message(WARNING "Unknown compiler...") +endif() + +if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # add_definitions(-D_WIN32_WINNT=0x0601) + add_definitions(-D_WIN32_WINNT=0x0A00) + + # set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Release>:Release>") + # set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>") + + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDebugDLL") + endif() + + set(CMAKE_C_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3") + set(CMAKE_CXX_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3 /GR /EHsc") + + set(CMAKE_C_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1") + set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1") + + set(CMAKE_CXX_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL") + set(CMAKE_C_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL") + + if (CMAKE_BUILD_TYPE STREQUAL "Release") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /OPT:REF /OPT:ICF /LTCG") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG /OPT:REF /OPT:ICF /LTCG") + set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /LTCG") + endif() +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -Wall -Wextra -pedantic") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wextra -pedantic") + if (VEREIGN_USE_LLD) + set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld") + endif() +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -Wall -Wextra -pedantic") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wextra -pedantic") +endif() + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_EXTENSIONS OFF) + +message("Generator: " "${CMAKE_GENERATOR}") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}") + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") + +message("Build type: " "${CMAKE_BUILD_TYPE}") +message("CXX Flags: " "${CMAKE_CXX_FLAGS}") +message("CXX debug flags: " "${CMAKE_CXX_FLAGS_DEBUG}") +message("CXX release flags: " "${CMAKE_CXX_FLAGS_RELEASE}") +message("CXX linker flags: " "${CMAKE_EXE_LINKER_FLAGS}") +message("CXX dll linker flags: " "${CMAKE_SHARED_LINKER_FLAGS}") +message("CXX static linker flags: " "${CMAKE_STATIC_LINKER_FLAGS}") + +string(TOLOWER "${CMAKE_BUILD_TYPE}" _build_type) +set(VENDOR_INSTALL_DIR ${CMAKE_SOURCE_DIR}/cmake-install-vendor-${_build_type} CACHE STRING "vendor directory") +message(STATUS "Using vendor install dir: ${VENDOR_INSTALL_DIR}") +set(_cmake_prefix_paths + ${VENDOR_INSTALL_DIR} + ${VENDOR_INSTALL_DIR}/grpc + ${VENDOR_INSTALL_DIR}/nlohmann + ${VENDOR_INSTALL_DIR}/sqlite3 +) +set(CMAKE_PREFIX_PATH ${_cmake_prefix_paths} CACHE STRING "") + +include(CMakeToolsHelpers OPTIONAL) +include(Helpers) +include(ProtoGenerate) + +enable_testing() + +find_package(fmt 6.2.0 REQUIRED) +if (fmt_FOUND) + get_target_property(fmt_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES) +endif() + +set(OPENSSL_USE_STATIC_LIBS ON) +set(OPENSSL_ROOT_DIR ${VENDOR_INSTALL_DIR}/boringssl) +find_package(OpenSSL) + +set(Boost_USE_STATIC_LIBS ON) +find_package( + Boost + 1.72.0 + EXACT + REQUIRED + COMPONENTS regex thread system date_time filesystem +) + +find_package(Protobuf CONFIG REQUIRED) +message(STATUS "Using protobuf ${protobuf_VERSION}") +if(CMAKE_CROSSCOMPILING) + find_program(PROTOBUF_PROTOC protoc) +else() + set(PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>) +endif() + +# Find gRPC installation +# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation. +find_package(gRPC CONFIG REQUIRED) +message(STATUS "Using gRPC ${gRPC_VERSION}") +if(CMAKE_CROSSCOMPILING) + find_program(GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) +else() + set(GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>) +endif() + +find_package(nlohmann_json 3.7.3 REQUIRED) +find_package(SQLite3 REQUIRED) + +add_subdirectory("src") +add_subdirectory("tests") + +get_target_property(_protobuflib_location protobuf::libprotobuf LOCATION) +get_target_property(_grpclib_location gRPC::grpc++ LOCATION) +get_target_property(_grpclib_reflection_location gRPC::grpc++_reflection LOCATION) +set( + _grpc_libs + ${_protobuflib_location} + ${_grpclib_location} + ${_grpclib_reflection_location} +) + +string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type) +message(STATUS "summary of build options: + + Package version: ${VERSION} + Library version: ${LT_CURRENT}:${LT_REVISION}:${LT_AGE} + Install prefix: ${CMAKE_INSTALL_PREFIX} + Target system: ${CMAKE_SYSTEM_NAME} + Compiler: + Build type: ${CMAKE_BUILD_TYPE} + C compiler: ${CMAKE_C_COMPILER} + CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS} + C++ compiler: ${CMAKE_CXX_COMPILER} + CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS} + EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS_${_build_type}} ${CMAKE_EXE_LINKER_FLAGS} + WARNCFLAGS: ${WARNCFLAGS} + CXX1XCXXFLAGS: ${CXX1XCXXFLAGS} + CMAKE_MSVC_RUNTIME_LIBRARY: ${CMAKE_MSVC_RUNTIME_LIBRARY} + Libs: + fmt: ${fmt_FOUND} [${fmt_VERSION}] (DIR='${fmt_DIR}') + OpenSSL: ${OpenSSL_FOUND} [${OPENSSL_VERSION}] (LIBS='${OPENSSL_LIBRARIES}') + Zlib: ${ZLIB_FOUND} [${ZLIB_VERSION_STRING}] (LIBS='${ZLIB_LIBRARIES}') + Boost ${Boost_FOUND} [${Boost_VERSION_STRING}] (DIR='${Boost_DIR}') + Boost libs ${Boost_LIBRARIES} + gRPC ${gRPC_FOUND} [${gRPC_VERSION}] (LIBS='${_grpc_libs}') + nlohmann ${nlohmann_json_FOUND} [${nlohmann_json_VERSION}] (HEADERS='${nlohmann_json_DIR}') + sqlite3 ${SQLite3_FOUND} [${SQLite3_VERSION}] (LIBS='${SQLite3_LIBRARIES}') + Options: + VEREIGN_USE_LLD ${VEREIGN_USE_LLD} + VEREIGN_USE_PRECOMPILED_HEADERS ${VEREIGN_USE_PRECOMPILED_HEADERS} + VEREIGN_USE_TIME_TRACE ${VEREIGN_USE_TIME_TRACE} + VEREIGN_ENABLE_BENCHMARKING ${VEREIGN_ENABLE_BENCHMARKING} +") diff --git a/cpp/README.md b/cpp/README.md new file mode 100644 index 0000000000000000000000000000000000000000..46786580c683df123679a7234823655ad1a8ab7f --- /dev/null +++ b/cpp/README.md @@ -0,0 +1,91 @@ +# Vereign C++ Client Library + +## Overview + +Vereign C++ Client Library allows for digitally signing emails and documents, data encryption, +and key-based authentication. + +FIXME: Add more info about the software architecture. + +## Build + +The project uses git submodules for the gRPC protobuf definitions. + +So after cloning run `git submodule update --init`. + +The protobuf definitions and the generated C++ gRPC client/server are located in +[https://code.vereign.com/code/vcl-proto](https://code.vereign.com/code/vcl-proto) project and +are added as submodule at `proto` subdir. + +### Windows + +You need Visual Studio 2019 or alternatively install just the build tools and c++ compiler - go to +[https://visualstudio.microsoft.com/downloads/](https://visualstudio.microsoft.com/downloads/) +then scroll and open `Tools for Visual Studio 2019` and download/install `Visual Studio Build Tools 2019`. +The 2019 build tools include cmake, and currently it is 3.16.19112601-MSVC_2. +They also include Ninja build tool. + +**NOTE: Currently only builds with Ninja are tested under Windows** + +#### Build the third party dependencies + +Go to the `vcl/cpp` directory. + +First configure the cmake build. +Open `x64 Native Tools Command Prompt` it is preconfigured with all the needed tools including cmake +and ninja. + +```shell +> mkdir cmake-build-vendor-debug +> cd cmake-build-vendor-debug +> cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ../vendor +``` + +Next build the dependencies. +Note that this will take a while, and that it could be slowed a lot by the windows defender. +You can configure the windows defender to the project directory. + +```shell +> ninja +``` + +#### Build the vereign library + +Go to the `vcl/cpp` directory. + +``` +> mkdir cmake-build-debug +> cd cmake-build-debug +> cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug .. +> ninja vereign -v +``` + +The `vereign.dll` will be created inside `cmake-build-debug\bin\Debug` directory. + +### C API Usage + +For C/C++ users, the library has a single header file located in `include\vereign` directory. + +The service is started with `vereign_service_start`. This will start a gRPC server in its own thread(s). +The call returns immediately. + +After the service is started you can use your favorite language generated gRPC client to communicate +with the service. + +Use the `vereign_service_selected_port` function to get the listen port of the gRPC server. + +When you are finished with the service, for example upon shutdown of the application, one must use +the `vereign_service_shutdown` API. It will shutdown the service and free any acquired resources. +Afterwards the returned `vereign_service` pointer from the start call is invalid and must not be used anymore. + +For more detailed info check the source code documentation in the header +[include/vereign/vereign.h](cpp/include/vereign/vereign.h). +You can also look at C++ usage example in the C API integration test +[tests/integration/integration_test.cc](cpp/tests/integration/integration_test.cc). + +The gRPC APIs are located here [https://code.vereign.com/code/vcl-proto/-/tree/master/proto%2Fvereign%2Fclient_library](https://code.vereign.com/code/vcl-proto/-/tree/master/proto%2Fvereign%2Fclient_library). + +FIXME: Add sample integration - for example for C#. + + +TODO: Add more documentation/reference; instructions to generate doxygen reference. diff --git a/cpp/cmake/Helpers.cmake b/cpp/cmake/Helpers.cmake new file mode 100644 index 0000000000000000000000000000000000000000..53421019a2e82ed27516e5d753b6886739f472e3 --- /dev/null +++ b/cpp/cmake/Helpers.cmake @@ -0,0 +1,8 @@ + +function(dump_vars) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") + endforeach() +endfunction() diff --git a/cpp/cmake/ProtoGenerate.cmake b/cpp/cmake/ProtoGenerate.cmake new file mode 100644 index 0000000000000000000000000000000000000000..cb819b7888213d31771fae9e88acf358d2692157 --- /dev/null +++ b/cpp/cmake/ProtoGenerate.cmake @@ -0,0 +1,79 @@ + +function(target_proto_generate) + cmake_parse_arguments( + PROTO + "" + "TARGET;GEN_DIR;SRC_DIR" + "DEFINITIONS" + ${ARGN} + ) + + message(STATUS "proto target: ${PROTO_TARGET}") + message(STATUS " proto output dir: ${PROTO_GEN_DIR}") + message(STATUS " proto src dir: ${PROTO_SRC_DIR}") + message(STATUS " ${PROTO_DEFINITIONS}") + + foreach (proto ${PROTO_DEFINITIONS}) + get_filename_component(_proto ${proto} ABSOLUTE) + get_filename_component(_proto_path "${_proto}" PATH) + get_filename_component(_proto_name ${proto} NAME_WLE) + string(REPLACE ${PROTO_SRC_DIR} ${PROTO_GEN_DIR} _proto_gen_path ${_proto_path}) + + message(STATUS " proto generate [${_proto_name}] from ${_proto} to ${_proto_gen_path}") + + # Generated sources + set(_proto_src "${_proto_gen_path}/${_proto_name}.pb.cc") + set(_proto_hdr "${_proto_gen_path}/${_proto_name}.pb.h") + add_custom_command( + OUTPUT "${_proto_src}" "${_proto_hdr}" + COMMAND ${PROTOBUF_PROTOC} + ARGS + --cpp_out "${PROTO_GEN_DIR}" + --proto_path "${PROTO_SRC_DIR}" + -I "${_proto_path}" + "${_proto}" + DEPENDS "${_proto}") + + target_sources(${PROTO_TARGET} PRIVATE ${_proto_src}) + endforeach() +endfunction() + +function(target_grpc_generate) + cmake_parse_arguments( + PROTO + "" + "TARGET;GEN_DIR;SRC_DIR" + "DEFINITIONS" + ${ARGN} + ) + + message(STATUS "grpc target: ${PROTO_TARGET}") + message(STATUS " grpc output dir: ${PROTO_GEN_DIR}") + message(STATUS " grpc src dir: ${PROTO_SRC_DIR}") + + foreach (proto ${PROTO_DEFINITIONS}) + get_filename_component(_proto ${proto} ABSOLUTE) + get_filename_component(_proto_path "${_proto}" PATH) + get_filename_component(_proto_name ${proto} NAME_WLE) + string(REPLACE ${PROTO_SRC_DIR} ${PROTO_GEN_DIR} _proto_gen_path ${_proto_path}) + + message(STATUS " grpc generate [${_proto_name}] from ${_proto} to ${_proto_gen_path}") + + # Generated sources + set(_proto_src "${_proto_gen_path}/${_proto_name}.grpc.pb.cc") + set(_proto_hdr "${_proto_gen_path}/${_proto_name}.grpc.pb.h") + add_custom_command( + OUTPUT "${_proto_src}" "${_proto_hdr}" + COMMAND ${PROTOBUF_PROTOC} + ARGS + --grpc_out "${PROTO_GEN_DIR}" + --cpp_out "${PROTO_GEN_DIR}" + --proto_path "${PROTO_SRC_DIR}" + -I "${_proto_path}" + --plugin=protoc-gen-grpc="${GRPC_CPP_PLUGIN_EXECUTABLE}" + "${_proto}" + DEPENDS "${_proto}") + + target_sources(${PROTO_TARGET} PRIVATE ${_proto_src}) + endforeach() +endfunction() diff --git a/cpp/cmake/sanitize_blacklist.txt b/cpp/cmake/sanitize_blacklist.txt new file mode 100644 index 0000000000000000000000000000000000000000..a71463c25ba5b5f8834bfc065b8e1e77ee95bde5 --- /dev/null +++ b/cpp/cmake/sanitize_blacklist.txt @@ -0,0 +1,8 @@ +# fun:*main* +# fun:*foo* +# src:*csandbox.cc +fun:*registerReporter* +fun:_ZN5Catch16ReporterRegistry16registerReporterERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_16IReporterFactoryEE +fun:_ZN5Catch12_GLOBAL__N_111RegistryHub16registerReporterERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_16IReporterFactoryEE +fun:_ZThn8_N5Catch12_GLOBAL__N_111RegistryHub16registerReporterERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_16IReporterFactoryEE +# src:../tests/init_tests.cc diff --git a/cpp/docs/doxygen.config b/cpp/docs/doxygen.config new file mode 100644 index 0000000000000000000000000000000000000000..2be52903637d12d6ec4ae7903baa7660b45382de --- /dev/null +++ b/cpp/docs/doxygen.config @@ -0,0 +1,2497 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Vereign C++ Client Library" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs/doxy + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = +ALIASES += boostlib="https://www.boost.org/doc/libs/1_73_0" + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = src +INPUT += include + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + + # *.cc \ +FILE_PATTERNS = *.c \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = src/vereign/proto/googleapis +EXCLUDE += src/vereign/proto/code.vereign.com + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# The default value is: YES. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_FOOTER = + +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES, to get a +# higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BATCHMODE = NO + +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HIDE_INDICES = NO + +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BIB_STYLE = plain + +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_EXTENSIONS_FILE = + +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# classes and files. +# The default value is: NO. + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_EXTENSION = .3 + +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_OUTPUT = xml + +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. + +GENERATE_DOCBOOK = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_OUTPUT = docbook + +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sf.net) file that captures the +# structure of the code including all documentation. Note that this feature is +# still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO, the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES, the include files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. +# The default value is: NO. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. + +EXTERNAL_GROUPS = YES + +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# If set to YES the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: YES. + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NUM_THREADS = 0 + +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, +# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, +# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_CLEANUP = YES diff --git a/cpp/include/vereign/vereign.h b/cpp/include/vereign/vereign.h new file mode 100644 index 0000000000000000000000000000000000000000..f77824c16926b03dacd6b6cb9366d53a538474c6 --- /dev/null +++ b/cpp/include/vereign/vereign.h @@ -0,0 +1,128 @@ +#ifndef __VEREIGN_VEREIGN_H +#define __VEREIGN_VEREIGN_H + +#ifdef _WIN32 + #ifdef WIN_EXPORT + #define PUBLIC_API __declspec(dllexport) + #else + #define PUBLIC_API __declspec(dllimport) + #endif +#else + #define PUBLIC_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Error codes. + */ +enum vereign_error_code { + VEREIGN_ERR_INTERNAL = 1, + VEREIGN_ERR_GRPC_BIND_FAILED = 2 +}; + +/** + * Error object used for the error handling of the APIs. + * + * The error has a code and error message, which can be obtained by using the corresponding + * methods ... + */ +typedef struct vereign_error vereign_error; + +/** + * Destroys ::vereign_error object. + * + * Error objects are created by the API calls as result of failures. + * + * It is safe to call it with null err. + * + * @param err The error to destroy. + */ +PUBLIC_API void vereign_error_free(vereign_error* err); + +/** + * Returns error object's code. + * + * @param err The error object. + * @returns the error code. + */ +PUBLIC_API int vereign_error_code(vereign_error* err); + +/** + * Returns error object's message. + * + * @param err The error object. + * @returns the error message. + */ +PUBLIC_API const char* vereign_error_message(vereign_error* err); + +/** + * Provides the gRPC API services. + * + * The object is created with ::vereign_service_start method, and shutdown with + * ::vereign_service_shutdown. + * + * All object's methods are named with prefix `vereign_service_`. + */ +typedef struct vereign_service vereign_service; + +// FIXME: generate SSL keys for gRPC communication. +/** + * Creates ::vereign_service object and starts the gRPC API. + * + * The returned ::vereign_service object must be destroyed with ::vereign_service_shutdown method. + * After successful start, the gRPC bind port can be retrieved with the + * ::vereign_service_selected_port method. This is useful if the `listen_address` is in the form + * "<host>:" (for example "localhost:"), in which case the port is not provided by the user but + * from the OS. + * + * When the gRPC server cannot bind, `err` will have code VEREIGN_ERR_GRPC_BIND_FAILED. + * Any other failures will set `err` with code VEREIGN_ERR_INTERNAL. + * + * **NOTE: On failure the `err` object must be freed with vereign_error_free method.** + * + * @param listen_address gRPC listen address, for example "localhost:". + * @param vereign_host Vereign restapi host. + * @param vereign_port Vereign restapi port - https, 443... + * @param storage_path Full path to directory where the storage files will stay. + * If the `storage_path` is `nullptr`, a default will be used. Under linux this default is + * `$HOME/vereign`, and under windows it is `C:\Users\<user>\AppData\Local\vereign`. + * + * @param err On failure err is initialized with the reason of the failure, + * otherwise err is set to nullptr. + * @returns vereign_service object if the gRPC is up and running, otherwise returns nullptr. + */ +PUBLIC_API vereign_service* vereign_service_start( + const char* listen_address, + const char* vereign_host, + const char* vereign_port, + const char* storage_path, + vereign_error** err +); + +/** + * Retruns the port number selected by the gRPC server of the service. + * + * Must be called after the service is created with ::vereign_service_start, and before + * it is destroyed with ::vereign_service_shutdown. + * + * @returns the port number selected by the gRPC server of the service. + */ +PUBLIC_API int vereign_service_selected_port(vereign_service* service); + +/** + * Stops and destroys the vereign service. + * + * It is safe to call with null `service`. + * + * @param service The object returned by the ::vereign_service_start function. + */ +PUBLIC_API void vereign_service_shutdown(vereign_service* service); + +#ifdef __cplusplus +}; +#endif + +#endif // __VEREIGN_VEREIGN_H diff --git a/cpp/proto b/cpp/proto new file mode 160000 index 0000000000000000000000000000000000000000..3e82fc7d60056e08b041577e332f1ec5029633ee --- /dev/null +++ b/cpp/proto @@ -0,0 +1 @@ +Subproject commit 3e82fc7d60056e08b041577e332f1ec5029633ee diff --git a/cpp/src/CMakeLists.txt b/cpp/src/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..520ad243c7ff982e01c06d0d7539274c96135545 --- /dev/null +++ b/cpp/src/CMakeLists.txt @@ -0,0 +1,172 @@ +if (fmt_FOUND) + get_target_property(FMT_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES) +endif() + +if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + add_definitions(-DNOGDI -DNOMINMAX) +endif() + +add_definitions(-DBOOST_FILESYSTEM_NO_DEPRECATED) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/src + ${VENDOR_INSTALL_DIR}/include + ${Boost_INCLUDE_DIRS} + ${FMT_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/proto/cpp +) + +file(GLOB PROTO_SRC ${CMAKE_SOURCE_DIR}/proto/cpp/vereign/client_library/*.cc) +list(APPEND PROTO_SRC + ${CMAKE_SOURCE_DIR}/proto/cpp/google/api/annotations.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/google/api/http.pb.cc + + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/versions/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/audit-log-agent/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/entities-management-agent/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/hyperledger-agent/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/image-storage-agent/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/restful-api/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/signing-service-agent/api/api.pb.cc + ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/passport-generation-agent/api/api.pb.cc +) +add_library(vereignproto STATIC ${PROTO_SRC}) +set_property(TARGET vereignproto PROPERTY POSITION_INDEPENDENT_CODE ON) + +target_link_libraries( + vereignproto + protobuf::libprotobuf + OpenSSL::SSL + OpenSSL::Crypto + $<$<CXX_COMPILER_ID:MSVC>:CRYPT32.LIB> +) +if (VEREIGN_USE_PRECOMPILED_HEADERS) + file(GLOB PROTO_HEADERS ${CMAKE_SOURCE_DIR}/proto/cpp/vereign/client_library/*pb.h) + target_precompile_headers(vereignproto PUBLIC ${PROTO_HEADERS}) +endif() + +set(VEREIGNLIB_SRC + vereign/core/rand.cc + vereign/core/string.cc + vereign/fs/util.cc + vereign/fs/operations.cc + vereign/fs/path.cc + + vereign/restapi/detail/http_reader.cc + vereign/restapi/client.cc + + vereign/grpc/gen/gen.cc + vereign/grpc/json/encoder.cc + vereign/grpc/service_registry.cc + vereign/grpc/server.cc + + vereign/sqlite/statement.cc + vereign/sqlite/connection.cc + + vereign/bytes/view_dump.cc + vereign/bytes/buffer.cc + + vereign/encoding/binary.cc + vereign/encoding/base64.cc + vereign/encoding/hex.cc + + vereign/crypto/rand.cc + vereign/crypto/aes.cc + vereign/crypto/rsa.cc + vereign/crypto/bio.cc + vereign/crypto/digest.cc + + vereign/kvstore/lock.cc + vereign/kvstore/detail/base_crypto_storage.cc + vereign/kvstore/sqlite_storage.cc + vereign/kvstore/crypto_storage.cc + vereign/kvstore/detail/value_encoder.cc + + vereign/identity/provider.cc + + vereign/service/identity_service.cc +) + + +if (LINUX) + list(APPEND VEREIGNLIB_SRC + vereign/kvstore/detail/linux_crypto_storage.cc + ) +elseif (WIN32) + list(APPEND VEREIGNLIB_SRC + vereign/ncrypt/errors.cc + vereign/ncrypt/unique_ptr.cc + vereign/ncrypt/rsa.cc + vereign/kvstore/detail/win_crypto_storage.cc + ) +endif() + +file(GLOB GENERATED_SERVICES_SRC vereign/service/gen/*.cc) +list(APPEND VEREIGNLIB_SRC ${GENERATED_SERVICES_SRC}) + +add_library(vereignlib STATIC ${VEREIGNLIB_SRC}) +set_property(TARGET vereignlib PROPERTY POSITION_INDEPENDENT_CODE ON) +target_link_libraries(vereignlib PRIVATE + nlohmann_json::nlohmann_json +) +target_link_libraries(vereignlib PUBLIC + vereignproto + fmt::fmt + gRPC::grpc++_reflection + gRPC::grpc++ + Boost::filesystem + $<$<CXX_COMPILER_ID:MSVC>:Boost::date_time> + SQLite::SQLite3 + $<$<CXX_COMPILER_ID:MSVC>:ncrypt.lib> + $<$<CXX_COMPILER_ID:MSVC>:cryptui.lib> +) + +add_library(vereign SHARED + vereign/vereign.cc +) +target_include_directories(vereign + PRIVATE ${CMAKE_SOURCE_DIR}/include +) +target_link_libraries(vereign PRIVATE + vereignlib +) +if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # Set the DLLEXPORT variable to export symbols + target_compile_definitions(vereign PRIVATE WIN_EXPORT) +endif() + +set(csandbox_sources + csandbox.cc +) + +#add_library(csandboxlib STATIC ${csandboxlib_src}) +#target_link_libraries(csandboxlib ${LIBS}) + +add_executable(csandbox ${csandbox_sources}) + +target_link_libraries(csandbox + PRIVATE vereignlib + $<$<CXX_COMPILER_ID:MSVC>:Boost::date_time> + Boost::filesystem + # Boost::file + # Boost::thread + # vereign + # fmt::fmt + # Boost::regex + # Threads::Threads + # OpenSSL::SSL + # $<$<CXX_COMPILER_ID:MSVC>:CRYPT32.LIB> +) +if (VEREIGN_USE_TIME_TRACE AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + target_compile_options(csandbox + PRIVATE "-ftime-trace" + ) +endif() + +# Generates the gRPC and Vereign services source code. +add_custom_target( + vcl-gen + COMMAND vcl-gen generate -v --templates-path=templates --output-path src + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) diff --git a/cpp/src/csandbox.cc b/cpp/src/csandbox.cc new file mode 100644 index 0000000000000000000000000000000000000000..70382932622480f68ad621fb1f2582e0999d247d --- /dev/null +++ b/cpp/src/csandbox.cc @@ -0,0 +1,17 @@ +#include "vereign/crypto/rand.hh" +#include <vereign/bytes/view.hh> +#include <vereign/bytes/buffer.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/fs/path.hh> +#include <vereign/fs/util.hh> +#include <iostream> + +auto main(int argc, char** argv) -> int { + argc = 0; + argv = nullptr; + auto path = vereign::fs::TempFilePath(vereign::fs::path::Join("tmp", "foo"), "test_db_"); + + std::cout << path << std::endl; + + return 0; +} diff --git a/cpp/src/vereign/bytes/buffer.cc b/cpp/src/vereign/bytes/buffer.cc new file mode 100644 index 0000000000000000000000000000000000000000..546a4228f372ea30a4dc914b5c66f054ce1c1527 --- /dev/null +++ b/cpp/src/vereign/bytes/buffer.cc @@ -0,0 +1,180 @@ +#include <vereign/bytes/buffer.hh> + +#include <vereign/bytes/errors.hh> + +#include <memory> + +namespace vereign::bytes { + +Buffer::Buffer() noexcept + : cap_{0}, + size_{0}, + data_{nullptr} +{ +} + +Buffer::Buffer(std::size_t cap) + : cap_{cap}, + size_{0}, + data_{nullptr} +{ + if (cap == 0) { + return; + } + + data_ = reinterpret_cast<uint8_t*>(std::malloc(cap)); + if (data_ == nullptr) { + throw std::bad_alloc{}; + } +} + +Buffer::Buffer(bytes::View src) + : cap_{src.Size()}, + size_{src.Size()}, + data_{nullptr} +{ + if (size_ == 0) { + return; + } + + data_ = reinterpret_cast<uint8_t*>(std::malloc(cap_)); + if (data_ == nullptr) { + throw std::bad_alloc{}; + } + + std::memcpy(data_, src.Data(), src.Size()); +} + +Buffer::Buffer(Buffer&& other) noexcept + : cap_{other.cap_}, + size_{other.size_}, + data_{other.data_} +{ + other.cap_ = 0; + other.size_ = 0; + other.data_ = nullptr; +} + +auto Buffer::operator=(Buffer&& other) noexcept -> Buffer& { + std::swap(cap_, other.cap_); + std::swap(size_, other.size_); + std::swap(data_, other.data_); + + return *this; +} + + +Buffer::~Buffer() { + std::free(data_); +} + + +auto Buffer::Size() const noexcept -> std::size_t { + return size_; +} + +auto Buffer::FreeCap() const noexcept -> std::size_t { + return cap_ - size_; +} + +auto Buffer::Cap() const noexcept -> std::size_t { + return cap_; +} + +auto Buffer::begin() noexcept -> uint8_t* { + return data_; +} + +auto Buffer::begin() const noexcept -> const uint8_t* { + return data_; +} + +auto Buffer::end() noexcept -> uint8_t* { + return data_ + size_; +} + +auto Buffer::end() const noexcept -> const uint8_t* { + return data_ + size_; +} + +void Buffer::Reserve(std::size_t size) { + if (cap_ == 0) { + cap_ = size; + data_ = reinterpret_cast<uint8_t*>(std::malloc(cap_)); + if (data_ == nullptr) { + throw std::bad_alloc{}; + } + + return; + } + + if (size <= cap_ - size_) { + return; + } + + auto cap = cap_ * 2; + if (size > cap - size_) { + cap = size_ + size; + } + + auto newData = reinterpret_cast<uint8_t*>(std::realloc(data_, cap)); + if (newData == nullptr) { + throw std::bad_alloc{}; + } + + data_ = newData; + cap_ = cap; +} + +void Buffer::Reset() { + size_ = 0; +} + +void Buffer::IncSize(std::size_t val) { + if (size_ + val > cap_) { + throw IncrementOutOfBounds{}; + } + + size_ += val; +} + +auto Buffer::WriteWithinCap(bytes::View src) noexcept -> std::size_t { + auto size = std::min(cap_ - size_, src.Size()); + + std::memcpy(data_ + size_, src.Data(), size); + size_ += size; + + return size; +} + +auto Buffer::Write(bytes::View src) -> std::size_t { + Reserve(src.Size()); + + return WriteWithinCap(src); +} + +auto Buffer::View() const noexcept -> bytes::View { + return bytes::View{data_, size_}; +} + +auto Buffer::View(std::size_t start) const noexcept -> bytes::View { + return bytes::View{data_, size_}.Slice(start); +} + +auto Buffer::operator[](std::size_t index) -> uint8_t& { + if (index >= cap_) { + throw IndexOutOfBounds{}; + } + + return data_[index]; +} + +auto Buffer::operator[](std::size_t index) const -> const uint8_t& { + if (index >= cap_) { + throw IndexOutOfBounds{}; + } + + return data_[index]; +} + +} // namespace vereign::bytes diff --git a/cpp/src/vereign/bytes/buffer.hh b/cpp/src/vereign/bytes/buffer.hh new file mode 100644 index 0000000000000000000000000000000000000000..6d0e5c7a8bddee458283afc810b3b79765e76968 --- /dev/null +++ b/cpp/src/vereign/bytes/buffer.hh @@ -0,0 +1,275 @@ +#ifndef __VEREIGN_BYTES_BUFFER_HH +#define __VEREIGN_BYTES_BUFFER_HH + +#include <vereign/bytes/view.hh> +#include <cstring> + +namespace vereign::bytes { + +/** + * Dynamically expandable memory buffer. + * + * The buffer is a 3-tuple - pointer, size and capacity. + * Typically used in functions for output parameters and return values. + * Provides API that is easy to use with C APIs. + * + * The buffer is move only. + */ +class Buffer { +public: + /** + * Creates empty buffer. + */ + Buffer() noexcept; + + /** + * Creates a buffer with reserved memory capacity. + * + * The size of the buffer is zero. + * + * @param cap The capacity of the buffer. + * + * @throws std::bad_alloc when memory reservation fails. + */ + Buffer(std::size_t cap); + + /** + * Creates a buffer by copying from source bytes view. + * + * @param src The source that will be copied from. + * + * @throws std::bad_alloc when memory reservation fails. + */ + Buffer(View src); + + /** + * The buffer is movable. + */ + Buffer(Buffer&& other) noexcept; + auto operator=(Buffer&& other) noexcept -> Buffer&; + + // disable copying + Buffer(const Buffer&) = delete; + auto operator=(const Buffer&) -> Buffer& = delete; + + /** + * Frees the buffer memory. + */ + ~Buffer(); + + /** + * Returns a pointer to the first byte of the buffer. + * + * Buffer::begin(), Buffer::end() pair is useful for range loops. + * + * Example: + * @code + * auto buf = bytes::Buffer{bytes::View("foo")}; + * for (const auto& byte : buf) { + * byte = 'x'; + * } + * + * assert(buf.View().String() == "xxx"); + * @endcode + */ + auto begin() noexcept -> uint8_t*; + + /** + * Returns a pointer to the first byte of the buffer. + * + * Buffer::begin(), Buffer::end() pair is useful for range loops. + * + * Example: + * @code + * auto buf = bytes::Buffer{bytes::View("foo bar")}; + * std::string s; + * + * for (const auto& byte : buf) { + * s += byte; + * } + * + * assert(s == "foo bar"); + * @endcode + */ + auto begin() const noexcept -> const uint8_t*; + + /** + * Returns a pointer to the byte following the last byte in the buffer. + * + * Note that this is the last byte in the range [0, size). + * It is often used when calling C APIs. + * + * Example: + * @code + * auto buf = bytes::Buffer{bytes::View("foo bar")}; + * + * buf.Reserve(4); + * std::strncpy((char*)buf.end(), " baz", 4); + * buf.IncSize(4); + * + * assert(buf.View().String() == "foo bar baz"); + * @endcode + */ + auto end() noexcept -> uint8_t*; + + /** + * Returns a read only pointer to the byte following the last byte in the buffer. + * + * Note that this is the last byte in the range [0, size). + */ + auto end() const noexcept -> const uint8_t*; + + /** + * Access a byte in the range of [0, cap). + * + * @param index The index of the byte to access. + * + * @throws std::runtime_error when the passed index is out of bounds. + */ + auto operator[](std::size_t index) -> uint8_t&; + + /** + * Read only access a byte in the range of [0, cap). + * + * @param index The index of the byte to access. + * + * @throws std::runtime_error when the passed index is out of bounds. + */ + auto operator[](std::size_t index) const -> const uint8_t&; + + /** + * Retrieve buffer size. + * + * @returns the buffer size. + */ + auto Size() const noexcept -> std::size_t; + + /** + * Retrieve buffer capacity. + * + * @returns the buffer capacity. + */ + auto Cap() const noexcept -> std::size_t; + + /** + * Reserve memory, so that there is at least `size` free capacity. + * + * If there is already enough free capacity, no memory allocation is done. + * The allocated memory may be bigger than what is needed. + * + * If the call is successful then it is guaranteed that `this->FreeCap() >= size`. + * + * Example: + * @code + * auto buf = bytes::Buffer{bytes::View("foo bar")}; + * + * buf.Reserve(4); // ensure there will be a free capacity for 4 bytes + * std::strncpy((char*)buf.end(), " baz", 4); // copy the bytes + * buf.IncSize(4); // update the buffer size with the newly written bytes + * + * assert(buf.View().String() == "foo bar baz"); + * @endcode + * + * @param size The desired free capacity. + * + * @throws std::bad_alloc when memory allocation fails. + */ + void Reserve(std::size_t size); + + /** + * Sets the buffer size to zero. + * + * This does not free any memory, so the capacity stays the intact, and the buffer can be reused. + */ + void Reset(); + + /** + * Increments the size of the buffer. + * + * It is typically used after some function has written bytes to the end of the buffer. + * + * @param val The value that will be added to the current size. + */ + void IncSize(std::size_t val); + + /** + * Retrieve the buffer free capacity. + * + * This is equal to `this->Cap() - this->Size()`. + */ + auto FreeCap() const noexcept -> std::size_t; + + /** + * Adds bytes up to the currently available buffer capacity. + * + * After the operation succeeds, the buffer size will be incremented with the number of bytes + * that have been copied. + * + * Example: + * @code + * auto buf = bytes::Buffer{3}; + * buf.WriteWithinCap(bytes::View("foo bar")); + * + * // only 3 bytes are written + * assert(buf.View.String() == "foo"); + * @endcode + * + * @param src The source that will be appended to the buffer. + * @returns The amount of bytes that were actually copied into the buffer. + */ + auto WriteWithinCap(bytes::View src) noexcept -> std::size_t; + + /** + * Adds a source view of bytes to the buffer. + * + * If the buffer does not have enough capacity, it will be expanded. + * + * Example: + * @code + * auto buf = bytes::Buffer{3}; + * buf.WriteWithinCap(bytes::View("foo bar")); + * + * // all bytes are written + * assert(buf.View.String() == "foo bar"); + * @endcode + * + * @param The source that will be appended to the buffer. + * @returns The amount of bytes that were copied into the buffer. That is equal to src.Size(). + */ + auto Write(bytes::View src) -> std::size_t; + + /** + * Retrieve a read only view of the buffer. + * + * Example: + * @code + * auto buf = bytes::Buffer{bytes::View("123")}; + * assert(buf.View().String() == "123"); + * @endcode + * + * @returns a read only view range [0, this->Size()). + */ + auto View() const noexcept -> bytes::View; + + /** + * Retrieve a read only view of the buffer staring from a given offset. + * + * Example: + * @code + * auto buf = bytes::Buffer{bytes::View("123")}; + * assert(buf.View(1).String() == "23"); + * @endcode + * + * @returns a read only view range [start, this->Size()). + */ + auto View(std::size_t start) const noexcept -> bytes::View; + +private: + std::size_t cap_; + std::size_t size_; + uint8_t* data_; +}; + +} // namespace vereign::bytes + +#endif // __VEREIGN_BYTES_BUFFER_HH diff --git a/cpp/src/vereign/bytes/bytes.hh b/cpp/src/vereign/bytes/bytes.hh new file mode 100644 index 0000000000000000000000000000000000000000..437a692f7d9b5cd753836a6bfc9d1c591fa5844a --- /dev/null +++ b/cpp/src/vereign/bytes/bytes.hh @@ -0,0 +1,45 @@ +#ifndef __VEREIGN_BYTES_BYTES_HH +#define __VEREIGN_BYTES_BYTES_HH + +#include <vereign/bytes/view.hh> +#include <cstring> + +namespace vereign::bytes { + +class Bytes { +public: + Bytes(uint8_t* data, std::size_t size) + : size_{size}, + data_{data} + {} + + Bytes(const Bytes&) = default; + auto operator=(const Bytes&) -> Bytes& = default; + + auto Data() const -> uint8_t* { + return data_; + } + + auto CharData() const -> unsigned char* { + return data_; + } + + auto Size() const -> std::size_t { + return size_; + } + +private: + std::size_t size_; + uint8_t* data_; +}; + +inline auto Copy(Bytes dst, View src) noexcept -> std::size_t { + auto size = std::min(src.Size(), dst.Size()); + std::memcpy(dst.Data(), src.Data(), size); + + return size; +} + +} // namespace vereign::bytes + +#endif // __VEREIGN_BYTES_BYTES_HH diff --git a/cpp/src/vereign/bytes/errors.hh b/cpp/src/vereign/bytes/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..ac7e9e66a800a30f340e6b3f0de9c9cbf959cabd --- /dev/null +++ b/cpp/src/vereign/bytes/errors.hh @@ -0,0 +1,35 @@ +#ifndef __VEREIGN_BYTES_ERRORS_HH +#define __VEREIGN_BYTES_ERRORS_HH + +#include <stdexcept> + +namespace vereign::bytes { + +class Error : public std::runtime_error { +public: + Error(const std::string& what) + : std::runtime_error{what} + { + + } +}; + +class IndexOutOfBounds : public Error { +public: + IndexOutOfBounds() + : Error{"index out of bounds"} + { + } +}; + +class IncrementOutOfBounds : public Error { +public: + IncrementOutOfBounds() + : Error{"cannot increment size pass the capacity"} + { + } +}; + +} // namespace vereign::bytes + +#endif // __VEREIGN_BYTES_ERRORS_HH diff --git a/cpp/src/vereign/bytes/view.hh b/cpp/src/vereign/bytes/view.hh new file mode 100644 index 0000000000000000000000000000000000000000..4520934c927170ed79682ab95d9f9ed5e430dee8 --- /dev/null +++ b/cpp/src/vereign/bytes/view.hh @@ -0,0 +1,211 @@ +#ifndef __VEREIGN_BYTES_VIEW_HH +#define __VEREIGN_BYTES_VIEW_HH + +#include <vereign/bytes/errors.hh> + +#include <cstring> +#include <string> +#include <string_view> +#include <stdexcept> +#include <algorithm> + +namespace vereign::bytes { + +/** + * Bytes view represents a read only access to a range of bytes. + * + * The View is a 2-tuple with pointer and size. + * Typically used in functions for input parameters. + * + * **NOTE: The View does not own the memory that it references.** + */ +class View { +public: + /** + * Creates empty view. + */ + View() = default; + + /** + * Creates a view from raw pointer and a size. + * + * @param data Pointer to the memory. + * @param size The size of the memory. + */ + View(const uint8_t* data, std::size_t size) noexcept + : size_{size}, + data_{data} + { + } + + /** + * Create a view from a string view. + * + * @param str The input string view. + */ + View(std::string_view str) noexcept + : size_{str.length()}, + data_{str.length() > 0 ? reinterpret_cast<const uint8_t*>(str.data()): nullptr} + { + } + + /** + * Creates a view from wide string view. + * + * @param str The input string. + */ + View(std::wstring_view str) noexcept + : size_{str.length() * sizeof(wchar_t)}, + data_{size_ > 0 ? reinterpret_cast<const uint8_t*>(str.data()): nullptr} + { + } + + /** + * Creates a view from void pointer and a size. + * + * @param data Pointer to the memory. + * @param size The size of the memory. + */ + View(const void* ptr, std::size_t size) noexcept + : size_{size}, + data_{static_cast<const uint8_t*>(ptr)} + { + } + + // default copyable. + View(const View&) = default; + auto operator=(const View&) -> View& = default; + + /** + * Slice returns a new view in the interval [start, size). + * + * If the start is bigger than the size of the slice it returns empty view. + * + * @param start The beginning of the new View. + * @returns a new view in the interval [start, size). + */ + auto Slice(std::size_t start) const -> View { + if (start >= size_) { + return View(data_, 0); + } + + return View(data_ + start, size_ - start); + } + + /** + * Slice returns a new view in the interval [start, end). + * + * If the start is bigger than the size of the slice it returns empty view. + * If the end is bigger than the size of the slice it returns [start, size). + * + * @param start The beginning of the new View. + * @returns a new view in the interval [start, size). + */ + auto Slice(std::size_t start, std::size_t end) const -> View { + if (start >= size_) { + return View(data_, 0); + } + + return View(data_ + start, std::min(size_, end) - start); + } + + /** + * Retrieve a pointer to the data. + * + * @returns a pointer to the data. + */ + auto Data() const noexcept -> const uint8_t* { + return data_; + } + + /** + * Retrieve a char pointer to the data. + * + * @returns a char pointer to the data. + */ + auto CharData() const noexcept -> const char* { + return reinterpret_cast<const char*>(data_); + } + + /** + * Retrieve a wide char pointer to the data. + * + * @returns a wide char pointer to the data. + */ + auto WideCharData() const noexcept -> const wchar_t* { + return reinterpret_cast<const wchar_t*>(data_); + } + + /** + * Retrieve view size. + * + * @returns view size. + */ + auto Size() const noexcept -> std::size_t { + return size_; + } + + /** + * Retrieve a string view of the data. + * + * @returns a string view of the data. + */ + auto String() const noexcept -> std::string_view { + return std::string_view{CharData(), size_}; + } + + /** + * Retrieve a wide string view of the data. + * + * @returns a wide string view of the data. + */ + auto WideString() const noexcept -> std::wstring_view { + return std::wstring_view{WideCharData(), size_/sizeof(wchar_t)}; + } + + /** + * Binary compare the contents of two views. + * + * @returns true if the views are of the same size and if all the bytes in the two views are equal. + */ + auto operator==(View other) const noexcept -> bool { + if (size_ != other.size_) { + return false; + } + + return std::memcmp(data_, other.data_, size_) == 0; + } + + /** + * Binary compare the contents of two views. + * + * @returns true if the views are of different size or if the bytes in the two views are not equal. + */ + auto operator!=(View other) const noexcept -> bool { + return !(*this == other); + } + + /** + * Access a single byte in the view. + * + * @param index The index of the byte that will be returned. + * @returns the byte at the specified index. + * + * @throws bytes::IndexOutOfBounds when the index is out of bounds. + */ + auto operator[](std::size_t index) const -> const uint8_t& { + if (index >= size_ ) { + throw IndexOutOfBounds{}; + } + + return data_[index]; + } + +private: + std::size_t size_ = 0; + const uint8_t* data_ = nullptr; +}; + +} // namespace vereign::bytes + +#endif // __VEREIGN_BYTES_VIEW_HH diff --git a/cpp/src/vereign/bytes/view_dump.cc b/cpp/src/vereign/bytes/view_dump.cc new file mode 100644 index 0000000000000000000000000000000000000000..7d892bb9e350710109b6b34d3472e7334fd3690e --- /dev/null +++ b/cpp/src/vereign/bytes/view_dump.cc @@ -0,0 +1,64 @@ +#include <vereign/bytes/view_dump.hh> + +#include <iomanip> + +namespace vereign::bytes { + +namespace detail { + +auto operator<<(std::ostream& os, const ViewDump& vd) -> std::ostream& { + if (vd.buf_.Size() == 0) { + os << "empty buffer\n"; + return os; + } + + core::IosFlagsLock os_flags(os); + + os << std::hex; + + for (std::size_t i = 0; i < vd.buf_.Size(); ++i) { + if (i % 16 == 0) { + os << "0x" << std::setfill('0') << std::setw(4) << i << ": "; + } + + if (i % 2 == 0) { + os << " "; + } + + os << std::setfill('0') << std::setw(2) << (unsigned int) vd.buf_.Data()[i]; + + if ((i != 0 && (i + 1) % 16 == 0) || i == vd.buf_.Size() - 1) { + int bytes = (i + 1) % 16 == 0 ? 0 : (16 - (i + 1) % 16); + os << " " << std::setfill(' ') << std::setw(2 * bytes + bytes / 2) << ""; + vd.printChars(os, i - i % 16); + os << "\n"; + } + } + + return os; +} + +void ViewDump::printChars(std::ostream& os, std::size_t offset) const { + auto seq = buf_.Slice(offset, offset + 16); + for (int i = 0; i < (int) seq.Size(); ++i) { + auto ch = seq.Data()[i]; + if (std::isprint(ch) != 0) { + os << ch; + } else { + os << "."; + } + } +} + +} // namespace detail + + +auto dump(View buf) -> detail::ViewDump { + return detail::ViewDump{buf}; +} + +auto dump(const Buffer& buf) -> detail::ViewDump { + return detail::ViewDump{buf.View()}; +} + +} // namespace vereign::bytes diff --git a/cpp/src/vereign/bytes/view_dump.hh b/cpp/src/vereign/bytes/view_dump.hh new file mode 100644 index 0000000000000000000000000000000000000000..47625f49016bee9fd8181dbc66746d54b7b3131f --- /dev/null +++ b/cpp/src/vereign/bytes/view_dump.hh @@ -0,0 +1,92 @@ +#ifndef __VEREIGN_BYTES_VIEW_DUMP_HH +#define __VEREIGN_BYTES_VIEW_DUMP_HH + +#include <vereign/bytes/view.hh> +#include <vereign/bytes/buffer.hh> +#include <vereign/core/io_flags_lock.hh> +#include <iostream> + +namespace vereign::bytes { + +namespace detail { +class ViewDump; +} + +/** + * Returns a view dump object that can write the view dump into std::ostream. + * + * The dump is the good old hexadecimal format. + * + * Example: + * @code + * std::string input{"foo bar"}; + * std::cout << bytes::dump(bytes::View(input)) << std::endl; + * + * // Output: + * // 0x0000: 666f 6f20 6261 72 foo bar + * + * auto buf = crypto::Rand(32); + * std::cout << bytes::dump(buf.View()) << std::endl; + * + * // Output: + * // 0x0000: 1666 855a 650a 7549 ed0f ec01 4d87 09bf .f.Ze.uI....M... + * // 0x0010: e644 dbc8 7943 37b4 185c dbab 4977 ff3f .D..yC7..\..Iw.? + * + * @endcode + */ +auto dump(View buf) -> detail::ViewDump; + +/** + * Returns a dump object that can write the buffer dump into std::ostream. + * + * The dump is the good old hexadecimal format. + * + * Example: + * @code + auto buf = bytes::Buffer{bytes::View("foo bar")}; + std::cout << bytes::dump(buf) << std::endl; + * + * // Output: + * // 0x0000: 666f 6f20 6261 72 foo bar + * + * auto buf = crypto::Rand(32); + * std::cout << bytes::dump(buf) << std::endl; + * + * // Output: + * // 0x0000: 1666 855a 650a 7549 ed0f ec01 4d87 09bf .f.Ze.uI....M... + * // 0x0010: e644 dbc8 7943 37b4 185c dbab 4977 ff3f .D..yC7..\..Iw.? + * + * @endcode + */ +auto dump(const Buffer& buf) -> detail::ViewDump; + +namespace detail { + +/** + * Helper for dumping a view to a std::ostream. + * + * Users typically will use the bytes::dump functions. + */ +class ViewDump { +public: + auto operator=(const ViewDump&) -> ViewDump& = delete; + + explicit ViewDump(View buf) + : buf_(buf) + { + } + + friend auto operator<<(std::ostream& os, const ViewDump& vd) -> std::ostream&; + +private: + void printChars(std::ostream& os, std::size_t offset) const; + +private: + View buf_; +}; + +} // namespace detail + +} // namespace vereign::bytes + +#endif // __VEREIGN_BYTES_VIEW_DUMP_HH diff --git a/cpp/src/vereign/core/io_flags_lock.hh b/cpp/src/vereign/core/io_flags_lock.hh new file mode 100644 index 0000000000000000000000000000000000000000..8a6feda70736c794162f434650c8cbbb34815691 --- /dev/null +++ b/cpp/src/vereign/core/io_flags_lock.hh @@ -0,0 +1,37 @@ +#ifndef __VEREIGN_CORE_IOS_FLAGS_LOCK_HH +#define __VEREIGN_CORE_IOS_FLAGS_LOCK_HH + +#include <ios> + +namespace vereign::core { + +/** + * Restore the ios flags of a stream when is it self destroyed. + */ +class IosFlagsLock { +public: + IosFlagsLock(const IosFlagsLock&) = delete; + auto operator=(const IosFlagsLock&) -> IosFlagsLock& = delete; + + IosFlagsLock(std::ios_base& str) + : str_(str), + flags_(str.flags()) + { + } + + ~IosFlagsLock() { + restore(); + } + + void restore() { + str_.flags(flags_); + } + +private: + std::ios_base& str_; + std::ios_base::fmtflags flags_; +}; + +} // namespace vereign::core + +#endif // __TURBO_CORE_IOS_FLAGS_LOCK_HH diff --git a/cpp/src/vereign/core/lock_guard.hh b/cpp/src/vereign/core/lock_guard.hh new file mode 100644 index 0000000000000000000000000000000000000000..9e310b21ca53ce5c53fea581a483ecaa568004f4 --- /dev/null +++ b/cpp/src/vereign/core/lock_guard.hh @@ -0,0 +1,28 @@ +#ifndef __VEREIGN_LOCK_GUARD_HH +#define __VEREIGN_LOCK_GUARD_HH + +namespace vereign::core { + +template <class Lockable> +class LockGuard { +public: + explicit LockGuard(Lockable& lock) + : lock_{lock} + { + lock.Lock(); + } + + ~LockGuard() noexcept { + lock_.Unlock(); + } + + LockGuard(const LockGuard&) = delete; + auto operator=(const LockGuard&) -> LockGuard& = delete; + +private: + Lockable& lock_; +}; + +} // namespace vereign::kvstore + +#endif // __VEREIGN_LOCK_GUARD_HH diff --git a/cpp/src/vereign/core/rand.cc b/cpp/src/vereign/core/rand.cc new file mode 100644 index 0000000000000000000000000000000000000000..7e65a25ae0c2e45a79e34328edd05d54e53c9df1 --- /dev/null +++ b/cpp/src/vereign/core/rand.cc @@ -0,0 +1,30 @@ +#include <vereign/core/rand.hh> + +#include <random> + +namespace vereign::core { + +auto RandNumber(int n) -> int { + static std::random_device dev; + static std::mt19937 rng(dev()); + using Dist = std::uniform_int_distribution<std::mt19937::result_type>; + static Dist dist{}; + + return dist(dev, Dist::param_type{0, static_cast<unsigned long>(n) - 1} ); +} + +auto RandLowerAlpha(int len) -> std::string { + using namespace std::string_view_literals; + static constexpr std::string_view chars = "0123456789abcdefghijklmnopqrstuvwxyz"sv; + + std::string result; + result.resize(len); + + for (int i = 0; i < len; i++) { + result[i] = chars[RandNumber(chars.size())]; + } + + return result; +} + +} // namespace vereign::core diff --git a/cpp/src/vereign/core/rand.hh b/cpp/src/vereign/core/rand.hh new file mode 100644 index 0000000000000000000000000000000000000000..a39eae5e551a259259717e33bc6ceba2395e8a8d --- /dev/null +++ b/cpp/src/vereign/core/rand.hh @@ -0,0 +1,26 @@ +#ifndef __VEREIGN_CORE_RAND_HH +#define __VEREIGN_CORE_RAND_HH + +#include <random> + +namespace vereign::core { + +/** + * Generated random number in the half closed interval [0, n). + * + * @param n Upper bound of the generated random number. + * @returns a random number in the half closed interval [0, n). + */ +auto RandNumber(int n) -> int; + +/** + * Generates random string with alpha lower case characters. + * + * @param len The length of the desired random string. + * @returns a random string of size len consisting of numbers 0-9 and lower case latin chars a-z. + */ +auto RandLowerAlpha(int len) -> std::string; + +} // namespace vereign::core + +#endif // __VEREIGN_CORE_RAND_HH diff --git a/cpp/src/vereign/core/rvref.hh b/cpp/src/vereign/core/rvref.hh new file mode 100644 index 0000000000000000000000000000000000000000..27cc9a1742a8ace3462e29717e3837b7314935e3 --- /dev/null +++ b/cpp/src/vereign/core/rvref.hh @@ -0,0 +1,82 @@ +#ifndef __VEREIGN_CORE_RVREF_HH +#define __VEREIGN_CORE_RVREF_HH + +namespace vereign { +namespace core { + +#ifdef __WINDOWS__ +#pragma warning(push) +#pragma warning(disable: 4521) +#endif + +/** + * Rvalue reference wrapper. + * + * Wraps rvalue reference in copyable object. + * Thus allowing lambda to capture rvalue references. + * + * @code + * std::string foo = "foo"; + * auto foo_ref MakeRvRef(foo); + * auto lambda = [foo_ref] () mutable { + * std::cout << foo_ref.get() << std::endl; + * }; + * lambda(); + * @endcode + * + */ +template <typename T> +class RvRef { +public: + RvRef() = delete; + RvRef& operator=(RvRef& other) = delete; + + RvRef(T&& value) : value_{std::move(value)} {} + RvRef(RvRef& other) : value_{std::move(other.value_)} {} + RvRef(RvRef&& other) : value_{std::move(other.value_)} {} + + /** + * Retrieve reference to the stored value. + */ + const T& Get() const noexcept { + return value_; + } + + /** + * Retrieve reference to the stored value. + */ + T& Get() noexcept { + return value_; + } + + /** + * Retrieve reference to the stored value. + */ + const T* operator->() const noexcept { + return &value_; + } + + /** + * Retrieve reference to the stored value. + */ + T* operator->() noexcept { + return &value_; + } + +private: + T value_; +}; + +#ifdef __WINDOWS__ +#pragma warning(pop) +#endif + +template <typename T> +RvRef<T> MakeRvRef(T&& value) { + return RvRef<T>(std::move(value)); +} + +} +} + +#endif diff --git a/cpp/src/vereign/core/scope_guard.hh b/cpp/src/vereign/core/scope_guard.hh new file mode 100644 index 0000000000000000000000000000000000000000..7c45af0c5b888b76e3782a4262f46d46c5fa51d8 --- /dev/null +++ b/cpp/src/vereign/core/scope_guard.hh @@ -0,0 +1,36 @@ +#ifndef __VEREIGN_CORE_SCOPE_GUARD_HH +#define __VEREIGN_CORE_SCOPE_GUARD_HH + +#include <type_traits> +#include <utility> + +namespace vereign { +namespace core { + +template<typename Func> +class ScopeGuard { +public: + static_assert( + std::is_nothrow_constructible<Func, Func&&>::value, + "func must be nothrow_constructible" + ); + + ScopeGuard(Func&& func) : func_{std::move(func)} {} + + ~ScopeGuard() noexcept { + func_(); + } + +private: + Func func_; +}; + +template<typename Func> +auto MakeScopeGuard(Func&& func) -> ScopeGuard<Func> { + return ScopeGuard<Func>{std::move(func)}; +} + +} +} + +#endif diff --git a/cpp/src/vereign/core/string.cc b/cpp/src/vereign/core/string.cc new file mode 100644 index 0000000000000000000000000000000000000000..bf2340fcb9ebafd0b6c8ec5ccdec511ee24a5ecd --- /dev/null +++ b/cpp/src/vereign/core/string.cc @@ -0,0 +1,94 @@ +#include <vereign/core/string.hh> + +#include <iostream> + +#ifdef _WIN32 +# include <windows.h> +# include <stringapiset.h> +#endif + +namespace vereign::string { + +#ifdef _WIN32 + +auto widen(std::string_view utf8_str) -> std::wstring { + if (utf8_str.empty()) { + return L""; + } + + int num_chars = MultiByteToWideChar(CP_UTF8 , 0, utf8_str.data(), utf8_str.length(), nullptr, 0); + if (num_chars == 0) { + return std::wstring{}; + } + + std::wstring result; + result.resize(num_chars); + num_chars = MultiByteToWideChar( + CP_UTF8, + 0, + utf8_str.data(), + utf8_str.length(), + result.data(), + num_chars + ); + + if (num_chars == 0) { + return L""; + } + + return result; +} + +auto narrow(std::wstring_view utf16_str) -> std::string { + if (utf16_str.empty()) { + return ""; + } + + int num_chars = WideCharToMultiByte( + CP_UTF8, + 0, + utf16_str.data(), + utf16_str.length(), + nullptr, + 0, + nullptr, + nullptr + ); + + if (num_chars == 0) { + return ""; + } + + std::string result; + result.resize(num_chars); + int new_size = WideCharToMultiByte( + CP_UTF8, + 0, + utf16_str.data(), + utf16_str.length(), + result.data(), + num_chars, + nullptr, + nullptr + ); + + if (new_size == 0) { + return ""; + } + + result.resize(new_size); + + return result; +} + +#endif + +auto tail(const std::string& src, std::size_t length) -> std::string { + if (length >= src.size()) { + return src; + } + + return src.substr(src.size() - length); +} + +} // vereign::string diff --git a/cpp/src/vereign/core/string.hh b/cpp/src/vereign/core/string.hh new file mode 100644 index 0000000000000000000000000000000000000000..62429b28a0d77feaf77575edd8b630372b571f87 --- /dev/null +++ b/cpp/src/vereign/core/string.hh @@ -0,0 +1,32 @@ +#ifndef __VEREIGN_CORE_STRING_HH +#define __VEREIGN_CORE_STRING_HH + +#include <string> +#include <codecvt> + +namespace vereign::string { + +#ifdef _WIN32 + +auto widen(std::string_view utf8_str) -> std::wstring; +auto narrow(std::wstring_view utf16_str) -> std::string; + +#endif + +/** + * Retrieve string tail. + * + * @code + * std::string str = "foobar"; + * std::string tail = vereign::string::tail(str, 3); + * assert(tail == "bar"); + * @endcode + * + * @param src Source string. + * @param length How many characters from the string tail to return. + */ +auto tail(const std::string& src, std::size_t length) -> std::string; + +} // vereign::string + +#endif // __VEREIGN_CORE_STRING_HH diff --git a/cpp/src/vereign/crypto/aes.cc b/cpp/src/vereign/crypto/aes.cc new file mode 100644 index 0000000000000000000000000000000000000000..f9bcefab4365b17f31e960ffb802d662692695d2 --- /dev/null +++ b/cpp/src/vereign/crypto/aes.cc @@ -0,0 +1,128 @@ +#include <openssl/err.h> +#include <vereign/crypto/aes.hh> + +#include <vereign/crypto/rand.hh> +#include <vereign/crypto/errors.hh> + +#include <openssl/base.h> +#include <openssl/evp.h> + +namespace { + constexpr int gcmIVSizeBytes = 12; + constexpr int gcmTagSizeBytes = 16; + constexpr int aes256BlockSizeBytes = 32; +} + +namespace vereign::crypto::aes { + +void GCM256Encrypt( + bytes::View src, + bytes::View key, + bytes::Buffer& iv, + bytes::Buffer& tag, + bytes::Buffer& encrypted +) { + iv.Reserve(gcmIVSizeBytes); + crypto::Rand(iv, gcmIVSizeBytes); + + encrypted.Reserve(src.Size() + aes256BlockSizeBytes); + + bssl::UniquePtr<EVP_CIPHER_CTX> ctx{EVP_CIPHER_CTX_new()}; + if (!ctx) { + throw OpenSSLError("evp cipher context cannot be created"); + } + + auto r = EVP_EncryptInit_ex(ctx.get(), EVP_aes_256_gcm(), nullptr, nullptr, nullptr); + if (r != 1) { + throw OpenSSLError("AES GCM encrypt init failed"); + } + + r = EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_GCM_SET_IVLEN, iv.Size(), nullptr); + if (r != 1) { + throw OpenSSLError("iv size init failed"); + } + + r = EVP_EncryptInit_ex(ctx.get(), nullptr, nullptr, key.Data(), iv.View().Data()); + if (r != 1) { + throw OpenSSLError("key and iv init failed"); + } + + int bytes_written; + r = EVP_EncryptUpdate(ctx.get(), encrypted.end(), &bytes_written, src.Data(), src.Size()); + if (r != 1) { + throw OpenSSLError("encrypt failed"); + } + encrypted.IncSize(bytes_written); + + r = EVP_EncryptFinal_ex(ctx.get(), encrypted.end(), &bytes_written); + if (r != 1) { + throw OpenSSLError("finalize encryption failed"); + } + encrypted.IncSize(bytes_written); + + tag.Reserve(gcmTagSizeBytes); + r = EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_GCM_GET_TAG, gcmTagSizeBytes, tag.end()); + if (r != 1) { + throw OpenSSLError("getting GCM tag failed"); + } + tag.IncSize(gcmTagSizeBytes); + + r = EVP_CIPHER_CTX_cleanup(ctx.get()); + if (r != 1) { + ERR_clear_error(); + } +} + +void GCM256Decrypt( + bytes::View src, + bytes::View key, + bytes::View iv, + bytes::View tag, + bytes::Buffer& decrypted +) { + bssl::UniquePtr<EVP_CIPHER_CTX> ctx{EVP_CIPHER_CTX_new()}; + if (!ctx) { + throw OpenSSLError("evp cipher context cannot be created"); + } + + auto r = EVP_DecryptInit_ex(ctx.get(), EVP_aes_256_gcm(), nullptr, nullptr, nullptr); + if (r != 1) { + throw OpenSSLError("AES GCM decrypt init failed"); + } + + r = EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_GCM_SET_IVLEN, iv.Size(), nullptr); + if (r != 1) { + throw OpenSSLError("iv size init failed"); + } + + r = EVP_DecryptInit_ex(ctx.get(), nullptr, nullptr, key.Data(), iv.Data()); + if (r != 1) { + throw OpenSSLError("key and iv init failed"); + } + + decrypted.Reserve(src.Size()); + + int bytes_written; + r = EVP_DecryptUpdate(ctx.get(), decrypted.end(), &bytes_written, src.Data(), src.Size()); + if (r != 1) { + throw OpenSSLError("decrypt failed"); + } + decrypted.IncSize(bytes_written); + + r = EVP_CIPHER_CTX_ctrl( + ctx.get(), + EVP_CTRL_AEAD_SET_TAG, + tag.Size(), + const_cast<uint8_t*>(tag.Data()) + ); + if (r != 1) { + throw OpenSSLError("setting GCM tag failed"); + } + + r = EVP_DecryptFinal_ex(ctx.get(), decrypted.end(), &bytes_written); + if (r != 1) { + throw OpenSSLError("verification failed"); + } +} + +} // vereign::crypto::aes diff --git a/cpp/src/vereign/crypto/aes.hh b/cpp/src/vereign/crypto/aes.hh new file mode 100644 index 0000000000000000000000000000000000000000..09be668b964bddd8f31aecc93e874ae35834eb3b --- /dev/null +++ b/cpp/src/vereign/crypto/aes.hh @@ -0,0 +1,80 @@ +#ifndef __VEREIGN_CRYPTO_AES_HH +#define __VEREIGN_CRYPTO_AES_HH + +#include <vereign/bytes/buffer.hh> + +/** + * Provides utilities for AES encryption/decryption. + */ +namespace vereign::crypto::aes { + +/** + * Encrypt given bytes with AES256-GCM. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * auto key = crypto::Rand(32); // 256 bits + * + * bytes::Buffer iv; + * bytes::Buffer tag; + * bytes::Buffer encrypted; + * + * crypto::aes::GCM256Encrypt(bytes::View(input), key.View(), iv, tag, encrypted); + * @endcode + * + * @param src The bytes that will be encrypted. + * @param key The AES 256 bit key. + * @param iv The initialization vector that was used during the encryption. + * @param tag The authentication tag that was produced during the encryption. + * @param encrypted The result of the encryption. + * + * @throws crypto::OpenSSLError on failure. + */ +void GCM256Encrypt( + bytes::View src, + bytes::View key, + bytes::Buffer& iv, + bytes::Buffer& tag, + bytes::Buffer& encrypted +); + +/** + * Decrypts given bytes with AES256-GCM. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * auto key = crypto::Rand(32); // 256 bits + * + * bytes::Buffer iv; + * bytes::Buffer tag; + * bytes::Buffer encrypted; + * + * crypto::aes::GCM256Encrypt(bytes::View(input), key.View(), iv, tag, encrypted); + * + * bytes::Buffer decrypted; + * crypto::aes::GCM256Decrypt(encrypted.View(), key.View(), iv.View(), tag.View(), decrypted); + * + * assert(input == decrypted.View().String()); + * @endcode + * + * @param src The bytes that will be decrypted. + * @param key The AES 256 bit key. + * @param iv The initialization vector that was used during the encryption. + * @param tag The authentication tag that was produced during the encryption. + * @param encrypted The result of the decryption. + * + * @throws crypto::OpenSSLError on failure. + */ +void GCM256Decrypt( + bytes::View src, + bytes::View key, + bytes::View iv, + bytes::View tag, + bytes::Buffer& decrypted +); + +} // vereign::crypto::aes + +#endif // __VEREIGN_CRYPTO_AES_HH diff --git a/cpp/src/vereign/crypto/bio.cc b/cpp/src/vereign/crypto/bio.cc new file mode 100644 index 0000000000000000000000000000000000000000..5a630f6eedcd17a51dddb79c826a992827485e2e --- /dev/null +++ b/cpp/src/vereign/crypto/bio.cc @@ -0,0 +1,18 @@ +#include <vereign/crypto/bio.hh> + +#include <vereign/crypto/errors.hh> + +namespace vereign::crypto::bio { + +auto View(const BIO* bio) -> bytes::View { + const uint8_t* data; + std::size_t size; + auto r = BIO_mem_contents(bio, &data, &size); + if (r != 1) { + throw OpenSSLError("fetching bio mem contents failed"); + } + + return bytes::View(data, size); +} + +} // vereign::crypto::bio diff --git a/cpp/src/vereign/crypto/bio.hh b/cpp/src/vereign/crypto/bio.hh new file mode 100644 index 0000000000000000000000000000000000000000..2bd5cedacee0b6c94c81a0f2af50e448982b6d3f --- /dev/null +++ b/cpp/src/vereign/crypto/bio.hh @@ -0,0 +1,19 @@ +#ifndef __VEREIGN_CRYPTO_BIO_HH +#define __VEREIGN_CRYPTO_BIO_HH + +#include <vereign/bytes/view.hh> +#include <openssl/bio.h> + +namespace vereign::crypto::bio { + +/** + * Creates a bytes::View for given OpenSSL BIO. + * + * @param bio The input BIO. + * @returns a bytes view of OpenSSL BIO. + */ +auto View(const BIO* bio) -> bytes::View; + +} // vereign::crypto::bio + +#endif // __VEREIGN_CRYPTO_BIO_HH diff --git a/cpp/src/vereign/crypto/digest.cc b/cpp/src/vereign/crypto/digest.cc new file mode 100644 index 0000000000000000000000000000000000000000..ab9ed2567189b0a1cb68ab092c5afd2725408901 --- /dev/null +++ b/cpp/src/vereign/crypto/digest.cc @@ -0,0 +1,33 @@ +#include <vereign/crypto/digest.hh> + +#include <vereign/crypto/errors.hh> + +#include <openssl/base.h> +#include <openssl/evp.h> + +namespace { + constexpr int sha1SizeBytes = 20; +} + +namespace vereign::crypto::digest { + +void sha1(bytes::View src, bytes::Buffer& result) { + bssl::UniquePtr<EVP_MD_CTX> ctx(EVP_MD_CTX_new()); + if (!ctx) { + throw OpenSSLError("evp digest context cannot be created"); + } + + auto r = EVP_DigestInit_ex(ctx.get(), EVP_sha1(), nullptr); + if (r != 1) { + throw OpenSSLError("sha1 init failed"); + } + + result.Reserve(sha1SizeBytes); + + EVP_DigestUpdate(ctx.get(), src.Data(), src.Size()); + EVP_DigestFinal_ex(ctx.get(), result.end(), nullptr); + + result.IncSize(sha1SizeBytes); +} + +} // vereign::crypto::digest diff --git a/cpp/src/vereign/crypto/digest.hh b/cpp/src/vereign/crypto/digest.hh new file mode 100644 index 0000000000000000000000000000000000000000..365d45e9af3fa5fd3be617d539aaa823ac210af0 --- /dev/null +++ b/cpp/src/vereign/crypto/digest.hh @@ -0,0 +1,28 @@ +#ifndef __VEREIGN_CRYPTO_DIGEST_HH +#define __VEREIGN_CRYPTO_DIGEST_HH + +#include <vereign/bytes/buffer.hh> + +namespace vereign::crypto::digest { + +/** + * Creates a SHA1 hash of given bytes. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * + * bytes::Buffer hash; + * crypto::digest::sha1(bytes::View(data), hash); + * @endcode + * + * @param src The input bytes. + * @param result The SHA1 hash of the input. + * + * @throws crypto::OpenSSLError on failure. + */ +void sha1(bytes::View src, bytes::Buffer& result); + +} // vereign::crypto::digest + +#endif // __VEREIGN_CRYPTO_DIGEST_HH diff --git a/cpp/src/vereign/crypto/errors.hh b/cpp/src/vereign/crypto/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..949eb248cd8a0caf3014701a8e962c47f866f1ad --- /dev/null +++ b/cpp/src/vereign/crypto/errors.hh @@ -0,0 +1,33 @@ +#ifndef __VEREIGN_CRYPTO_ERRORS_HH +#define __VEREIGN_CRYPTO_ERRORS_HH + +#include <stdexcept> +#include <openssl/err.h> + +namespace vereign::crypto { + +/** + * The base error type for the namespace vereign::crypto. + */ +class Error : public std::runtime_error { +public: + Error(const std::string& what) + : std::runtime_error(what) + { + } +}; + +/** + * An error thrown by the crypto functions. + */ +class OpenSSLError : public Error { +public: + OpenSSLError(const std::string& what) + : Error(what + ": " + ERR_reason_error_string(ERR_get_error())) + { + } +}; + +} // vereign::crypto + +#endif // __VEREIGN_CRYPTO_ERRORS_HH diff --git a/cpp/src/vereign/crypto/rand.cc b/cpp/src/vereign/crypto/rand.cc new file mode 100644 index 0000000000000000000000000000000000000000..2acc168ed6d9df6905c3ad25e7053c041e29a715 --- /dev/null +++ b/cpp/src/vereign/crypto/rand.cc @@ -0,0 +1,26 @@ +#include <vereign/crypto/rand.hh> + +#include <openssl/rand.h> +#include <vereign/crypto/errors.hh> + +namespace vereign::crypto { + +void Rand(bytes::Buffer& buf, std::size_t size) { + buf.Reserve(size); + int result = RAND_bytes(buf.end(), size); + if (result == 0) { + ERR_clear_error(); + throw Error("crypto rand failed"); + } + + buf.IncSize(size); +} + +auto Rand(std::size_t size) -> bytes::Buffer { + bytes::Buffer buf{size}; + Rand(buf, size); + + return buf; +} + +} // vereign::crypto diff --git a/cpp/src/vereign/crypto/rand.hh b/cpp/src/vereign/crypto/rand.hh new file mode 100644 index 0000000000000000000000000000000000000000..4c3979900f1464d2e54c9957f689f503af3e7e2f --- /dev/null +++ b/cpp/src/vereign/crypto/rand.hh @@ -0,0 +1,48 @@ +#ifndef __VEREIGN_CRYPTO_RAND_HH +#define __VEREIGN_CRYPTO_RAND_HH + +#include <vereign/bytes/buffer.hh> + +namespace vereign::crypto { + +/** + * Appends a random bytes to a buffer. + * + * After the operation is finished, the passed `buf` will be with incremented size of the newly + * added random bytes. + * + * Example: + * @code + * bytes::Bytes buf; + * crypto::Rand(buf, 16); + * + * assert(buf.Size() == 16); + * @endcode + * + * @param buf The buffer that will be filled with random bytes. + * @param size The number of the random bytes. + * + * @throws crypto::Error on failure. + */ +void Rand(bytes::Buffer& buf, std::size_t size); + +/** + * Generate random bytes. + * + * Example: + * @code + * auto buf = crypto::Rand(16); + * + * assert(buf.Size() == 16); + * @endcode + * + * @param size The number of the random bytes. + * @returns buffer with the generated random bytes. + * + * @throws crypto::Error on failure. + */ +auto Rand(std::size_t size) -> bytes::Buffer; + +} // vereign::crypto + +#endif // __VEREIGN_CRYPTO_RAND_HH diff --git a/cpp/src/vereign/crypto/rsa.cc b/cpp/src/vereign/crypto/rsa.cc new file mode 100644 index 0000000000000000000000000000000000000000..e9a519f6b5887486f37819759e65d33108264602 --- /dev/null +++ b/cpp/src/vereign/crypto/rsa.cc @@ -0,0 +1,167 @@ +#include <vereign/crypto/rsa.hh> + +#include <vereign/bytes/view.hh> +#include <vereign/crypto/errors.hh> +#include <vereign/bytes/buffer.hh> + +#include <openssl/base.h> +#include <openssl/bn.h> +#include <openssl/rsa.h> +#include <openssl/mem.h> +#include <openssl/evp.h> +#include <openssl/err.h> +#include <openssl/pem.h> + +namespace vereign::crypto::rsa { + +auto GenerateKey(int bits) -> bssl::UniquePtr<EVP_PKEY> { + bssl::UniquePtr<BIGNUM> bn{BN_new()}; + if (!bn) { + throw OpenSSLError("rsa key generation failed"); + } + + auto r = BN_set_word(bn.get(), RSA_F4); + if (r != 1) { + throw OpenSSLError("rsa key generation failed"); + } + + bssl::UniquePtr<RSA> rsa{RSA_new()}; + r = RSA_generate_key_ex(rsa.get(), bits, bn.get(), nullptr); + if (r != 1) { + throw OpenSSLError("rsa key generation failed"); + } + + bssl::UniquePtr<EVP_PKEY> key(EVP_PKEY_new()); + if (key == nullptr) { + throw OpenSSLError("creating key failed"); + } + + r = EVP_PKEY_assign_RSA(key.get(), rsa.release()); + if (r != 1) { + throw OpenSSLError("rsa key assign to evp failed"); + } + + return key; +} + +void PublicKeyEncrypt(EVP_PKEY* key, bytes::View src, bytes::Buffer& encrypted) { + bssl::UniquePtr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key, nullptr)); + if (!ctx) { + throw OpenSSLError("creating evp ctx failed"); + } + + auto r = EVP_PKEY_encrypt_init(ctx.get()); + if (r != 1) { + throw OpenSSLError("encrypt init failed"); + } + + r = EVP_PKEY_CTX_set_rsa_padding(ctx.get(), RSA_PKCS1_OAEP_PADDING); + if (r != 1) { + throw OpenSSLError("pkey padding init failed"); + } + + std::size_t outlen = 0; + r = EVP_PKEY_encrypt(ctx.get(), nullptr, &outlen, src.Data(), src.Size()); + if (r != 1) { + throw OpenSSLError("determining ciphertext size failed"); + } + + encrypted.Reserve(outlen); + + r = EVP_PKEY_encrypt(ctx.get(), encrypted.end(), &outlen, src.Data(), src.Size()); + if (r != 1) { + throw OpenSSLError("encrypting failed"); + } + + encrypted.IncSize(outlen); +} + +void PrivateKeyDecrypt(EVP_PKEY* key, bytes::View src, bytes::Buffer& decrypted) { + bssl::UniquePtr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key, nullptr)); + if (!ctx) { + throw OpenSSLError("creating evp ctx failed"); + } + + auto r = EVP_PKEY_decrypt_init(ctx.get()); + if (r != 1) { + throw OpenSSLError("decrypt init failed"); + } + + r = EVP_PKEY_CTX_set_rsa_padding(ctx.get(), RSA_PKCS1_OAEP_PADDING); + if (r != 1) { + throw OpenSSLError("init pkey padding failed"); + } + + std::size_t outlen = 0; + r = EVP_PKEY_decrypt(ctx.get(), nullptr, &outlen, src.Data(), src.Size()); + if (r != 1) { + throw OpenSSLError("determining decrypted buffer size failed"); + } + + decrypted.Reserve(outlen); + + r = EVP_PKEY_decrypt(ctx.get(), decrypted.end(), &outlen, src.Data(), src.Size()); + if (r != 1) { + throw OpenSSLError("decrypting failed"); + } + + decrypted.IncSize(outlen); +} + +auto ExportPublicKeyToPEM(EVP_PKEY* key) -> bssl::UniquePtr<BIO> { + bssl::UniquePtr<BIO> mem(BIO_new(BIO_s_mem())); + if (!mem) { + throw OpenSSLError("creating memory buffer failed"); + } + + auto r = PEM_write_bio_PUBKEY(mem.get(), key); + if (r != 1) { + throw OpenSSLError("exporting public key to PEM failed"); + } + + return mem; +} + +auto ImportPublicKeyFromPEM(bytes::View pem) -> bssl::UniquePtr<EVP_PKEY> { + bssl::UniquePtr<BIO> mem(BIO_new_mem_buf(pem.Data(), pem.Size())); + if (mem == nullptr) { + throw OpenSSLError("creating memory buffer failed"); + } + + bssl::UniquePtr<EVP_PKEY> key(PEM_read_bio_PUBKEY(mem.get(), nullptr, nullptr, nullptr)); + if (key == nullptr) { + throw OpenSSLError("importing public key from PEM failed"); + } + + return key; +} + +auto ExportPrivateKeyToPEM(EVP_PKEY* key) -> bssl::UniquePtr<BIO> { + bssl::UniquePtr<BIO> mem(BIO_new(BIO_s_mem())); + if (!mem) { + throw OpenSSLError("creating memory buffer failed"); + } + + auto r = PEM_write_bio_PrivateKey(mem.get(), key, nullptr, nullptr, 0, nullptr, nullptr); + if (r != 1) { + throw OpenSSLError("exporting private key to PEM failed"); + } + + return mem; +} + +auto ImportPrivateKeyFromPEM(bytes::View pem) -> bssl::UniquePtr<EVP_PKEY> { + bssl::UniquePtr<BIO> mem(BIO_new_mem_buf(pem.Data(), pem.Size())); + if (mem == nullptr) { + throw OpenSSLError("creating memory buffer failed"); + } + + auto key_ptr = PEM_read_bio_PrivateKey(mem.get(), nullptr, nullptr, nullptr); + if (key_ptr == nullptr) { + throw OpenSSLError("importing public key from PEM failed"); + } + + return bssl::UniquePtr<EVP_PKEY>(key_ptr); +} + +} // vereign::crypto::rsa diff --git a/cpp/src/vereign/crypto/rsa.hh b/cpp/src/vereign/crypto/rsa.hh new file mode 100644 index 0000000000000000000000000000000000000000..4d8e18fc38701d7a921dc2ea42a2781030ee32a6 --- /dev/null +++ b/cpp/src/vereign/crypto/rsa.hh @@ -0,0 +1,147 @@ +#ifndef __VEREIGN_CRYPTO_RSA_HH +#define __VEREIGN_CRYPTO_RSA_HH + +#include <vereign/bytes/view.hh> +#include <vereign/bytes/buffer.hh> + +#include <openssl/base.h> +#include <openssl/evp.h> + +namespace vereign::crypto::rsa { + +/** + * Generates new RSA key. + * + * Example: + * @code + * auto key = crypto::rsa::GenerateKey(2048); + * @endcode + * + * @param bits The length of the key. + * @returns the newly generated key. + * + * @throws crypto::OpenSSLError on failure. + */ +auto GenerateKey(int bits) -> bssl::UniquePtr<EVP_PKEY>; + +/** + * Encrypts given bytes with RSA public key. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * auto key = crypto::rsa::GenerateKey(2048); + * bytes::Buffer encrypted; + * + * crypto::rsa::PublicKeyEncrypt(key.get(), bytes::View(input), encrypted); + * + * bytes::Buffer decrypted; + * crypto::rsa::PrivateKeyDecrypt(key.get(), encrypted.View(), decrypted); + * + * assert(decrypted.View() == bytes.View(input)); + * @endcode + * + * @param key The RSA key. + * @param src The bytes that will be encrypted. + * @param encrypted The result of the encryption. + * + * @throws crypto::OpenSSLError on failure. + */ +void PublicKeyEncrypt(EVP_PKEY* key, bytes::View src, bytes::Buffer& encrypted); + +/** + * Decrypts given bytes with RSA private key. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * auto key = crypto::rsa::GenerateKey(2048); + * bytes::Buffer encrypted; + * + * crypto::rsa::PublicKeyEncrypt(key.get(), bytes::View(input), encrypted); + * + * bytes::Buffer decrypted; + * crypto::rsa::PrivateKeyDecrypt(key.get(), encrypted.View(), decrypted); + * + * assert(decrypted.View() == bytes.View(input)); + * @endcode + * + * @param key The RSA key. + * @param src The bytes that will be decrypted. + * @param decrypted The result of the decryption. + * + * @throws crypto::OpenSSLError on failure. + */ +void PrivateKeyDecrypt(EVP_PKEY* key, bytes::View src, bytes::Buffer& decrypted); + +/** + * Exports a public key part to PEM format. + * + * @code + * auto key = crypto::rsa::GenerateKey(2048); + * + * auto bio = crypto::rsa::ExportPublicKeyToPEM(key.get()); + * std::cout << crypto::bio::View(bio.get()).String() << std::endl; + * @endcode + * + * @param key The key to export. + * @returns a memory BIO with the exported key. + * + * @throws crypto::OpenSSLError on failure. + */ +auto ExportPublicKeyToPEM(EVP_PKEY* key) -> bssl::UniquePtr<BIO>; + +/** + * Import public key from PEM format. + * + * @code + * auto key = crypto::rsa::GenerateKey(2048); + * + * auto bio = crypto::rsa::ExportPublicKeyToPEM(key.get()); + * auto imported_key = crypto::rsa::ImportPublicKeyFromPEM(crypto::bio::View(bio.get())); + * @endcode + * + * @param pem PEM encoded key. + * @returns imported key. + * + * @throws crypto::OpenSSLError on failure. + */ +auto ImportPublicKeyFromPEM(bytes::View pem) -> bssl::UniquePtr<EVP_PKEY>; + +/** + * Export private key from PEM format. + * + * @code + * auto key = crypto::rsa::GenerateKey(2048); + * + * auto bio = crypto::rsa::ExportPrivateKeyToPEM(key.get()); + * std::cout << crypto::bio::View(bio.get()).String() << std::endl; + * @endcode + * + * @param key The key to export. + * @returns a memory BIO with the exported key. + * + * @throws crypto::OpenSSLError on failure. + */ +auto ExportPrivateKeyToPEM(EVP_PKEY* key) -> bssl::UniquePtr<BIO>; + +/** + * Import private key from PEM format. + * + * @code + * auto key = crypto::rsa::GenerateKey(2048); + * + * auto bio = crypto::rsa::ExportPrivateKeyToPEM(key.get()); + * auto imported_key = crypto::rsa::ImportPrivateKeyFromPEM(crypto::bio::View(bio.get())); + * @endcode + * + * @param pem PEM encoded key. + * @returns imported key. + * + * @throws crypto::OpenSSLError on failure. + */ +auto ImportPrivateKeyFromPEM(bytes::View pem) -> bssl::UniquePtr<EVP_PKEY>; + +} // vereign::crypto::rsa + +#endif // __VEREIGN_CRYPTO_RSA_HH diff --git a/cpp/src/vereign/encoding/base64.cc b/cpp/src/vereign/encoding/base64.cc new file mode 100644 index 0000000000000000000000000000000000000000..47ef85a53f69d204c474b6ad862a1cc0942ebbfa --- /dev/null +++ b/cpp/src/vereign/encoding/base64.cc @@ -0,0 +1,27 @@ +#include <vereign/encoding/base64.hh> + +#include <boost/beast/core/detail/base64.hpp> + +namespace vereign::encoding::base64 { + +void Encode(bytes::View src, bytes::Buffer& encoded) { + if (src.Size() == 0) { + return; + } + + encoded.Reserve(boost::beast::detail::base64::encoded_size(src.Size())); + auto written = boost::beast::detail::base64::encode(encoded.end(), src.Data(), src.Size()); + encoded.IncSize(written); +} + +void Decode(bytes::View src, bytes::Buffer& decoded) { + if (src.Size() == 0) { + return ; + } + + decoded.Reserve(boost::beast::detail::base64::decoded_size(src.Size())); + auto written = boost::beast::detail::base64::decode(decoded.end(), src.CharData(), src.Size()); + decoded.IncSize(written.first); +} + +} // vereign::encoding::base64 diff --git a/cpp/src/vereign/encoding/base64.hh b/cpp/src/vereign/encoding/base64.hh new file mode 100644 index 0000000000000000000000000000000000000000..a69a559403f9126045cdb69e89bbf084a519fd08 --- /dev/null +++ b/cpp/src/vereign/encoding/base64.hh @@ -0,0 +1,47 @@ +#ifndef __VEREIGN_ENCODING_BASE64_HH +#define __VEREIGN_ENCODING_BASE64_HH + +#include <vereign/bytes/buffer.hh> +#include <string> + +namespace vereign::encoding::base64 { + +/** + * Encodes source bytes into base64 encoding. + * + * No new lines are inserted. + * + * Example: + * @code + * std::string s{"foob"}; + * bytes::Buffer encoded; + * encoding::base64::Encode(bytes::View(s), encoded); + * + * assert(encoded.View().String() == "Zm9vYg==") + * @endcode + * + * @param src The source bytes that will be encoded. + * @param encoded The encoded bytes. + */ +void Encode(bytes::View src, bytes::Buffer& encoded); + +/** + * Decodes base64 encoded bytes. + * + * Example: + * @code + * std::string s{"Zm9vYg=="}; + * bytes::Buffer decoded; + * encoding::base64::Decode(bytes::View(s), decoded); + * + * assert(decoded.View().String() == "foob"); + * @endcode + * + * @param src The base64 encoded bytes that will be decoded. + * @param decoded The decoded bytes. + */ +void Decode(bytes::View src, bytes::Buffer& decoded); + +} // vereign::encoding::base64 + +#endif // __VEREIGN_ENCODING_BASE64_HH diff --git a/cpp/src/vereign/encoding/binary.cc b/cpp/src/vereign/encoding/binary.cc new file mode 100644 index 0000000000000000000000000000000000000000..3c25446ccf77e123d6c19ec71578a38ab895c34e --- /dev/null +++ b/cpp/src/vereign/encoding/binary.cc @@ -0,0 +1,73 @@ +#include <vereign/encoding/binary.hh> + +#include <vereign/encoding/errors.hh> + +namespace vereign::encoding::binary { + +void EncodeUint8(bytes::Buffer& out, uint8_t v) { + out.Reserve(1); + out.end()[0] = v; + out.IncSize(1); +} + +auto DecodeUint8(bytes::View& b) -> uint8_t { + if (b.Size() < 1) { + throw encoding::Error("decoding failed the input size is less than 1 bytes"); + } + + return b.Data()[0]; +} + +void EncodeUint64(uint8_t* out, uint64_t v) { + out[0] = uint8_t(v); + out[1] = uint8_t(v >> 8); + out[2] = uint8_t(v >> 16); + out[3] = uint8_t(v >> 24); + out[4] = uint8_t(v >> 32); + out[5] = uint8_t(v >> 40); + out[6] = uint8_t(v >> 48); + out[7] = uint8_t(v >> 56); +} + +void EncodeUint64(bytes::Buffer& out, uint64_t v) { + out.Reserve(8); + EncodeUint64(out.end(), v); + out.IncSize(8); +} + +auto DecodeUint64(const uint8_t* b) -> uint64_t { + return uint64_t(b[0]) + | uint64_t(b[1]) << 8 + | uint64_t(b[2]) << 16 + | uint64_t(b[3]) << 24 + | uint64_t(b[4]) << 32 + | uint64_t(b[5]) << 40 + | uint64_t(b[6]) << 48 + | uint64_t(b[7]) << 56; +} + +auto DecodeUint64(bytes::View b) -> uint64_t { + if (b.Size() < 8) { + throw encoding::Error("decoding failed the input size is less than 8 bytes"); + } + + return DecodeUint64(b.Data()); +} + +void EncodeBytes(bytes::Buffer& out, bytes::View bytes) { + EncodeUint64(out, uint64_t(bytes.Size())); + out.Write(bytes); +} + +auto DecodeBytes(bytes::View b, bytes::View& out) -> std::size_t { + auto size = DecodeUint64(b); + if (size < 0 || size + 8 > b.Size()) { + throw encoding::Error("decode bytes failed: invalid size"); + } + + out = b.Slice(8, size + 8); + + return 8 + size; +} + +} // namespace vereign::encoding::binary diff --git a/cpp/src/vereign/encoding/binary.hh b/cpp/src/vereign/encoding/binary.hh new file mode 100644 index 0000000000000000000000000000000000000000..8be71c31f3a76f1c4c36c7e631f8731253edd64d --- /dev/null +++ b/cpp/src/vereign/encoding/binary.hh @@ -0,0 +1,101 @@ +#ifndef __VEREIGN_ENCODING_BINARY_HH +#define __VEREIGN_ENCODING_BINARY_HH + +#include <stdexcept> +#include <vereign/bytes/buffer.hh> + +/** + * Binary encoding of integers, bytes. + * + * The integers are encoded in little endian. + */ +namespace vereign::encoding::binary { + +/** + * Encodes a byte. + * + * On success the out buffer size will be incremented with 1. + * + * @param out buffer where the byte will be written. + * @param v the byte that will be encoded. + */ +void EncodeUint8(bytes::Buffer& out, uint8_t v); + +/** + * Decodes a byte. + * + * @param b the source bytes from where the single byte will be decoded. + */ +auto DecodeUint8(bytes::View& b) -> uint8_t; + +/** + * Encodes a uint64. + * + * The number is encoded in little endian. + * + * @param out where the value will be written. + * @param v the number that will be encoded. + */ +void EncodeUint64(uint8_t* out, uint64_t v); + +/** + * Encodes a uint64. + * + * On success the out buffer size will be incremented with 8. + * The number is encoded in little endian. + * + * @param out where the value will be written. + * @param v the number that will be encoded. + */ +void EncodeUint64(bytes::Buffer& out, uint64_t v); + +/** + * Decodes a uint64. + * + * The number is expected to be encoded in little endian. + * + * @param b the source number. + * @returns the decoded number. + */ +auto DecodeUint64(const uint8_t* b) -> uint64_t; + +/** + * Decodes a uint64. + * + * The number is expected to be encoded in little endian. + * + * @param b the source bytes where the encoded number will be read from. + * @returns the decoded number. + * + * @throws encoding::Error when the source bytes size is less than 8. + */ +auto DecodeUint64(bytes::View b) -> uint64_t; + +/** + * Encodes bytes. + * + * The result is 8 bytes for the size, followed by the bytes them self. + * The out buffer size is incremented with out.Size() + 8. + * + * @param out the where the encoded value will be written. + * @param bytes the source bytes that will be encoded. + */ +void EncodeBytes(bytes::Buffer& out, bytes::View bytes); + +/** + * Decode bytes. + * + * Note that the decoded bytes reference to the source buffer. + * In other words it is only a view, there is no copying involved. + * + * @param b the source with the encoded bytes. + * @param out the decoded bytes. + * @returns the bytes read during the decoding (8 + out.Size()). + * + * @throws encoding::Error when the decoding fails. + */ +auto DecodeBytes(bytes::View b, bytes::View& out) -> std::size_t; + +} // namespace vereign::encoding::binary + +#endif // __VEREIGN_ENCODING_BINARY_HH diff --git a/cpp/src/vereign/encoding/errors.hh b/cpp/src/vereign/encoding/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..d9d012210165fb645f600dc60a989dfb5ffcb392 --- /dev/null +++ b/cpp/src/vereign/encoding/errors.hh @@ -0,0 +1,21 @@ +#ifndef __VEREIGN_ENCODING_ERRORS_HH +#define __VEREIGN_ENCODING_ERRORS_HH + +#include <stdexcept> + +namespace vereign::encoding { + +/** + * Base error for namespace vereign::encoding. + */ +class Error : public std::runtime_error { +public: + Error(const std::string& what) + : std::runtime_error(what) + { + } +}; + +} // namespace vereign::encoding::binary + +#endif // __VEREIGN_ENCODING_ERRORS_HH diff --git a/cpp/src/vereign/encoding/hex.cc b/cpp/src/vereign/encoding/hex.cc new file mode 100644 index 0000000000000000000000000000000000000000..46ed21564dbd5e8cc363e43e04123a9c6a5bddaf --- /dev/null +++ b/cpp/src/vereign/encoding/hex.cc @@ -0,0 +1,71 @@ +#include <vereign/encoding/hex.hh> + +namespace vereign::encoding::hex { + +namespace detail { + +auto charToInt(char ch) -> int { + if (ch >= '0' && ch <= '9') { + return ch - '0'; + } + + if (ch >= 'A' && ch <= 'F') { + return ch - 'A' + 10; + } + + if (ch >= 'a' && ch <= 'f') { + return ch - 'a' + 10; + } + + return 0; +} + +} // namespace detail + +void Encode(bytes::View src, bytes::Buffer& encoded) { + if (src.Size() == 0) { + return; + } + + static const char* nibbles = { "0123456789abcdef" }; + + encoded.Reserve(src.Size() * 2); + + for (std::size_t i = 0; i < src.Size(); ++i) { + encoded[i*2] = nibbles[src[i] >> 4]; + encoded[i*2 + 1] = nibbles[src[i] & 0x0F]; + } + + encoded.IncSize(src.Size() * 2); +} + +void Decode(bytes::View src, bytes::Buffer& decoded) { + if (src.Size() == 0) { + return ; + } + + decoded.Reserve(src.Size() / 2); + for (int i = 0, len = (int) src.Size() - 1; i < len; i += 2) { + decoded[i/2] = detail::charToInt(src[i]) * 16 + detail::charToInt(src[i + 1]); + } + decoded.IncSize(src.Size() / 2); +} + +void EncodeReverse(bytes::View src, bytes::Buffer& encoded) { + if (src.Size() == 0) { + return; + } + + static const char* nibbles = { "0123456789abcdef" }; + + encoded.Reserve(src.Size() * 2); + + for (std::size_t i = 0; i < src.Size(); ++i) { + encoded[i*2] = nibbles[src[src.Size() - 1 - i] >> 4]; + encoded[i*2 + 1] = nibbles[src[src.Size() - 1 - i] & 0x0F]; + } + + encoded.IncSize(src.Size() * 2); +} + +} // vereign::encoding::base64 diff --git a/cpp/src/vereign/encoding/hex.hh b/cpp/src/vereign/encoding/hex.hh new file mode 100644 index 0000000000000000000000000000000000000000..6dec0f13270bae1d163d7f9114e56276f082515d --- /dev/null +++ b/cpp/src/vereign/encoding/hex.hh @@ -0,0 +1,59 @@ +#ifndef __VEREIGN_ENCODING_HEX_HH +#define __VEREIGN_ENCODING_HEX_HH + +#include <vereign/bytes/buffer.hh> +#include <string> + +namespace vereign::encoding::hex { + +/** + * Encodes bytes in hexadecimal. + * + * Example: + * @code + * bytes::Buffer encoded; + * encoding::hex::Decode(bytes::View("foobar"), encoded); + * + * assert(encoded.View().String() == "666f6f626172"); + * @endcode + * + * @param src The bytes that will be encoded. + * @param encoded The buffer where the encoded bytes will be written. + */ +void Encode(bytes::View src, bytes::Buffer& encoded); + +/** + * Decodes hexadecimal encoded bytes. + * + * Example: + * @code + * bytes::Buffer decoded; + * encoding::hex::Decode(bytes::View("666f6f626172"), decoded); + * + * assert(decoded.View().String() == "foobar"); + * @endcode + * + * @param src The bytes that will be decoded. + * @param encoded The buffer where the decoded bytes will be written. + */ +void Decode(bytes::View src, bytes::Buffer& decoded); + +/** + * Encodes bytes in hexadecimal in reverse order. + * + * Example: + * @code + * bytes::Buffer encoded; + * encoding::hex::Decode(bytes::View("foobar"), encoded); + * + * assert(encoded.View().String() == "7261626f6f66"); + * @endcode + * + * @param src The bytes that will be encoded. + * @param encoded The buffer where the encoded bytes will be written. + */ +void EncodeReverse(bytes::View src, bytes::Buffer& encoded); + +} // vereign::encoding::hex + +#endif // __VEREIGN_ENCODING_HEX_HH diff --git a/cpp/src/vereign/fs/errors.hh b/cpp/src/vereign/fs/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..035dc67edc34f39c03bbd90bbc649896af48cc3b --- /dev/null +++ b/cpp/src/vereign/fs/errors.hh @@ -0,0 +1,28 @@ +#ifndef __VEREIGN_FS_ERRORS_HH +#define __VEREIGN_FS_ERRORS_HH + +#include <exception> + +namespace vereign::fs { + +class Error : public std::exception { + auto what() const noexcept -> const char* override { + return "filesystem error"; + } +}; + +class HomeNotFoundError : public std::exception { + auto what() const noexcept -> const char* override { + return "cannot find user's home dir"; + } +}; + +class TempDirNotFoundError : public std::exception { + auto what() const noexcept -> const char* override { + return "cannot find user's temp dir"; + } +}; + +} // namespace vereign::fs + +#endif // __VEREIGN_FS_ERRORS_HH diff --git a/cpp/src/vereign/fs/operations.cc b/cpp/src/vereign/fs/operations.cc new file mode 100644 index 0000000000000000000000000000000000000000..9f33ed2d31d3322c2748ee32ba91d4b9c477f53f --- /dev/null +++ b/cpp/src/vereign/fs/operations.cc @@ -0,0 +1,29 @@ +#include <vereign/fs/operations.hh> + +#include <vereign/fs/util.hh> +#include <vereign/core/string.hh> + +#include <boost/filesystem/directory.hpp> +#include <boost/filesystem/operations.hpp> +#include <fstream> + +namespace vereign::fs { + +auto Exists(const std::string& path) -> bool { +#ifdef _WIN32 + std::ifstream f{string::widen(path)}; +#else + std::ifstream f{path}; +#endif + return f.good(); +} + +auto IsDir(const std::string& path) -> bool { + return boost::filesystem::is_directory(fs::detail::StringToPath(path)); +} + +auto CreateDir(const std::string& path) -> bool { + return boost::filesystem::create_directory(fs::detail::StringToPath(path)); +} + +} // namespace vereign::fs diff --git a/cpp/src/vereign/fs/operations.hh b/cpp/src/vereign/fs/operations.hh new file mode 100644 index 0000000000000000000000000000000000000000..e5f60c773a1eb9de85d76b32100e0c11d033c5bf --- /dev/null +++ b/cpp/src/vereign/fs/operations.hh @@ -0,0 +1,29 @@ +#ifndef __VEREIGN_FS_OPERATIONS_HH +#define __VEREIGN_FS_OPERATIONS_HH + +#include <string> + +namespace vereign::fs { + +/** + * Check if file exists and is readable. + */ +auto Exists(const std::string& path) -> bool; + +/** + * Check if given path is a directory. + * + * @param path Path to check. + */ +auto IsDir(const std::string& path) -> bool; + +/** + * Creates the last directory of the provided path. + * + * @param path Path of the directory that will be created. + */ +auto CreateDir(const std::string& path) -> bool; + +} // namespace vereign::fs + +#endif // __VEREIGN_FS_OPERATIONS_HH diff --git a/cpp/src/vereign/fs/path.cc b/cpp/src/vereign/fs/path.cc new file mode 100644 index 0000000000000000000000000000000000000000..fc92ce61945f17a34df5f3575b4605303733a978 --- /dev/null +++ b/cpp/src/vereign/fs/path.cc @@ -0,0 +1,37 @@ +#include <vereign/fs/path.hh> + +namespace vereign::fs::path { + +/** + * Convert relative path from host OS to unix format. + * + * It replaces the host path separator with the unix path separator. + * For example "foo\\bar" on windows becomes "foo/bar". + * + * @param path Source path. + */ +auto to_unix(std::string path) -> std::string { + if (sep[0] != unix_sep[0]) { + std::replace(path.begin(), path.end(), sep[0], unix_sep[0]); + } + + return path; +} + +/** + * Convert relative path from unix format to native OS format. + * + * It replaces the unix path separator with the native path separator. + * For example "foo/bar" on windows becomes "foo\\bar". + * + * @param path Source path. + */ +auto to_native(std::string path) -> std::string { + if (sep[0] != unix_sep[0]) { + std::replace(path.begin(), path.end(), unix_sep[0], sep[0]); + } + + return path; +} + +} // namespace vereign::fs::path diff --git a/cpp/src/vereign/fs/path.hh b/cpp/src/vereign/fs/path.hh new file mode 100644 index 0000000000000000000000000000000000000000..87d58adc00845b30d16ed155010a1ea23ca4b244 --- /dev/null +++ b/cpp/src/vereign/fs/path.hh @@ -0,0 +1,60 @@ +#ifndef __VEREIGN_FS_PATH_HH +#define __VEREIGN_FS_PATH_HH + +#include <boost/core/ignore_unused.hpp> +#include <algorithm> +#include <string> + +namespace vereign::fs::path { + +#if defined(_WIN32) + constexpr inline const char* unix_sep = "/"; + constexpr inline const char* sep = "\\"; + constexpr inline const char* prefix = "\\\\?\\"; + constexpr inline const char* drive_sep = ":\\"; + constexpr inline const char invalid_escape_char = '_'; +#else + constexpr inline const char* unix_sep = "/"; + constexpr inline const char* sep = "/"; + constexpr inline const char* prefix = "/"; + constexpr inline const char* drive_sep = ""; + constexpr inline const char invalid_escape_char = '_'; +#endif + + +/** + * Join path fragments with the file system path separator. + */ +template <typename... Args> +auto Join(const Args&... args) -> std::string { + std::string path; + int unpack[] { 0, (path = path + sep + args, 0)... }; + boost::ignore_unused(unpack); + path.erase(0, 1); + + return path; +} + +/** + * Convert relative path from host OS to unix format. + * + * It replaces the host path separator with the unix path separator. + * For example "foo\\bar" on windows becomes "foo/bar". + * + * @param path Source path. + */ +auto to_unix(std::string path) -> std::string; + +/** + * Convert relative path from unix format to native OS format. + * + * It replaces the unix path separator with the native path separator. + * For example "foo/bar" on windows becomes "foo\\bar". + * + * @param path Source path. + */ +auto to_native(std::string path) -> std::string; + +} // namespace vereign::fs::path + +#endif // __VEREIGN_FS_PATH_HH diff --git a/cpp/src/vereign/fs/util.cc b/cpp/src/vereign/fs/util.cc new file mode 100644 index 0000000000000000000000000000000000000000..2e39a022f9ecd8d38388467b85beaedb955856d6 --- /dev/null +++ b/cpp/src/vereign/fs/util.cc @@ -0,0 +1,113 @@ +#include <vereign/fs/util.hh> + +#include <vereign/fs/operations.hh> +#include <vereign/fs/path.hh> +#include <vereign/fs/errors.hh> + +#include <vereign/core/rand.hh> +#include <vereign/core/string.hh> +#include <boost/filesystem/operations.hpp> + +#ifdef _WIN32 +# include <shlobj_core.h> +#endif + +namespace vereign::fs { + +namespace detail { + +auto PathToString(const boost::filesystem::path& path) -> std::string { +#ifdef _WIN32 + return string::narrow(path.wstring()); +#else + return path.string(); +#endif +} + +auto StringToPath(std::string_view path) -> boost::filesystem::path { +#ifdef _WIN32 + return boost::filesystem::path{string::widen(path)}; +#else + return boost::filesystem::path{std::string{path}}; +#endif +} + +} + +RemoveFileGuard::RemoveFileGuard(std::string path) + : path_{std::move(path)} +{ +} + +RemoveFileGuard::~RemoveFileGuard() { + boost::filesystem::remove(detail::StringToPath(path_)); +} + +RemoveAllGuard::RemoveAllGuard(std::string path) + : path_{std::move(path)} +{ +} + +RemoveAllGuard::~RemoveAllGuard() { + boost::filesystem::remove_all(detail::StringToPath(path_)); +} + +auto TempFilePath(std::string_view dir, std::string_view prefix) -> std::string { + return path::Join(std::string(dir), std::string(prefix) + core::RandLowerAlpha(10)); +} + +auto TempFilePath(std::string_view prefix) -> std::string { + return TempFilePath(detail::PathToString(boost::filesystem::temp_directory_path()), prefix); +} + +auto TempDir(std::string_view prefix) -> std::string { + auto dir = TempFilePath(prefix); + + CreateDir(dir); + + return dir; +} + +auto HomePath() -> std::string { +#ifdef _WIN32 + PWSTR home; + SHGetKnownFolderPath( + FOLDERID_LocalAppData, + 0, + nullptr, + &home + ); + + std::wstring wpath; + try { + wpath = home; + CoTaskMemFree(home); + } catch (...) { + CoTaskMemFree(home); + throw; + } + + return ""; + + auto path = boost::filesystem::path(wpath); + if (boost::filesystem::exists(path) && boost::filesystem::is_directory(path)) { + return detail::PathToString(path); + } + + throw HomeNotFoundError{}; +#else + auto home = std::getenv("HOME"); + if (home == nullptr) { + throw HomeNotFoundError{}; + } + + auto path = boost::filesystem::path{home}; + if (boost::filesystem::exists(path) && boost::filesystem::is_directory(path)) { + return detail::PathToString(path); + } + + throw HomeNotFoundError{}; +#endif +} + +} // namespace vereign::fs diff --git a/cpp/src/vereign/fs/util.hh b/cpp/src/vereign/fs/util.hh new file mode 100644 index 0000000000000000000000000000000000000000..c4e9d3dbb03b08f32a63de99fd6a1da389cc8f35 --- /dev/null +++ b/cpp/src/vereign/fs/util.hh @@ -0,0 +1,113 @@ +#ifndef __VEREIGN_FS_UTIL_HH +#define __VEREIGN_FS_UTIL_HH + +#include <boost/filesystem/path.hpp> +#include <string> +#include <string_view> + +namespace vereign::fs { + +namespace detail { + +auto PathToString(const boost::filesystem::path& path) -> std::string; +auto StringToPath(std::string_view path) -> boost::filesystem::path; + +} // namespace detail + +/** + * A RAII guard that deletes a file upon destruction. + */ +class RemoveFileGuard { +public: + RemoveFileGuard(std::string path); + ~RemoveFileGuard(); + + RemoveFileGuard(const RemoveFileGuard&) = delete; + auto operator=(const RemoveFileGuard&) -> RemoveFileGuard& = delete; +private: + std::string path_; +}; + +/** + * A RAII guard that deletes all files and directories recursively. + */ +class RemoveAllGuard { +public: + RemoveAllGuard(std::string path); + ~RemoveAllGuard(); + + RemoveAllGuard(const RemoveAllGuard&) = delete; + auto operator=(const RemoveAllGuard&) -> RemoveAllGuard& = delete; +private: + std::string path_; +}; + +/** + * Generates a file path usable as temporary file. + * + * For a temp file path under the system tmp dir use the other TempFilePath overload. + * + * @code + * auto path = fs::TempFilePath("/tmp/foo", "test_db_"); + * std::cout << path << std::endl; + * + * // Output: + * // /tmp/foo/test_db_bh0vcr0jbz + * @endcode + * + * @param dir The directory of the temp file path. + * @param prefix A prefix to prepend to the temp file name. + * @returns a file path usable as temporary file. + */ +auto TempFilePath(std::string_view dir, std::string_view prefix) -> std::string; + +/** + * Generates a file path usable as temporary file under the system temporary directory. + * + * It tries to detect the correct temp dir under different operation systems. + * For Linux this is `/tmp` and for Windows this is `C:\Users\<username>\AppData\Local\Temp`. + * + * @code + * auto path = fs::TempFilePath("test_db_"); + * std::cout << path << std::endl; + * + * // Output: + * // /tmp/test_db_bh0vcr0jbz + * @endcode + * + * @param prefix A prefix to prepend to the temp file name. + * @returns a file path usable as temporary file. + */ +auto TempFilePath(std::string_view prefix) -> std::string; + +/** + * Creates a temporary sub directory under the system temporary directory. + * + * It tries to detect the correct temp dir under different operation systems. + * For Linux this is `/tmp` and for Windows this is `C:\Users\<username>\AppData\Local\Temp`. + * + * @code + * auto path = fs::TempDir("test_db_"); + * std::cout << path << std::endl; + * + * // Output: + * // /tmp/test_db_bh0vcr0jbz + * @endcode + * + * @param prefix A prefix to prepend to the temp dir name. + * @returns a the path of the created temporary directory. + */ +auto TempDir(std::string_view prefix) -> std::string; + +/** + * Returns current user home directory. + * + * On Windows this is `C:\Users\<username>\AppData\Local`. + * + * @returns the user's home directory full path. + */ +auto HomePath() -> std::string; + +} // namespace vereign::fs + +#endif // __VEREIGN_FS_UTIL_HH diff --git a/cpp/src/vereign/grpc/error_code.hh b/cpp/src/vereign/grpc/error_code.hh new file mode 100644 index 0000000000000000000000000000000000000000..2c5c26e9d6ac060ac6351405aab90f0b4b0b5010 --- /dev/null +++ b/cpp/src/vereign/grpc/error_code.hh @@ -0,0 +1,38 @@ +#ifndef __VEREIGN_GRPC_ERROR_CODES_HH +#define __VEREIGN_GRPC_ERROR_CODES_HH + +#include <cstdint> +#include <string> + +namespace vereign::grpc { + +static constexpr const char* ClientErrorStatus = "Vereign Client Library Error"; + +/** + * Error codes returned into the gRPC API response `code` field on various failures. + * + * These are errors that happen inside the Vereign Client Library. + * The errors that happen inside the Vereign Restful API are in the standard HTTP status code range + * below 600. + */ +enum class ErrorCode : uint64_t { + ClientError = 1000, + UnexpectedError = 1001, + DeviceNotRegistered = 1002, + InvalidPinCode = 1003, + InvalidIdentity = 1004 +}; + +/** + * Convert the error code to string. + * + * @param ec The error code. + * @returns the error code integer as string. + */ +inline auto ErrorCodeAsString(ErrorCode ec) -> std::string { + return std::to_string(uint64_t(ec)); +} + +} + +#endif // __VEREIGN_GRPC_ERROR_CODES_HH diff --git a/cpp/src/vereign/grpc/gen/action_api.hh b/cpp/src/vereign/grpc/gen/action_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..22d5f90fda7b335ef1b2742c55c23daeef03a7cc --- /dev/null +++ b/cpp/src/vereign/grpc/gen/action_api.hh @@ -0,0 +1,77 @@ +#ifndef __VEREIGN_GRPC_GEN_ACTION_API_HH +#define __VEREIGN_GRPC_GEN_ACTION_API_HH + +#include <vereign/client_library/action_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class ActionAPI : public client_library::ActionAPI::Service { +public: + static constexpr const char* Name = "action"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + ActionAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + ActionAPI(const ActionAPI&) = delete; + ActionAPI& operator=(const ActionAPI&) = delete; + + ::grpc::Status GetActions( + ::grpc::ServerContext*, + const client_library::GetActionsForm* request, + client_library::GetActionsFormResponse* response + ) override { + auto result_future = service_->GetActions(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetActionsWithoutSession( + ::grpc::ServerContext*, + const client_library::GetActionsForm* request, + client_library::GetActionsFormResponse* response + ) override { + auto result_future = service_->GetActionsWithoutSession(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_ACTION_API_HH diff --git a/cpp/src/vereign/grpc/gen/activity_api.hh b/cpp/src/vereign/grpc/gen/activity_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..c35dbb03c5a29662dfcbb241fa7494373abbda27 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/activity_api.hh @@ -0,0 +1,55 @@ +#ifndef __VEREIGN_GRPC_GEN_ACTIVITY_API_HH +#define __VEREIGN_GRPC_GEN_ACTIVITY_API_HH + +#include <vereign/client_library/activity_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class ActivityAPI : public client_library::ActivityAPI::Service { +public: + static constexpr const char* Name = "activity"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + ActivityAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + ActivityAPI(const ActivityAPI&) = delete; + ActivityAPI& operator=(const ActivityAPI&) = delete; + + ::grpc::Status GetActivity( + ::grpc::ServerContext*, + const client_library::GetActivityForm* request, + client_library::GetActivityFormResponse* response + ) override { + auto result_future = service_->GetActivity(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_ACTIVITY_API_HH diff --git a/cpp/src/vereign/grpc/gen/company_api.hh b/cpp/src/vereign/grpc/gen/company_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..0dcb8aebb17fe24ed2f8604c418feb28671777d3 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/company_api.hh @@ -0,0 +1,517 @@ +#ifndef __VEREIGN_GRPC_GEN_COMPANY_API_HH +#define __VEREIGN_GRPC_GEN_COMPANY_API_HH + +#include <vereign/client_library/company_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class CompanyAPI : public client_library::CompanyAPI::Service { +public: + static constexpr const char* Name = "company"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + CompanyAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + CompanyAPI(const CompanyAPI&) = delete; + CompanyAPI& operator=(const CompanyAPI&) = delete; + + ::grpc::Status AddClaimToProfileTemplate( + ::grpc::ServerContext*, + const client_library::AddClaimToProfileTemplateForm* request, + client_library::AddClaimToProfileTemplateFormResponse* response + ) override { + auto result_future = service_->AddClaimToProfileTemplate(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddEmployee( + ::grpc::ServerContext*, + const client_library::AddEmployeeForm* request, + client_library::AddEmployeeFormResponse* response + ) override { + auto result_future = service_->AddEmployee(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddProfileTemplate( + ::grpc::ServerContext*, + const client_library::AddProfileTemplateForm* request, + client_library::AddProfileTemplateFormResponse* response + ) override { + auto result_future = service_->AddProfileTemplate(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddRole( + ::grpc::ServerContext*, + const client_library::AddRoleForm* request, + client_library::AddRoleFormResponse* response + ) override { + auto result_future = service_->AddRole(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddSharedIdentity( + ::grpc::ServerContext*, + const client_library::AddSharedIdentityForm* request, + client_library::AddSharedIdentityFormResponse* response + ) override { + auto result_future = service_->AddSharedIdentity(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ApplyProfileTemplate( + ::grpc::ServerContext*, + const client_library::ApplyProfileTemplateForm* request, + client_library::ApplyProfileTemplateFormResponse* response + ) override { + auto result_future = service_->ApplyProfileTemplate(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ApplyRoleTemplatesToEmployee( + ::grpc::ServerContext*, + const client_library::ApplyRoleTemplatesToEmployeeForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ApplyRoleTemplatesToEmployee(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status CreateCompany( + ::grpc::ServerContext*, + const client_library::CreateCompanyForm* request, + client_library::CreateCompanyFormResponse* response + ) override { + auto result_future = service_->CreateCompany(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status DeleteCompanyLogo( + ::grpc::ServerContext*, + const client_library::DeleteCompanyLogoForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->DeleteCompanyLogo(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status DeleteRole( + ::grpc::ServerContext*, + const client_library::DeleteRoleForm* request, + client_library::DeleteRoleFormResponse* response + ) override { + auto result_future = service_->DeleteRole(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetCompanyLogo( + ::grpc::ServerContext*, + const client_library::GetCompanyLogoForm* request, + client_library::GetCompanyLogoFormResponse* response + ) override { + auto result_future = service_->GetCompanyLogo(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetInfrastructure( + ::grpc::ServerContext*, + const client_library::GetInfrastructureForm* request, + client_library::GetInfrastructureFormResponse* response + ) override { + auto result_future = service_->GetInfrastructure(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListCompanies( + ::grpc::ServerContext*, + const client_library::ListCompaniesForm* request, + client_library::ListCompaniesFormResponse* response + ) override { + auto result_future = service_->ListCompanies(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListEmployees( + ::grpc::ServerContext*, + const client_library::ListEmployeesForm* request, + client_library::ListEmployeesFormResponse* response + ) override { + auto result_future = service_->ListEmployees(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListEmployeesForSharedIdentity( + ::grpc::ServerContext*, + const client_library::ListEmployeesForSharedIdentityForm* request, + client_library::ListEmployeesForSharedIdentityFormResponse* response + ) override { + auto result_future = service_->ListEmployeesForSharedIdentity(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListProfileTemplates( + ::grpc::ServerContext*, + const client_library::ListProfileTemplatesForm* request, + client_library::ListProfileTemplatesFormResponse* response + ) override { + auto result_future = service_->ListProfileTemplates(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListSharedIdentities( + ::grpc::ServerContext*, + const client_library::ListSharedIdentitiesForm* request, + client_library::ListSharedIdentitiesFormResponse* response + ) override { + auto result_future = service_->ListSharedIdentities(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListSharedIdentitiesForEmployee( + ::grpc::ServerContext*, + const client_library::ListSharedIdentitiesForEmployeeForm* request, + client_library::ListSharedIdentitiesForEmployeeFormResponse* response + ) override { + auto result_future = service_->ListSharedIdentitiesForEmployee(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListSubscribedTemplatesToRole( + ::grpc::ServerContext*, + const client_library::ListSubscribedTemplatesToRoleForm* request, + client_library::ListSubscribedTemplatesToRoleFormResponse* response + ) override { + auto result_future = service_->ListSubscribedTemplatesToRole(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status PutCompanyLogo( + ::grpc::ServerContext*, + const client_library::PutCompanyLogoForm* request, + client_library::PutCompanyLogoFormResponse* response + ) override { + auto result_future = service_->PutCompanyLogo(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveClaimFromProfileTemplate( + ::grpc::ServerContext*, + const client_library::RemoveClaimFromProfileTemplateForm* request, + client_library::RemoveClaimFromProfileTemplateFormResponse* response + ) override { + auto result_future = service_->RemoveClaimFromProfileTemplate(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status UpdateEmployeeStatus( + ::grpc::ServerContext*, + const client_library::UpdateEmployeeStatusForm* request, + client_library::UpdateEmployeeStatusFormResponse* response + ) override { + auto result_future = service_->UpdateEmployeeStatus(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_COMPANY_API_HH diff --git a/cpp/src/vereign/grpc/gen/contacts_api.hh b/cpp/src/vereign/grpc/gen/contacts_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..86e0c45f2fc2db616a0b4e655b46c54eb8d981af --- /dev/null +++ b/cpp/src/vereign/grpc/gen/contacts_api.hh @@ -0,0 +1,121 @@ +#ifndef __VEREIGN_GRPC_GEN_CONTACTS_API_HH +#define __VEREIGN_GRPC_GEN_CONTACTS_API_HH + +#include <vereign/client_library/contacts_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class ContactsAPI : public client_library::ContactsAPI::Service { +public: + static constexpr const char* Name = "contacts"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + ContactsAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + ContactsAPI(const ContactsAPI&) = delete; + ContactsAPI& operator=(const ContactsAPI&) = delete; + + ::grpc::Status ChangeStatus( + ::grpc::ServerContext*, + const client_library::ChangeStatusForm* request, + client_library::ChangeStatusFormResponse* response + ) override { + auto result_future = service_->ChangeStatus(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetUserContacts( + ::grpc::ServerContext*, + const client_library::GetUserContactsForm* request, + client_library::GetUserContactsFormResponse* response + ) override { + auto result_future = service_->GetUserContacts(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListContacts( + ::grpc::ServerContext*, + const client_library::ListContactsForm* request, + client_library::ListContactsFormResponse* response + ) override { + auto result_future = service_->ListContacts(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SearchContacts( + ::grpc::ServerContext*, + const client_library::SearchContactsForm* request, + client_library::SearchContactsFormResponse* response + ) override { + auto result_future = service_->SearchContacts(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_CONTACTS_API_HH diff --git a/cpp/src/vereign/grpc/gen/conversation_api.hh b/cpp/src/vereign/grpc/gen/conversation_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..9e45baeba539a6b27125dcc3b142ec3e2ff2c3f6 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/conversation_api.hh @@ -0,0 +1,121 @@ +#ifndef __VEREIGN_GRPC_GEN_CONVERSATION_API_HH +#define __VEREIGN_GRPC_GEN_CONVERSATION_API_HH + +#include <vereign/client_library/conversation_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class ConversationAPI : public client_library::ConversationAPI::Service { +public: + static constexpr const char* Name = "conversation"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + ConversationAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + ConversationAPI(const ConversationAPI&) = delete; + ConversationAPI& operator=(const ConversationAPI&) = delete; + + ::grpc::Status AddEmail( + ::grpc::ServerContext*, + const client_library::AddEmailForm* request, + client_library::AddEmailFormResponse* response + ) override { + auto result_future = service_->AddEmail(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetConversations( + ::grpc::ServerContext*, + const client_library::GetConversationsForm* request, + client_library::GetConversationsFormResponse* response + ) override { + auto result_future = service_->GetConversations(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetConversationsAndMessageIDByMessageUUID( + ::grpc::ServerContext*, + const client_library::GetConversationsAndMessageIDByMessageUUIDForm* request, + client_library::GetConversationsAndMessageIDByMessageUUIDResponse* response + ) override { + auto result_future = service_->GetConversationsAndMessageIDByMessageUUID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetEmails( + ::grpc::ServerContext*, + const client_library::GetEmailsForm* request, + client_library::GetEmailsFormResponse* response + ) override { + auto result_future = service_->GetEmails(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_CONVERSATION_API_HH diff --git a/cpp/src/vereign/grpc/gen/delete_api.hh b/cpp/src/vereign/grpc/gen/delete_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..2a59a2d79dc0cfc5100a1554492398a59151b29c --- /dev/null +++ b/cpp/src/vereign/grpc/gen/delete_api.hh @@ -0,0 +1,77 @@ +#ifndef __VEREIGN_GRPC_GEN_DELETE_API_HH +#define __VEREIGN_GRPC_GEN_DELETE_API_HH + +#include <vereign/client_library/delete_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class DeleteAPI : public client_library::DeleteAPI::Service { +public: + static constexpr const char* Name = "delete"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + DeleteAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + DeleteAPI(const DeleteAPI&) = delete; + DeleteAPI& operator=(const DeleteAPI&) = delete; + + ::grpc::Status DeleteInteraction( + ::grpc::ServerContext*, + const client_library::DeleteInteractionForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->DeleteInteraction(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status DeletePassport( + ::grpc::ServerContext*, + const client_library::DeletePassportForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->DeletePassport(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_DELETE_API_HH diff --git a/cpp/src/vereign/grpc/gen/document_api.hh b/cpp/src/vereign/grpc/gen/document_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..47c9a98a13293fcb437c1b66a856128cf8f70b8c --- /dev/null +++ b/cpp/src/vereign/grpc/gen/document_api.hh @@ -0,0 +1,275 @@ +#ifndef __VEREIGN_GRPC_GEN_DOCUMENT_API_HH +#define __VEREIGN_GRPC_GEN_DOCUMENT_API_HH + +#include <vereign/client_library/document_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class DocumentAPI : public client_library::DocumentAPI::Service { +public: + static constexpr const char* Name = "document"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + DocumentAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + DocumentAPI(const DocumentAPI&) = delete; + DocumentAPI& operator=(const DocumentAPI&) = delete; + + ::grpc::Status ConvertDocumentByUUID( + ::grpc::ServerContext*, + const client_library::ConvertDocumentByUUIDForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ConvertDocumentByUUID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status DeleteIdentityImage( + ::grpc::ServerContext*, + const client_library::DeleteIdentityImageForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->DeleteIdentityImage(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetDocument( + ::grpc::ServerContext*, + const client_library::EmptyRequest* request, + client_library::ListDocumentsResponse* response + ) override { + auto result_future = service_->GetDocument(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetDocumentByResourceID( + ::grpc::ServerContext*, + const client_library::GetDocumentByResourceIDForm* request, + client_library::GetDocumentByResourceIDFormResponse* response + ) override { + auto result_future = service_->GetDocumentByResourceID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetDocumentByUUID( + ::grpc::ServerContext*, + const client_library::GetDocumentByUUIDForm* request, + client_library::GetDocumentByUUIDFormResponse* response + ) override { + auto result_future = service_->GetDocumentByUUID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetFileInfo( + ::grpc::ServerContext*, + const client_library::EmptyRequest* request, + client_library::GetFileInfoResponse* response + ) override { + auto result_future = service_->GetFileInfo(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetIdentityImage( + ::grpc::ServerContext*, + const client_library::GetIdentityImageForm* request, + client_library::GetIdentityImageFormResponse* response + ) override { + auto result_future = service_->GetIdentityImage(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListDocuments( + ::grpc::ServerContext*, + const client_library::EmptyRequest* request, + client_library::ListDocumentsResponse* response + ) override { + auto result_future = service_->ListDocuments(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status PutDocumentByUUID( + ::grpc::ServerContext*, + const client_library::PutDocumentByUUIDForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->PutDocumentByUUID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status PutIdentityImage( + ::grpc::ServerContext*, + const client_library::PutIdentityImageForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->PutIdentityImage(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SignDocumentByUUID( + ::grpc::ServerContext*, + const client_library::SignDocumentByUUIDForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->SignDocumentByUUID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_DOCUMENT_API_HH diff --git a/cpp/src/vereign/grpc/gen/email_api.hh b/cpp/src/vereign/grpc/gen/email_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..ce70d4a720b0065d89aa78d617123ebfbb7d16fc --- /dev/null +++ b/cpp/src/vereign/grpc/gen/email_api.hh @@ -0,0 +1,231 @@ +#ifndef __VEREIGN_GRPC_GEN_EMAIL_API_HH +#define __VEREIGN_GRPC_GEN_EMAIL_API_HH + +#include <vereign/client_library/email_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class EmailAPI : public client_library::EmailAPI::Service { +public: + static constexpr const char* Name = "email"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + EmailAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + EmailAPI(const EmailAPI&) = delete; + EmailAPI& operator=(const EmailAPI&) = delete; + + ::grpc::Status GetEmailStatusAll( + ::grpc::ServerContext*, + const client_library::GetEmailStatusAllForm* request, + client_library::GetEmailStatusAllFormResponse* response + ) override { + auto result_future = service_->GetEmailStatusAll(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetEmailStatusList( + ::grpc::ServerContext*, + const client_library::GetEmailStatusListForm* request, + client_library::GetEmailStatusListFormResponse* response + ) override { + auto result_future = service_->GetEmailStatusList(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetGmailMessageIDsByGmailThreadID( + ::grpc::ServerContext*, + const client_library::GetGmailMessageIDsByGmailThreadIDForm* request, + client_library::GetGmailMessageIDsByGmailThreadIDFormResponse* response + ) override { + auto result_future = service_->GetGmailMessageIDsByGmailThreadID(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetMessageIDsByGmailMessageIDs( + ::grpc::ServerContext*, + const client_library::GetMessageIDsByGmailMessageIDsForm* request, + client_library::GetMessageIDsByGmailMessageIDsFormResponse* response + ) override { + auto result_future = service_->GetMessageIDsByGmailMessageIDs(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status InitializeEmailStatus( + ::grpc::ServerContext*, + const client_library::InitializeEmailStatusForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->InitializeEmailStatus(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SendEmailSmtp( + ::grpc::ServerContext*, + const client_library::SendEmailSmtpForm* request, + client_library::SendEmailSmtpFormResponse* response + ) override { + auto result_future = service_->SendEmailSmtp(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SendFeedback( + ::grpc::ServerContext*, + const client_library::SendFeedbackForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->SendFeedback(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status StoreGmailMessageId( + ::grpc::ServerContext*, + const client_library::StoreGmailMessageIdForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->StoreGmailMessageId(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status UpdateRecipientEmailStatus( + ::grpc::ServerContext*, + const client_library::UpdateRecipientEmailStatusForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->UpdateRecipientEmailStatus(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_EMAIL_API_HH diff --git a/cpp/src/vereign/grpc/gen/entity_api.hh b/cpp/src/vereign/grpc/gen/entity_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..01f8a0a03de6da27e71c69ee688b23372dc255a8 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/entity_api.hh @@ -0,0 +1,517 @@ +#ifndef __VEREIGN_GRPC_GEN_ENTITY_API_HH +#define __VEREIGN_GRPC_GEN_ENTITY_API_HH + +#include <vereign/client_library/entity_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class EntityAPI : public client_library::EntityAPI::Service { +public: + static constexpr const char* Name = "entity"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + EntityAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + EntityAPI(const EntityAPI&) = delete; + EntityAPI& operator=(const EntityAPI&) = delete; + + ::grpc::Status AddChild( + ::grpc::ServerContext*, + const client_library::AddChildForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddChild(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddClaim( + ::grpc::ServerContext*, + const client_library::AddClaimForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddClaim(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddGuarded( + ::grpc::ServerContext*, + const client_library::AddGuardedForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddGuarded(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddGuardian( + ::grpc::ServerContext*, + const client_library::AddGuardianForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddGuardian(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddMember( + ::grpc::ServerContext*, + const client_library::AddMemberForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddMember(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddMemberOf( + ::grpc::ServerContext*, + const client_library::AddMemberOfForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddMemberOf(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddParent( + ::grpc::ServerContext*, + const client_library::AddParentForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddParent(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AddViewer( + ::grpc::ServerContext*, + const client_library::AddViewerForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AddViewer(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status CreateEntity( + ::grpc::ServerContext*, + const client_library::CreateEntityForm* request, + client_library::CreateEntityFormResponse* response + ) override { + auto result_future = service_->CreateEntity(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status DeleteClaim( + ::grpc::ServerContext*, + const client_library::DeleteClaimForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->DeleteClaim(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetClaim( + ::grpc::ServerContext*, + const client_library::GetClaimForm* request, + client_library::GetClaimFormResponse* response + ) override { + auto result_future = service_->GetClaim(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetEntity( + ::grpc::ServerContext*, + const client_library::GetEntityForm* request, + client_library::GetEntityFormResponse* response + ) override { + auto result_future = service_->GetEntity(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveChild( + ::grpc::ServerContext*, + const client_library::RemoveChildForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveChild(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveGuarded( + ::grpc::ServerContext*, + const client_library::RemoveGuardedForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveGuarded(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveGuardian( + ::grpc::ServerContext*, + const client_library::RemoveGuardianForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveGuardian(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveMember( + ::grpc::ServerContext*, + const client_library::RemoveMemberForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveMember(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveMemberOf( + ::grpc::ServerContext*, + const client_library::RemoveMemberOfForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveMemberOf(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveParent( + ::grpc::ServerContext*, + const client_library::RemoveParentForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveParent(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RemoveViewer( + ::grpc::ServerContext*, + const client_library::RemoveViewerForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RemoveViewer(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SendClaimCode( + ::grpc::ServerContext*, + const client_library::ClaimSendCodeForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->SendClaimCode(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status UpdateClaim( + ::grpc::ServerContext*, + const client_library::AddClaimForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->UpdateClaim(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status VerifyClaimCode( + ::grpc::ServerContext*, + const client_library::ClaimVerifyCodeForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->VerifyClaimCode(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_ENTITY_API_HH diff --git a/cpp/src/vereign/grpc/gen/event_api.hh b/cpp/src/vereign/grpc/gen/event_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..4bfbebab356e0134b14bca9ad9b381f0b7eb553f --- /dev/null +++ b/cpp/src/vereign/grpc/gen/event_api.hh @@ -0,0 +1,55 @@ +#ifndef __VEREIGN_GRPC_GEN_EVENT_API_HH +#define __VEREIGN_GRPC_GEN_EVENT_API_HH + +#include <vereign/client_library/event_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class EventAPI : public client_library::EventAPI::Service { +public: + static constexpr const char* Name = "event"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + EventAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + EventAPI(const EventAPI&) = delete; + EventAPI& operator=(const EventAPI&) = delete; + + ::grpc::Status GetEvents( + ::grpc::ServerContext*, + const client_library::GetEventsForm* request, + client_library::GetEventsFormResponse* response + ) override { + auto result_future = service_->GetEvents(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_EVENT_API_HH diff --git a/cpp/src/vereign/grpc/gen/ews_api.hh b/cpp/src/vereign/grpc/gen/ews_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..15288f41f06170075c2fe6a6a812b18e405ca6c0 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/ews_api.hh @@ -0,0 +1,55 @@ +#ifndef __VEREIGN_GRPC_GEN_EWS_API_HH +#define __VEREIGN_GRPC_GEN_EWS_API_HH + +#include <vereign/client_library/ews_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class EwsAPI : public client_library::EwsAPI::Service { +public: + static constexpr const char* Name = "ews"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + EwsAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + EwsAPI(const EwsAPI&) = delete; + EwsAPI& operator=(const EwsAPI&) = delete; + + ::grpc::Status ProxyRequest( + ::grpc::ServerContext*, + const client_library::EWSProxyRequestForm* request, + client_library::EWSProxyRequestFormResponse* response + ) override { + auto result_future = service_->ProxyRequest(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_EWS_API_HH diff --git a/cpp/src/vereign/grpc/gen/gen.cc b/cpp/src/vereign/grpc/gen/gen.cc new file mode 100644 index 0000000000000000000000000000000000000000..b8e6dcca2553fbdd94197538d44c78dd7b0a6e5e --- /dev/null +++ b/cpp/src/vereign/grpc/gen/gen.cc @@ -0,0 +1,37 @@ +#include <vereign/grpc/gen/gen.hh> + +#include <vereign/service/gen/gen.hh> +#include <vereign/grpc/service_registry.hh> + +namespace vereign { +namespace grpc { +namespace gen { + +void RegisterAll( + restapi::ClientSession& client_session, + vereign::grpc::ServiceRegistry& service_registry +) { + service_registry.RegisterIfNotExist<ActionAPI<service::gen::ActionService>>(client_session); + service_registry.RegisterIfNotExist<ActivityAPI<service::gen::ActivityService>>(client_session); + service_registry.RegisterIfNotExist<CompanyAPI<service::gen::CompanyService>>(client_session); + service_registry.RegisterIfNotExist<ContactsAPI<service::gen::ContactsService>>(client_session); + service_registry.RegisterIfNotExist<ConversationAPI<service::gen::ConversationService>>(client_session); + service_registry.RegisterIfNotExist<DeleteAPI<service::gen::DeleteService>>(client_session); + service_registry.RegisterIfNotExist<DocumentAPI<service::gen::DocumentService>>(client_session); + service_registry.RegisterIfNotExist<EmailAPI<service::gen::EmailService>>(client_session); + service_registry.RegisterIfNotExist<EntityAPI<service::gen::EntityService>>(client_session); + service_registry.RegisterIfNotExist<EventAPI<service::gen::EventService>>(client_session); + service_registry.RegisterIfNotExist<EwsAPI<service::gen::EwsService>>(client_session); + service_registry.RegisterIfNotExist<IdentityAPI<service::gen::IdentityService>>(client_session); + service_registry.RegisterIfNotExist<InteractionsAPI<service::gen::InteractionsService>>(client_session); + service_registry.RegisterIfNotExist<OrdersAPI<service::gen::OrdersService>>(client_session); + service_registry.RegisterIfNotExist<PassportAPI<service::gen::PassportService>>(client_session); + service_registry.RegisterIfNotExist<ReportingAPI<service::gen::ReportingService>>(client_session); + service_registry.RegisterIfNotExist<ResourceAPI<service::gen::ResourceService>>(client_session); + service_registry.RegisterIfNotExist<SharingAPI<service::gen::SharingService>>(client_session); + service_registry.RegisterIfNotExist<SignAPI<service::gen::SignService>>(client_session); +} + +} +} +} diff --git a/cpp/src/vereign/grpc/gen/gen.hh b/cpp/src/vereign/grpc/gen/gen.hh new file mode 100644 index 0000000000000000000000000000000000000000..1f0d44be5fea9c6af85ea0bb1611f19c812d7c0d --- /dev/null +++ b/cpp/src/vereign/grpc/gen/gen.hh @@ -0,0 +1,42 @@ +#ifndef __VEREIGN_GRPC_GEN_GEN_HH +#define __VEREIGN_GRPC_GEN_GEN_HH + + +#include <vereign/grpc/gen/action_api.hh> +#include <vereign/grpc/gen/activity_api.hh> +#include <vereign/grpc/gen/company_api.hh> +#include <vereign/grpc/gen/contacts_api.hh> +#include <vereign/grpc/gen/conversation_api.hh> +#include <vereign/grpc/gen/delete_api.hh> +#include <vereign/grpc/gen/document_api.hh> +#include <vereign/grpc/gen/email_api.hh> +#include <vereign/grpc/gen/entity_api.hh> +#include <vereign/grpc/gen/event_api.hh> +#include <vereign/grpc/gen/ews_api.hh> +#include <vereign/grpc/gen/identity_api.hh> +#include <vereign/grpc/gen/interactions_api.hh> +#include <vereign/grpc/gen/orders_api.hh> +#include <vereign/grpc/gen/passport_api.hh> +#include <vereign/grpc/gen/reporting_api.hh> +#include <vereign/grpc/gen/resource_api.hh> +#include <vereign/grpc/gen/sharing_api.hh> +#include <vereign/grpc/gen/sign_api.hh> + +namespace vereign { +namespace restapi { +class ClientSession; +} + +namespace grpc { + +class ServiceRegistry; + +namespace gen { + +void RegisterAll(restapi::ClientSession& client_session, grpc::ServiceRegistry& service_registry); + +} // namespace gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_GEN_HH diff --git a/cpp/src/vereign/grpc/gen/identity_api.hh b/cpp/src/vereign/grpc/gen/identity_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..2d9f4dc8501b396ac883b6cc1bd21dbf71edede7 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/identity_api.hh @@ -0,0 +1,385 @@ +#ifndef __VEREIGN_GRPC_GEN_IDENTITY_API_HH +#define __VEREIGN_GRPC_GEN_IDENTITY_API_HH + +#include <vereign/client_library/identity_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class IdentityAPI : public client_library::IdentityAPI::Service { +public: + static constexpr const char* Name = "identity"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + IdentityAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + IdentityAPI(const IdentityAPI&) = delete; + IdentityAPI& operator=(const IdentityAPI&) = delete; + + ::grpc::Status AuthorizeDevice( + ::grpc::ServerContext*, + const client_library::AuthorizeDeviceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AuthorizeDevice(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status CancelAction( + ::grpc::ServerContext*, + const client_library::CancelActionForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->CancelAction(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ConfirmAction( + ::grpc::ServerContext*, + const client_library::ConfirmActionExecutionForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ConfirmAction(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ConfirmNewCarddavPublicKey( + ::grpc::ServerContext*, + const client_library::ConfirmNewCarddavPublicKeyForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ConfirmNewCarddavPublicKey(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ConfirmNewDevice( + ::grpc::ServerContext*, + const client_library::ConfirmNewDeviceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ConfirmNewDevice(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GenerateCredentials( + ::grpc::ServerContext*, + const client_library::GenerateCredentialsForm* request, + client_library::GenerateCredentialsFormResponse* response + ) override { + auto result_future = service_->GenerateCredentials(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetAvatar( + ::grpc::ServerContext*, + const client_library::GetIdentityAvatarForm* request, + client_library::GetIdentityAvatarFormResponse* response + ) override { + auto result_future = service_->GetAvatar(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetIdentityProfileData( + ::grpc::ServerContext*, + const client_library::GetIdentityProfileDataForm* request, + client_library::GetIdentityProfileDataFormResponse* response + ) override { + auto result_future = service_->GetIdentityProfileData(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status HasUnauthorizedDevices( + ::grpc::ServerContext*, + const client_library::EmptyRequest* request, + client_library::HasUnauthorizedDevicesHandlerFormResponse* response + ) override { + auto result_future = service_->HasUnauthorizedDevices(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListDevices( + ::grpc::ServerContext*, + const client_library::EmptyRequest* request, + client_library::ListDevicesHandlerFormResponse* response + ) override { + auto result_future = service_->ListDevices(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status PullAvatarFromGravatar( + ::grpc::ServerContext*, + const client_library::PullAvatarFromGravatarForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->PullAvatarFromGravatar(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status Register2FAPublicKey( + ::grpc::ServerContext*, + const client_library::Register2FAPublicKeyForm* request, + client_library::Register2FAPublicKeyFormResponse* response + ) override { + auto result_future = service_->Register2FAPublicKey(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RenameDevice( + ::grpc::ServerContext*, + const client_library::RenameDeviceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RenameDevice(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ResumeDevice( + ::grpc::ServerContext*, + const client_library::ResumeDeviceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ResumeDevice(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RevokeDevice( + ::grpc::ServerContext*, + const client_library::RevokeDeviceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RevokeDevice(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SuspendDevice( + ::grpc::ServerContext*, + const client_library::SuspendDeviceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->SuspendDevice(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_IDENTITY_API_HH diff --git a/cpp/src/vereign/grpc/gen/interactions_api.hh b/cpp/src/vereign/grpc/gen/interactions_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..b0947b6331d12c93dfd1bcb8cadbf2380beccc6b --- /dev/null +++ b/cpp/src/vereign/grpc/gen/interactions_api.hh @@ -0,0 +1,55 @@ +#ifndef __VEREIGN_GRPC_GEN_INTERACTIONS_API_HH +#define __VEREIGN_GRPC_GEN_INTERACTIONS_API_HH + +#include <vereign/client_library/interactions_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class InteractionsAPI : public client_library::InteractionsAPI::Service { +public: + static constexpr const char* Name = "interactions"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + InteractionsAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + InteractionsAPI(const InteractionsAPI&) = delete; + InteractionsAPI& operator=(const InteractionsAPI&) = delete; + + ::grpc::Status SearchInteractions( + ::grpc::ServerContext*, + const client_library::SearchInteractionsForm* request, + client_library::SearchInteractionsFormResponse* response + ) override { + auto result_future = service_->SearchInteractions(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_INTERACTIONS_API_HH diff --git a/cpp/src/vereign/grpc/gen/orders_api.hh b/cpp/src/vereign/grpc/gen/orders_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..1fae8e728c7ac5fbae33f5a4cdf689291551c772 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/orders_api.hh @@ -0,0 +1,143 @@ +#ifndef __VEREIGN_GRPC_GEN_ORDERS_API_HH +#define __VEREIGN_GRPC_GEN_ORDERS_API_HH + +#include <vereign/client_library/orders_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class OrdersAPI : public client_library::OrdersAPI::Service { +public: + static constexpr const char* Name = "orders"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + OrdersAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + OrdersAPI(const OrdersAPI&) = delete; + OrdersAPI& operator=(const OrdersAPI&) = delete; + + ::grpc::Status ConfirmCardPayment( + ::grpc::ServerContext*, + const client_library::ConfirmCardPaymentForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->ConfirmCardPayment(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetGeneratedInvoiceForOrder( + ::grpc::ServerContext*, + const client_library::GetGeneratedInvoiceForOrderForm* request, + client_library::GetGeneratedInvoiceForOrderFormResponse* response + ) override { + auto result_future = service_->GetGeneratedInvoiceForOrder(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetOrder( + ::grpc::ServerContext*, + const client_library::GetOrderForm* request, + client_library::GetOrderFormResponse* response + ) override { + auto result_future = service_->GetOrder(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status InitializeCardPayment( + ::grpc::ServerContext*, + const client_library::InitializeCardPaymentForm* request, + client_library::InitializeCardPaymentFormResponse* response + ) override { + auto result_future = service_->InitializeCardPayment(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListOrders( + ::grpc::ServerContext*, + const client_library::ListOrdersForm* request, + client_library::ListOrdersFormResponse* response + ) override { + auto result_future = service_->ListOrders(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_ORDERS_API_HH diff --git a/cpp/src/vereign/grpc/gen/passport_api.hh b/cpp/src/vereign/grpc/gen/passport_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..14f05684fc6d0e8737c5858ac7f847e073e6c5b4 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/passport_api.hh @@ -0,0 +1,385 @@ +#ifndef __VEREIGN_GRPC_GEN_PASSPORT_API_HH +#define __VEREIGN_GRPC_GEN_PASSPORT_API_HH + +#include <vereign/client_library/passport_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class PassportAPI : public client_library::PassportAPI::Service { +public: + static constexpr const char* Name = "passport"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + PassportAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + PassportAPI(const PassportAPI&) = delete; + PassportAPI& operator=(const PassportAPI&) = delete; + + ::grpc::Status AttachFunction( + ::grpc::ServerContext*, + const client_library::AttachFunctionToPassportClaimForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AttachFunction(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status CallFunction( + ::grpc::ServerContext*, + const client_library::CallFunctionForm* request, + client_library::CallFunctionFormResponse* response + ) override { + auto result_future = service_->CallFunction(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GenerateDIDs( + ::grpc::ServerContext*, + const client_library::GenerateDIDsForm* request, + client_library::GenerateDIDsFormResponse* response + ) override { + auto result_future = service_->GenerateDIDs(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetAvatarByPassport( + ::grpc::ServerContext*, + const client_library::GetAvatarByPassportForm* request, + client_library::GetAvatarByPassportFormResponse* response + ) override { + auto result_future = service_->GetAvatarByPassport(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetDIDs( + ::grpc::ServerContext*, + const client_library::GetDIDsForm* request, + client_library::GetDIDsFormResponse* response + ) override { + auto result_future = service_->GetDIDs(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetEmailWithHeaderByPassport( + ::grpc::ServerContext*, + const client_library::GetEmailWithHeaderByPassportForm* request, + client_library::GetEmailWithHeaderByPassportFormResponse* response + ) override { + auto result_future = service_->GetEmailWithHeaderByPassport(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetInteractions( + ::grpc::ServerContext*, + const client_library::GetInteractionsForm* request, + client_library::GetInteractionsFormResponse* response + ) override { + auto result_future = service_->GetInteractions(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetVCardImage( + ::grpc::ServerContext*, + const client_library::GetVCardImageForm* request, + client_library::GetVCardImageFormResponse* response + ) override { + auto result_future = service_->GetVCardImage(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GetVCardTemplate( + ::grpc::ServerContext*, + const client_library::GetVCardTemplateForm* request, + client_library::GetVCardTemplateFormResponse* response + ) override { + auto result_future = service_->GetVCardTemplate(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status LinkClaim( + ::grpc::ServerContext*, + const client_library::LinkClaimToPassportForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->LinkClaim(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListFunctions( + ::grpc::ServerContext*, + const client_library::EmptyRequest* request, + client_library::ListFunctionsResponse* response + ) override { + auto result_future = service_->ListFunctions(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListPassports( + ::grpc::ServerContext*, + const client_library::ListPassportsForm* request, + client_library::ListPassportsFormResponse* response + ) override { + auto result_future = service_->ListPassports(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListPassportsForSharedIdentity( + ::grpc::ServerContext*, + const client_library::ListPassportsForSharedIdentityForm* request, + client_library::ListPassportsForSharedIdentityFormResponse* response + ) override { + auto result_future = service_->ListPassportsForSharedIdentity(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListSharedIdentitiesWithUser( + ::grpc::ServerContext*, + const client_library::ListSharedIdentitiesWithUserForm* request, + client_library::ListSharedIdentitiesWithUserFormResponse* response + ) override { + auto result_future = service_->ListSharedIdentitiesWithUser(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SetVCardImage( + ::grpc::ServerContext*, + const client_library::SetVCardImageForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->SetVCardImage(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status StoreDIDs( + ::grpc::ServerContext*, + const client_library::StoreDIDsForm* request, + client_library::StoreDIDsFormResponse* response + ) override { + auto result_future = service_->StoreDIDs(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_PASSPORT_API_HH diff --git a/cpp/src/vereign/grpc/gen/reporting_api.hh b/cpp/src/vereign/grpc/gen/reporting_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..bbbf4f0af92943e973006cba9722c138d78c8a88 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/reporting_api.hh @@ -0,0 +1,77 @@ +#ifndef __VEREIGN_GRPC_GEN_REPORTING_API_HH +#define __VEREIGN_GRPC_GEN_REPORTING_API_HH + +#include <vereign/client_library/reporting_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class ReportingAPI : public client_library::ReportingAPI::Service { +public: + static constexpr const char* Name = "reporting"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + ReportingAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + ReportingAPI(const ReportingAPI&) = delete; + ReportingAPI& operator=(const ReportingAPI&) = delete; + + ::grpc::Status Getbillingdataforperiod( + ::grpc::ServerContext*, + const client_library::GetBillingDataForPeriodForm* request, + client_library::GetBillingDataForPeriodFormResponse* response + ) override { + auto result_future = service_->Getbillingdataforperiod(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status Getreporttotaldata( + ::grpc::ServerContext*, + const client_library::GetReportTotalDataForm* request, + client_library::GetReportTotalDataFormResponse* response + ) override { + auto result_future = service_->Getreporttotaldata(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_REPORTING_API_HH diff --git a/cpp/src/vereign/grpc/gen/resource_api.hh b/cpp/src/vereign/grpc/gen/resource_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..13f6ba243537c313d8f81064199e46a4fe6c7301 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/resource_api.hh @@ -0,0 +1,77 @@ +#ifndef __VEREIGN_GRPC_GEN_RESOURCE_API_HH +#define __VEREIGN_GRPC_GEN_RESOURCE_API_HH + +#include <vereign/client_library/resource_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class ResourceAPI : public client_library::ResourceAPI::Service { +public: + static constexpr const char* Name = "resource"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + ResourceAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + ResourceAPI(const ResourceAPI&) = delete; + ResourceAPI& operator=(const ResourceAPI&) = delete; + + ::grpc::Status DeleteResourceByToken( + ::grpc::ServerContext*, + const client_library::DeleteResourceForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->DeleteResourceByToken(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status StoreResource( + ::grpc::ServerContext*, + const client_library::StoreResourceForm* request, + client_library::StoreResourceFormResponse* response + ) override { + auto result_future = service_->StoreResource(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_RESOURCE_API_HH diff --git a/cpp/src/vereign/grpc/gen/sharing_api.hh b/cpp/src/vereign/grpc/gen/sharing_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..e52aea713ea225b880fff06a47b6b85c7dbe73c2 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/sharing_api.hh @@ -0,0 +1,165 @@ +#ifndef __VEREIGN_GRPC_GEN_SHARING_API_HH +#define __VEREIGN_GRPC_GEN_SHARING_API_HH + +#include <vereign/client_library/sharing_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class SharingAPI : public client_library::SharingAPI::Service { +public: + static constexpr const char* Name = "sharing"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + SharingAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + SharingAPI(const SharingAPI&) = delete; + SharingAPI& operator=(const SharingAPI&) = delete; + + ::grpc::Status AcceptSharingRequestMovePassport( + ::grpc::ServerContext*, + const client_library::AcceptSharingRequestMovePassportForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AcceptSharingRequestMovePassport(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status AcceptSharingRequestPersistPassport( + ::grpc::ServerContext*, + const client_library::AcceptSharingRequestPersistPassportForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->AcceptSharingRequestPersistPassport(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListPendingSharingRequests( + ::grpc::ServerContext*, + const client_library::ListPendingSharingRequestsForm* request, + client_library::ListPendingSharingRequestsFormResponse* response + ) override { + auto result_future = service_->ListPendingSharingRequests(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ListRejectedSharingRequests( + ::grpc::ServerContext*, + const client_library::ListRejectedSharingRequestsForm* request, + client_library::ListRejectedSharingRequestsFormResponse* response + ) override { + auto result_future = service_->ListRejectedSharingRequests(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RejectSharingRequest( + ::grpc::ServerContext*, + const client_library::RejectSharingRequestForm* request, + client_library::EmptyResponse* response + ) override { + auto result_future = service_->RejectSharingRequest(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SendShareDocumentRequest( + ::grpc::ServerContext*, + const client_library::SendShareDocumentRequestForm* request, + client_library::SendShareDocumentRequestFormResponse* response + ) override { + auto result_future = service_->SendShareDocumentRequest(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_SHARING_API_HH diff --git a/cpp/src/vereign/grpc/gen/sign_api.hh b/cpp/src/vereign/grpc/gen/sign_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..7d9cf59d6cda7fd40664b00edaae9f2014907b81 --- /dev/null +++ b/cpp/src/vereign/grpc/gen/sign_api.hh @@ -0,0 +1,165 @@ +#ifndef __VEREIGN_GRPC_GEN_SIGN_API_HH +#define __VEREIGN_GRPC_GEN_SIGN_API_HH + +#include <vereign/client_library/sign_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +template <class VereignService> +class SignAPI : public client_library::SignAPI::Service { +public: + static constexpr const char* Name = "sign"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + SignAPI(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + SignAPI(const SignAPI&) = delete; + SignAPI& operator=(const SignAPI&) = delete; + + ::grpc::Status GenerateCmsForChain( + ::grpc::ServerContext*, + const client_library::GenerateCmsForChainForm* request, + client_library::GenerateCmsForChainFormResponse* response + ) override { + auto result_future = service_->GenerateCmsForChain(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status GenerateCmsForPassport( + ::grpc::ServerContext*, + const client_library::GenerateCmsForPassportForm* request, + client_library::GenerateCmsForPassportFormResponse* response + ) override { + auto result_future = service_->GenerateCmsForPassport(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ResignEmail( + ::grpc::ServerContext*, + const client_library::ResignSMIMEForm* request, + client_library::ResignSMIMEFormResponse* response + ) override { + auto result_future = service_->ResignEmail(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status RetrieveRootCertificate( + ::grpc::ServerContext*, + const client_library::RetrieveRootCertificateForm* request, + client_library::RetrieveRootCertificateFormResponse* response + ) override { + auto result_future = service_->RetrieveRootCertificate(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status SignVCardForChain( + ::grpc::ServerContext*, + const client_library::SignVCardForChainForm* request, + client_library::SignVCardForChainFormResponse* response + ) override { + auto result_future = service_->SignVCardForChain(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + + ::grpc::Status ValidateVMime( + ::grpc::ServerContext*, + const client_library::ValidateVMimeForm* request, + client_library::ValidateVMimeFormResponse* response + ) override { + auto result_future = service_->ValidateVMime(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_SIGN_API_HH diff --git a/cpp/src/vereign/grpc/identity_api.hh b/cpp/src/vereign/grpc/identity_api.hh new file mode 100644 index 0000000000000000000000000000000000000000..6083548eb488823dafedf3991c9c704af929b91f --- /dev/null +++ b/cpp/src/vereign/grpc/identity_api.hh @@ -0,0 +1,150 @@ +#ifndef __VEREIGN_GRPC_IDENTITY_API_HH +#define __VEREIGN_GRPC_IDENTITY_API_HH + +#include <vereign/grpc/gen/identity_api.hh> + +#include <vereign/grpc/error_code.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/client_library/common_types.pb.h> +#include <vereign/client_library/identity_types.pb.h> +#include <boost/core/ignore_unused.hpp> + +namespace vereign::grpc { + +/** + * Implementation of the gRPC `vereign::client_library::IdentityAPI::Service` service. + * + * Inherits all the API implementations from the generated gen::IdentityAPI and adds some + * additional implementations. + * + * IdentityAPI is a thin layer on top of the service::IdentityService. + */ +template <class VereignService> +class IdentityAPI final : public gen::IdentityAPI<VereignService> { +public: + // API service name. + static constexpr const char* Name = gen::IdentityAPI<VereignService>::Name; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + /** + * Constructs IdentityAPI instance. + * + * @param service The client library Identity service. + */ + IdentityAPI(VereignServicePtr&& service) + : gen::IdentityAPI<VereignService>{std::move(service)} + {} + + // disable copying + IdentityAPI(const IdentityAPI&) = delete; + auto operator=(const IdentityAPI&) -> IdentityAPI& = delete; + + /** + * Registers a new device. + * + * req.pin is required only under Linux. + * + * Under windows the system cypto storage is used. + * When the device is registered a master key is created and the user will be asked for his + * consent by showing a dialog window. + * + * Unexpected error codes: + * - ErrorCode::ClientError Error that happen inside the Vereign Client Library + * - ErrorCode::UnexpectedError Should never happen. + * + * Error codes of interest: + * - ErrorCode::InvalidPinCode The pin code is invalid, currently during the registration an empty + * pin code is considered invalid. + */ + auto LoginWithNewDevice( + ::grpc::ServerContext* ctx, + const client_library::LoginFormNewDevice* req, + client_library::LoginFormNewDeviceResponse* resp + ) -> ::grpc::Status override { + boost::ignore_unused(ctx); + + try { + this->service_->LoginWithNewDevice(req, resp); + + } catch (const kvstore::InvalidPinCodeError& e) { + resp->set_code(ErrorCodeAsString(ErrorCode::InvalidPinCode)); + resp->set_status(ClientErrorStatus); + resp->set_error(e.what()); + + } catch (const std::exception& e) { + resp->set_code(ErrorCodeAsString(ErrorCode::ClientError)); + resp->set_status(ClientErrorStatus); + resp->set_error(e.what()); + + } catch (...) { + resp->set_code(ErrorCodeAsString(ErrorCode::UnexpectedError)); + resp->set_status(ClientErrorStatus); + resp->set_error(ClientErrorStatus); + } + + return ::grpc::Status::OK; + } + + /** + * Login with already registered device. + * + * req.pin is required only under Linux. + * + * Under windows the system cypto storage is used. + * When the device is registered a master key is created and the user will be asked for his + * consent by showing a dialog window. + * + * Unexpected error codes: + * - ErrorCode::ClientError Error that happen inside the Vereign Client Library + * - ErrorCode::UnexpectedError Should never happen. + * + * Error codes of interest: + * - ErrorCode::DeviceNotRegistered The device is not registered. + * - ErrorCode::InvalidPinCode The pin code is invalid and the crypto storage cannot be unlocked. + * - ErrorCode::InvalidIdentity Under windows if for some reason the RSA master key has been changed. + */ + auto LoginWithPreviouslyAddedDevice( + ::grpc::ServerContext* ctx, + const client_library::LoginFormPreviousAddedDevice* req, + client_library::EmptyResponse* resp + ) -> ::grpc::Status override { + boost::ignore_unused(ctx); + + try { + this->service_->LoginWithPreviouslyAddedDevice(req, resp); + + } catch (const kvstore::StorageNotInitializedError& e) { + resp->set_code(ErrorCodeAsString(ErrorCode::DeviceNotRegistered)); + resp->set_status(ClientErrorStatus); + resp->set_error(e.what()); + + } catch (const kvstore::InvalidPinCodeError& e) { + resp->set_code(ErrorCodeAsString(ErrorCode::InvalidPinCode)); + resp->set_status(ClientErrorStatus); + resp->set_error(e.what()); + + } catch (const kvstore::InvalidIdentityError& e) { + resp->set_code(ErrorCodeAsString(ErrorCode::InvalidIdentity)); + resp->set_status(ClientErrorStatus); + resp->set_error(e.what()); + + } catch (const std::exception& e) { + resp->set_code(ErrorCodeAsString(ErrorCode::ClientError)); + resp->set_status(ClientErrorStatus); + resp->set_error(e.what()); + + } catch (...) { + resp->set_code(ErrorCodeAsString(ErrorCode::UnexpectedError)); + resp->set_status(ClientErrorStatus); + resp->set_error(ClientErrorStatus); + } + + return ::grpc::Status::OK; + } +}; + +} // namespace vereign::grpc + +#endif // __VEREIGN_GRPC_IDENTITY_API_HH diff --git a/cpp/src/vereign/grpc/json/encoder.cc b/cpp/src/vereign/grpc/json/encoder.cc new file mode 100644 index 0000000000000000000000000000000000000000..31a22833540b2c80d7bbe6adc2d436e0a9a27523 --- /dev/null +++ b/cpp/src/vereign/grpc/json/encoder.cc @@ -0,0 +1,343 @@ +#include <iterator> +#include <vereign/grpc/json/encoder.hh> + +#include <google/protobuf/descriptor.h> +#include <google/protobuf/reflection.h> +#include <nlohmann/json.hpp> + +#include <boost/beast/core/detail/base64.hpp> + +namespace vereign { +namespace grpc { +namespace json { + +namespace detail { + +/** + * The encoder used by ::Encode function. + * + * It currently uses https://github.com/nlohmann/json library. + */ +class Encoder { +public: + Encoder(const EncodeOptions& options) + : options_{options} + { + } + + void Encode( + const google::protobuf::Message& msg, + std::string& output + ) { + nlohmann::json json = nlohmann::json::object(); + encodeMessage(json, msg); + output = json.dump(options_.Indent); + } + +private: + void encodeMessage(nlohmann::json& json, const google::protobuf::Message& msg) { + const google::protobuf::Descriptor* desc = msg.GetDescriptor(); + const google::protobuf::Reflection* refl = msg.GetReflection(); + int field_cnt = desc->field_count(); + for (int i = 0; i < field_cnt; i++) { + const google::protobuf::FieldDescriptor* field = desc->field(i); + // skip non-existing onef values + if (field->containing_oneof() != nullptr && !refl->HasField(msg, field)) { + continue; + } + + if (field->is_map()) { + encodeMapFieldValue(json, field->name(), msg, field, refl); + continue; + } + + if (field->is_repeated()) { + encodeRepeatedFieldValue(json, field->name(), msg, field, refl); + continue; + } + + if (!field->is_repeated()) { + encodeFieldValue(json, field->name(), msg, field, refl); + } + } + } + + template <typename T> + void encodeNumberValue(nlohmann::json& json, const std::string& field_name, T number) { + if (number == 0 && options_.OmitEmpty) { + return; + } + + json[field_name] = number; + } + + void encodeFieldValue( + nlohmann::json& json, + const std::string& name, + const google::protobuf::Message& msg, + const google::protobuf::FieldDescriptor* field, + const google::protobuf::Reflection* refl + ) { + switch (field->type()) { + case google::protobuf::FieldDescriptor::TYPE_ENUM: + encodeNumberValue(json, name, refl->GetEnumValue(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_INT32: + case google::protobuf::FieldDescriptor::TYPE_SINT32: + case google::protobuf::FieldDescriptor::TYPE_SFIXED32: + encodeNumberValue(json, name, refl->GetInt32(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_INT64: + case google::protobuf::FieldDescriptor::TYPE_SINT64: + case google::protobuf::FieldDescriptor::TYPE_SFIXED64: + encodeNumberValue(json, name, refl->GetInt64(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_UINT32: + case google::protobuf::FieldDescriptor::TYPE_FIXED32: + encodeNumberValue(json, name, refl->GetUInt32(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_UINT64: + case google::protobuf::FieldDescriptor::TYPE_FIXED64: + encodeNumberValue(json, name, refl->GetUInt64(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_FLOAT: + encodeNumberValue(json, name, refl->GetFloat(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_DOUBLE: + encodeNumberValue(json, name, refl->GetDouble(msg, field)); + break; + + case google::protobuf::FieldDescriptor::TYPE_BOOL: + json[name] = refl->GetBool(msg, field); + break; + + case google::protobuf::FieldDescriptor::TYPE_STRING: { + auto value = refl->GetString(msg, field); + if (value.empty() && options_.OmitEmpty) { + break; + } + + json[name] = std::move(value); + break; + } + case google::protobuf::FieldDescriptor::TYPE_BYTES: { + auto bytes = refl->GetString(msg, field); + if (bytes.empty() && options_.OmitEmpty) { + break; + } + + json[name] = base64Encode(bytes); + break; + } + case google::protobuf::FieldDescriptor::TYPE_MESSAGE: { + nlohmann::json obj; + encodeMessage(obj, refl->GetMessage(msg, field)); + if (obj.empty() && options_.OmitEmpty) { + break; + } + + json[name] = std::move(obj); + break; + } + default: + throw EncodeError{"unknown type " + std::string(field->type_name())}; + } + } + + static auto base64Encode(const std::string& src) -> std::string { + std::string dst; + dst.resize(boost::beast::detail::base64::encoded_size(src.size())); + dst.resize(boost::beast::detail::base64::encode((void*)dst.data(), src.data(), src.size())); + return dst; + } + + template <typename T> + void encodeRepeatedScalar( + nlohmann::json& jsonArr, + const google::protobuf::Message& msg, + const google::protobuf::FieldDescriptor* field, + const google::protobuf::Reflection* refl + ) { + int size = refl->FieldSize(msg, field); + auto repeatedField = refl->GetRepeatedFieldRef<T>(msg, field); + for (int i = 0; i < size; i++) { + jsonArr.push_back(repeatedField.Get(i)); + } + } + + void encodeRepeatedFieldValue( + nlohmann::json& json, + const std::string& name, + const google::protobuf::Message& msg, + const google::protobuf::FieldDescriptor* field, + const google::protobuf::Reflection* refl + ) { + if (refl->FieldSize(msg, field) == 0) { + if (options_.OmitEmpty) { + return; + } + + json[name] = nlohmann::json::array(); + return; + } + + json[name] = nlohmann::json::array(); + auto& jsonArr = json[name]; + + switch (field->type()) { + case google::protobuf::FieldDescriptor::TYPE_ENUM: + encodeRepeatedScalar<int32_t>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_INT32: + case google::protobuf::FieldDescriptor::TYPE_SINT32: + case google::protobuf::FieldDescriptor::TYPE_SFIXED32: + encodeRepeatedScalar<int32_t>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_INT64: + case google::protobuf::FieldDescriptor::TYPE_SINT64: + case google::protobuf::FieldDescriptor::TYPE_SFIXED64: + encodeRepeatedScalar<int64_t>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_UINT32: + case google::protobuf::FieldDescriptor::TYPE_FIXED32: + encodeRepeatedScalar<uint32_t>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_UINT64: + case google::protobuf::FieldDescriptor::TYPE_FIXED64: + encodeRepeatedScalar<uint64_t>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_FLOAT: + encodeRepeatedScalar<float>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_DOUBLE: + encodeRepeatedScalar<double>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_BOOL: + encodeRepeatedScalar<bool>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_STRING: + encodeRepeatedScalar<std::string>(jsonArr, msg, field, refl); + break; + + case google::protobuf::FieldDescriptor::TYPE_BYTES: { + int size = refl->FieldSize(msg, field); + for (int i = 0; i < size; i++) { + jsonArr.push_back(base64Encode(refl->GetRepeatedString(msg, field, i))); + } + break; + } + case google::protobuf::FieldDescriptor::TYPE_MESSAGE: { + int size = refl->FieldSize(msg, field); + for (int i = 0; i < size; i++) { + nlohmann::json obj = nlohmann::json::object(); + encodeMessage(obj, refl->GetRepeatedMessage(msg, field, i)); + jsonArr.push_back(std::move(obj)); + } + break; + } + default: + throw EncodeError{"unknown type " + std::to_string(field->type())}; + } + } + + void encodeMapFieldValue( + nlohmann::json& json, + const std::string& name, + const google::protobuf::Message& msg, + const google::protobuf::FieldDescriptor* field, + const google::protobuf::Reflection* refl + ) { + int size = refl->FieldSize(msg, field); + if (size == 0 && options_.OmitEmpty) { + return; + } + + json[name] = nlohmann::json::object(); + auto& mapObj = json[name]; + + for (int i = 0; i < size; i++) { + auto& pairMsg = refl->GetRepeatedMessage(msg, field, i); + + const google::protobuf::Descriptor* pairDesc = pairMsg.GetDescriptor(); + const google::protobuf::Reflection* pairRefl = pairMsg.GetReflection(); + + auto valueField = pairDesc->FindFieldByName("value"); + if (valueField == nullptr) { + throw EncodeError{"cannot find map value field"}; + } + + auto keyField = pairDesc->FindFieldByName("key"); + if (keyField == nullptr) { + throw EncodeError{"cannot find map key field"}; + } + + encodeFieldValue( + mapObj, + getMapKey(pairMsg, keyField, pairRefl), + pairMsg, + valueField, + pairRefl + ); + } + } + + static auto getMapKey( + const google::protobuf::Message& msg, + const google::protobuf::FieldDescriptor* keyField, + const google::protobuf::Reflection* mapRefl + ) -> std::string { + + switch (keyField->type()) { + case google::protobuf::FieldDescriptor::TYPE_INT32: + case google::protobuf::FieldDescriptor::TYPE_SINT32: + case google::protobuf::FieldDescriptor::TYPE_SFIXED32: + return std::to_string(mapRefl->GetInt32(msg, keyField)); + + case google::protobuf::FieldDescriptor::TYPE_INT64: + case google::protobuf::FieldDescriptor::TYPE_SINT64: + case google::protobuf::FieldDescriptor::TYPE_SFIXED64: + return std::to_string(mapRefl->GetInt64(msg, keyField)); + + case google::protobuf::FieldDescriptor::TYPE_UINT32: + case google::protobuf::FieldDescriptor::TYPE_FIXED32: + return std::to_string(mapRefl->GetUInt32(msg, keyField)); + + case google::protobuf::FieldDescriptor::TYPE_UINT64: + case google::protobuf::FieldDescriptor::TYPE_FIXED64: + return std::to_string(mapRefl->GetUInt64(msg, keyField)); + + case google::protobuf::FieldDescriptor::TYPE_STRING: + return mapRefl->GetString(msg, keyField); + + default: + throw EncodeError{"unsupported map key type " + std::string(keyField->type_name())}; + } + } + +private: + const EncodeOptions& options_; +}; // class Encoder + +} + +void Encode(const google::protobuf::Message& msg, std::string& json, const EncodeOptions& options) { + detail::Encoder{options}.Encode(msg, json); +} + +} // namespace json +} // namespace grpc +} // namespace vereign diff --git a/cpp/src/vereign/grpc/json/encoder.hh b/cpp/src/vereign/grpc/json/encoder.hh new file mode 100644 index 0000000000000000000000000000000000000000..272c4593706a18f4e75d1bb95ab18bb9cf73ed32 --- /dev/null +++ b/cpp/src/vereign/grpc/json/encoder.hh @@ -0,0 +1,80 @@ +#ifndef __VEREIGN_GRPC_JSON_HH +#define __VEREIGN_GRPC_JSON_HH + +#include <google/protobuf/message.h> + +namespace vereign { +namespace grpc { +namespace json { + +/** + * EncodeError is thrown from ::Encode function upon encode failures. + */ +class EncodeError: public std::runtime_error { +public: + EncodeError(const std::string& what) : std::runtime_error{what} {} +}; + +/** + * Encode options for the ::Encode function. + */ +struct EncodeOptions { + /** + * Constructs the default options. + * + * The defaults are: + * ``` + * OmitEmpty: false // empty values will be encoded + * Indent: -1 // indentation is disabled + * ``` + */ + EncodeOptions() + : OmitEmpty{false}, + Indent{-1} + {} + + /** + * Enables pretty printing with the provided indentation. + * + * @param indent Number of spaces to use for the pretty printing. + */ + auto Pretty(int indent) -> EncodeOptions& { + Indent = indent; + return *this; + } + + /** + * Enables omit empty option. + * + * Empty values will not be encoded. + */ + auto WithOmitEmpty() -> EncodeOptions& { + OmitEmpty = true; + return *this; + } + + //! When true the empty values will not be encoded. + bool OmitEmpty; + + //! When greater than 0, ::Encode will encode with the specified number of spaces. + int Indent; +}; + +/** + * Encodes given protobuf message into json string. + * + * This was written, because the protobuf's own implementation encodes 64bit numbers as strings, + * and there is no capability to configure that. + * + * @param msg The protobuf message to encode. + * @param json The result of the encoding. + * @param options Encode options for things like pretty json and omitting empty values. + * @throws EncodeError when the encoding fails. + */ +void Encode(const google::protobuf::Message& msg, std::string& json, const EncodeOptions& options); + +} // namespace json +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_JSON_HH diff --git a/cpp/src/vereign/grpc/server.cc b/cpp/src/vereign/grpc/server.cc new file mode 100644 index 0000000000000000000000000000000000000000..f0fae25a176de979bd9274693687a1d1ef6b272f --- /dev/null +++ b/cpp/src/vereign/grpc/server.cc @@ -0,0 +1,155 @@ +#include <vereign/grpc/server.hh> + +#include <vereign/fs/path.hh> +#include <vereign/fs/operations.hh> +#include <vereign/fs/util.hh> + +#include <vereign/kvstore/crypto_storage.hh> +#include <vereign/kvstore/sqlite_storage.hh> +#include <vereign/kvstore/storage.hh> + +#include <vereign/restapi/client.hh> +#include <vereign/restapi/client_session.hh> +#include <vereign/service/gen/gen.hh> +#include <vereign/grpc/gen/gen.hh> +#include <vereign/grpc/service_registry.hh> + +// manually written api +#include <vereign/service/identity_service.hh> +#include <vereign/grpc/identity_api.hh> + +#include <grpcpp/server.h> +#include <boost/asio/io_context.hpp> +#include <boost/asio/ssl/context.hpp> +#include <boost/asio/executor_work_guard.hpp> +#include <grpcpp/server_builder.h> +#include <grpcpp/server_context.h> +#include <grpcpp/security/server_credentials.h> + +#include <boost/asio/executor_work_guard.hpp> + +namespace vereign::grpc { + +namespace asio = boost::asio; + +class Server::Impl { +public: + Impl( + const std::string& listen_address, + const std::string& vereign_host, + const std::string& vereign_port, + std::string storage_path + ) : selected_port_{0}, + work_guard_{asio::make_work_guard(ioc_)}, + ssl_context_{asio::ssl::context::tlsv12_client}, + client_{std::make_unique<restapi::Client>( + ioc_, ssl_context_, vereign_host, vereign_port + )}, + client_session_{std::make_unique<restapi::ClientSession>(*client_)}, + kvstorage_{nullptr}, + crypto_storage_{nullptr}, + identity_provider_{nullptr}, + server_{nullptr} + { + if (storage_path == "") { + storage_path = fs::path::Join(fs::HomePath(), "vereign"); + fs::CreateDir(storage_path); + } + + storage_path = fs::path::Join(storage_path, "db"); + + kvstorage_ = std::make_unique<kvstore::SqliteStorage>(storage_path); + crypto_storage_ = std::make_unique<kvstore::CryptoStorage>(*kvstorage_); + identity_provider_ = std::make_unique<identity::Provider>(*crypto_storage_); + + // FIXME: Verify the remote server's certificate + // ssl_context.set_verify_mode(ssl::verify_peer); + ::grpc::ServerBuilder builder; + builder.AddListeningPort( + listen_address, + ::grpc::InsecureServerCredentials(), + &selected_port_ + ); + + // register manually written services + services_registry_.RegisterIfNotExist<IdentityAPI<service::IdentityService>>( + *client_session_, + *identity_provider_ + ); + + // register all generated services + grpc::gen::RegisterAll(*client_session_, services_registry_); + + services_registry_.RegisterIntoBuilder(builder); + + server_ = builder.BuildAndStart(); + if (server_ == nullptr || selected_port_ == 0) { + throw BindError{}; + } + + server_thread_ = std::thread([this]() { + server_->Wait(); + }); + + service_thread_ = std::thread([this]() { + ioc_.run(); + }); + } + + void Shutdown() { + client_session_->Close(); + + server_->Shutdown(); + if (server_thread_.joinable()) { + server_thread_.join(); + } + + work_guard_.reset(); + if (service_thread_.joinable()) { + service_thread_.join(); + } + } + + auto SelectedPort() const -> int { + return selected_port_; + } + +private: + int selected_port_; + asio::io_context ioc_; + asio::executor_work_guard<asio::io_context::executor_type> work_guard_; + asio::ssl::context ssl_context_; + std::unique_ptr<vereign::restapi::Client> client_; + std::unique_ptr<vereign::restapi::ClientSession> client_session_; + ServiceRegistry services_registry_; + std::unique_ptr<kvstore::Storage> kvstorage_; + std::unique_ptr<kvstore::CryptoStorage> crypto_storage_; + std::unique_ptr<identity::Provider> identity_provider_; + std::unique_ptr<::grpc::Server> server_; + std::thread server_thread_; + std::thread service_thread_; +}; + +Server::Server( + const std::string& listenAddress, + const std::string& vereignHost, + const std::string& vereignPort, + const std::string& storage_path +) + : impl_{std::make_unique<Impl>(listenAddress, vereignHost, vereignPort, storage_path)} +{ +} + +Server::~Server() { + Shutdown(); +} + +void Server::Shutdown() { + impl_->Shutdown(); +} + +auto Server::SelectedPort() const -> int { + return impl_->SelectedPort(); +} + +} // namespace vereign diff --git a/cpp/src/vereign/grpc/server.hh b/cpp/src/vereign/grpc/server.hh new file mode 100644 index 0000000000000000000000000000000000000000..ef3e8903c76490ded00529f1cfc9af0e5bd09ac5 --- /dev/null +++ b/cpp/src/vereign/grpc/server.hh @@ -0,0 +1,84 @@ +#ifndef __VEREIGN_GRPC_SERVER_API_HH +#define __VEREIGN_GRPC_SERVER_API_HH + +#include <string> +#include <memory> + +namespace vereign::grpc { + +/** + * BindError is thrown when the Server::Server could not start listening. + */ +class BindError: public std::exception { +public: + auto what() const noexcept -> const char* override { + return "gRPC listen failed"; + } +}; + +/** + * Server is a grpc server that provides the Vereign services. + * + * It bootstraps the grpc server, http client, http client session and + * Vereign services. + */ +class Server { +public: + /** + * Constructs and bootstraps the server. + * + * When the gRPC could not start listening a BindError is thrown. + * This can happen for number of reasons like invalid hostname or the listen port is already in use. + * + * @param listenAddress gRPC listen address, for example "localhost:". + * @param vereignHost Vereign restapi host. + * @param vereignPort Vereign restapi port - https, 443... + * @param storage_path Path to directory that will be used for the crypto storage. + * If storage_path is empty string, a default is used. Under linux this default is + * `$HOME/vereign`, and under windows it is `C:\Users\<user>\AppData\Local\vereign`. + * + * @throws BindError when the gRPC server could not start listening. + */ + explicit Server( + const std::string& listenAddress, + const std::string& vereignHost, + const std::string& vereignPort, + const std::string& storage_path = "" + ); + + /** + * Shutdowns the server. + * + * @see Server::Shutdown + */ + ~Server(); + + // Disable copying + Server(const Server&) = delete; + auto operator=(const Server&) -> Server& = delete; + + /** + * Shutdown the server. + * + * It will cancel all pending http requests to the Vereign restapi. + * Blocks for all pending gRPC handlers to finish. + */ + void Shutdown(); + + /** + * Returns the port that the gRPC server listens to. + * + * This is useful if you construct the server with ephemeral port. + * Then this method will return the port that the OS assigned to the gRPC + * socket. + */ + auto SelectedPort() const -> int; + +private: + class Impl; + std::unique_ptr<Impl> impl_; +}; + +} // namespace vereign + +#endif diff --git a/cpp/src/vereign/grpc/service_registry.cc b/cpp/src/vereign/grpc/service_registry.cc new file mode 100644 index 0000000000000000000000000000000000000000..357689f828d972635524f615a4b881bb848b7b2c --- /dev/null +++ b/cpp/src/vereign/grpc/service_registry.cc @@ -0,0 +1,13 @@ +#include <vereign/grpc/service_registry.hh> + +namespace vereign { +namespace grpc { + +void ServiceRegistry::RegisterIntoBuilder(::grpc::ServerBuilder& builder) { + for (auto& pair : services_) { + builder.RegisterService(pair.second.get()); + } +} + +} // namespace grpc +} // namespace vereign diff --git a/cpp/src/vereign/grpc/service_registry.hh b/cpp/src/vereign/grpc/service_registry.hh new file mode 100644 index 0000000000000000000000000000000000000000..94c0fd355fc8a4c1e7bfae838a07b43f41a603ac --- /dev/null +++ b/cpp/src/vereign/grpc/service_registry.hh @@ -0,0 +1,53 @@ +#ifndef __VEREIGN_GRPC_SERVICE_REGISTRY_HH +#define __VEREIGN_GRPC_SERVICE_REGISTRY_HH + +#include <grpcpp/server_builder.h> +#include <vereign/restapi/client_session.hh> +#include <vereign/identity/provider.hh> + +#include <unordered_map> + +namespace vereign::grpc { + +class ServiceRegistry { +public: + void RegisterIntoBuilder(::grpc::ServerBuilder& builder); + + template <class API> + auto RegisterIfNotExist(restapi::ClientSession& client_session) -> bool { + auto it = services_.find(API::Name); + if (it != services_.end()) { + return false; + } + + using Service = typename API::VereignServiceType; + services_[API::Name] = std::make_unique<API>(std::make_unique<Service>(client_session)); + + return true; + } + + template <class API> + auto RegisterIfNotExist( + restapi::ClientSession& client_session, + identity::Provider& identity_provider + ) -> bool { + auto it = services_.find(API::Name); + if (it != services_.end()) { + return false; + } + + using Service = typename API::VereignServiceType; + services_[API::Name] = std::make_unique<API>( + std::make_unique<Service>(client_session, identity_provider) + ); + + return true; + } + +private: + std::unordered_map<std::string, std::unique_ptr<::grpc::Service>> services_; +}; + +} // namespace vereign::grpc + +#endif // __VEREIGN_GRPC_SERVICE_REGISTRY_HH diff --git a/cpp/src/vereign/identity/errors.hh b/cpp/src/vereign/identity/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..7140afec338eeef55150bc988beb260de2b901ac --- /dev/null +++ b/cpp/src/vereign/identity/errors.hh @@ -0,0 +1,18 @@ +#ifndef __VEREIGN_IDENTITY_ERRORS_HH +#define __VEREIGN_IDENTITY_ERRORS_HH + +#include <stdexcept> + +namespace vereign::identity { + +class Error : public std::runtime_error { +public: + Error(const std::string& what) + : std::runtime_error(what) + { + } +}; + +} // namespace vereign::identity + +#endif // __VEREIGN_IDENTITY_ERRORS_HH diff --git a/cpp/src/vereign/identity/provider.cc b/cpp/src/vereign/identity/provider.cc new file mode 100644 index 0000000000000000000000000000000000000000..e69494ad66845c3fdd56216b20559ffffb887942 --- /dev/null +++ b/cpp/src/vereign/identity/provider.cc @@ -0,0 +1,80 @@ +#include <vereign/identity/provider.hh> + +#include <vereign/crypto/digest.hh> +#include <vereign/crypto/bio.hh> +#include <vereign/crypto/rsa.hh> +#include <vereign/encoding/base64.hh> + +namespace { + constexpr int rsaKeySizeBits = 2048; +} + +namespace vereign::identity { + +Provider::Provider(kvstore::CryptoStorage& storage) + : storage_{storage} +{} + +Provider::~Provider() = default; + +auto Provider::RecreateIdentity(const std::string& pin) -> std::string { + std::lock_guard<std::mutex> l{mu_}; + + storage_.Recreate(pin); + + auto rsa = crypto::rsa::GenerateKey(rsaKeySizeBits); + + auto private_key = crypto::rsa::ExportPrivateKeyToPEM(rsa.get()); + storage_.PutBytes("identity_private_key", crypto::bio::View(private_key.get())); + + auto public_key = crypto::rsa::ExportPublicKeyToPEM(rsa.get()); + storage_.PutBytes("identity_public_key", crypto::bio::View(public_key.get())); + + bytes::Buffer encoded; + encoding::base64::Encode(crypto::bio::View(public_key.get()), encoded); + + return std::string{encoded.View().String()}; +} + +auto Provider::LoadIdentity(const std::string& pin) -> std::string { + std::lock_guard<std::mutex> l{mu_}; + + storage_.Open(pin); + + bytes::Buffer public_key; + storage_.GetBytes("identity_public_key", public_key); + + bytes::Buffer encoded; + encoding::base64::Encode(public_key.View(), encoded); + + return std::string(encoded.View().String()); +} + +auto Provider::GetIdentityPublicKeyBase64() -> std::string { + std::lock_guard<std::mutex> l{mu_}; + + bytes::Buffer public_key; + storage_.GetBytes("identity_public_key", public_key); + + bytes::Buffer encoded; + encoding::base64::Encode(public_key.View(), encoded); + + return std::string(encoded.View().String()); +} + +auto Provider::GetDeviceHash() -> std::string { + std::lock_guard<std::mutex> l{mu_}; + + bytes::Buffer public_key; + storage_.GetBytes("identity_public_key", public_key); + + bytes::Buffer hash; + crypto::digest::sha1(public_key.View(), hash); + + bytes::Buffer encoded; + encoding::base64::Encode(hash.View(), encoded); + + return std::string(encoded.View().String()); +} + +} // namespace vereign::identity diff --git a/cpp/src/vereign/identity/provider.hh b/cpp/src/vereign/identity/provider.hh new file mode 100644 index 0000000000000000000000000000000000000000..c526e41fa0e2353ca8dc2258609e9076a6a3f17a --- /dev/null +++ b/cpp/src/vereign/identity/provider.hh @@ -0,0 +1,75 @@ +#ifndef __VEREIGN_IDENTITY_PROVIDER_HH +#define __VEREIGN_IDENTITY_PROVIDER_HH + +#include <vereign/kvstore/crypto_storage.hh> + +#include <mutex> + +namespace vereign::identity { + +/** + * Identity provider that manages the locally stored user identity. + * + * All public methods are thread safe. + */ +class Provider { +public: + /** + * Creates Provider instance. + * + * @param storage The crypto storage used for read/write identity properties. + */ + Provider(kvstore::CryptoStorage& storage); + + /** + * Default constructor. + * + * Does nothing. + */ + ~Provider(); + + // disable copying + Provider(const kvstore::Storage&) = delete; + auto operator=(const kvstore::Storage&) -> Provider& = delete; + + /** + * Recreates the current identity. + * + * @param pin Required only under Linux. The pin code used for derivation of the crypto storage + * master key. + * + * @returns The base64 encoded PEM encoded identity public key. + */ + auto RecreateIdentity(const std::string& pin) -> std::string; + + /** + * Loads the local identity. + * + * @param pin Required only under Linux. The pin code used for derivation of the crypto storage + * master key. + * + * @returns The base64 encoded PEM encoded identity public key. + */ + auto LoadIdentity(const std::string& pin) -> std::string; + + /** + * Retrieve identity public key. + * + * @returns The base64 encoded PEM encoded identity public key. + */ + auto GetIdentityPublicKeyBase64() -> std::string; + + /** + * @returns base64 encoded SHA1 hash of the identity public key. + */ + auto GetDeviceHash() -> std::string; + +private: + std::mutex mu_; + + kvstore::CryptoStorage& storage_; +}; + +} // namespace vereign::identity + +#endif // __VEREIGN_IDENTITY_PROVIDER_HH diff --git a/cpp/src/vereign/kvstore/README.md b/cpp/src/vereign/kvstore/README.md new file mode 100644 index 0000000000000000000000000000000000000000..62a67dc5f3d413eb11c04a66e68c26bb62cca1ce --- /dev/null +++ b/cpp/src/vereign/kvstore/README.md @@ -0,0 +1,71 @@ +# Vereign C++ Client Library Storage Spec {#vcl_storage_spec} + +## Overview + +The Vereign C++ Library Storage is used for securely store locally user's identity and profile +certificates. + +The storage is a key/value storage where the values are encrypted with `master key` using +`AES256-GCM` cypher. + +The current backend of the storage is sqlite3, where the database file is normally located at +`${HOME}/vereign/db`. + +The `master key` key is provided in different way depending on the operating system. + +## windows master key + +Under windows [CNG](https://docs.microsoft.com/en-us/windows/win32/seccng/about-cng) is used for +generating a persistent RSA key pair 2048 bits long. The name of the key in the windows storage by +default is `vereign_key`. This key is used to encrypt a randomly generated AES256 key, and the +encrypted key is saved in the storage under a special key `__master_key`. + +## linux master key + +Under linux the user must provide a password (pin code). +This password along with randomly generated salt is used to derive a master key using +`PKCS5_PBKDF2_HMAC` with `SHA256` where the salt is 16 bytes and the iterations are 2^18. +The salt and the iterations are stored in the storage under special keys `__master_key_salt` and +`master_key_iterations`. Note that these are stored in plain form without encryption. + +## locking and storage tag + +Every time the storage is going to be modified the whole storage must be locked, which with the +sqlite3 backend is achieved with so called exclusive transaction. +This is needed in order to have consistency when more then a single application use the same storage. + +But locking is not enough to achieve consistency. If an application A already had opened the storage, +and application B reset the identity (changing the master key), and after some time A writes to the +storage it will overwrite values written by B leaving the storage in a state where different values +are encrypted with different keys. + +In order to prevent this, when the master key is created for the first time a 16 byte long random +tag is generated and stored encrypted with the master key into a special key `__tag`. +Then whenever a value must be written after the storage is locked additionally the `__tag` is read +and decrypted. If the tag retrieval or decryption fails, and error is triggered and the write is +cancelled. + +## encrypted values encoding + +As already mentioned the values are encrypted with `AES256-GCM`. + +The encrypted values are encoded according to the BNF grammars described below. + +The primitives used are: +* `uint8` - a single byte. +* `uint64` - unsigned 64 bit integer in Little Endian. +* `bytes` - a sequence of bytes. + +### encoding version 1 + +``` +Bytes = Size Data + Size = uint64 + Data = bytes + +EncryptedValue = Version IV Tag EncryptedData + Version = uint8 + IV = bytes + Tag = bytes + EncryptedData = bytes +``` diff --git a/cpp/src/vereign/kvstore/crypto_storage.cc b/cpp/src/vereign/kvstore/crypto_storage.cc new file mode 100644 index 0000000000000000000000000000000000000000..7db16463cd4b0cc9947ff11dc2e9e56c54fb5a6c --- /dev/null +++ b/cpp/src/vereign/kvstore/crypto_storage.cc @@ -0,0 +1,33 @@ +#include <vereign/kvstore/crypto_storage.hh> + +#if defined(_WIN32) +# include <vereign/kvstore/detail/win_crypto_storage.hh> +#else +# include <vereign/kvstore/detail/linux_crypto_storage.hh> +#endif + +namespace vereign::kvstore { + +CryptoStorage::CryptoStorage(Storage& storage, bool disable_key_protection) + : impl_{std::make_unique<detail::CryptoStorageImpl>(storage, disable_key_protection)} +{} + +CryptoStorage::~CryptoStorage() = default; + +void CryptoStorage::Recreate(const std::string& pin) { + impl_->Recreate(pin); +} + +void CryptoStorage::Open(const std::string& pin) { + impl_->Open(pin); +} + +void CryptoStorage::PutBytes(const std::string& key, bytes::View value) { + impl_->PutBytes(key, value); +} + +void CryptoStorage::GetBytes(const std::string& key, bytes::Buffer& value) { + impl_->GetBytes(key, value); +} + +} // namespace vereign::identity diff --git a/cpp/src/vereign/kvstore/crypto_storage.hh b/cpp/src/vereign/kvstore/crypto_storage.hh new file mode 100644 index 0000000000000000000000000000000000000000..f0c03648c9d2afe06e7fde140157c691f66d954a --- /dev/null +++ b/cpp/src/vereign/kvstore/crypto_storage.hh @@ -0,0 +1,112 @@ +#ifndef __VEREIGN_KVSTORE_CRYPTO_STORAGE_HH +#define __VEREIGN_KVSTORE_CRYPTO_STORAGE_HH + +#include <vereign/kvstore/storage.hh> +#include <memory> + +namespace vereign::kvstore { + +namespace detail { + +class CryptoStorageImpl; + +} + +/** + * Crypto storage is used for securely store sensitive user's data. + * + * This includes user's device private/public key, profile certificates etc. + * + * The CryptoStorage has different implementations per operating system. + * Check detail/linux_crypto_storage.cc and detail/win_crypto_storage.cc. + * + * For more information about the crypto storage design check the [storage spec](@ref vcl_storage_spec) + * in the README.md. + * + */ +class CryptoStorage { +public: + /** + * Creates CryptoStorage. + * + * @param storage The underlying key/value storage. + * @param disable_key_protection Used only under Windows. If false when the master RSA key + * is created and loaded, the user will be asked for his consent by showing a dialog window + * with text information specified in the UI policy. + */ + CryptoStorage(Storage& storage, bool disable_key_protection = false); + + /** + * Default destructor - does nothing. + */ + ~CryptoStorage(); + + // disable copying + CryptoStorage(const CryptoStorage&) = delete; + auto operator=(const CryptoStorage&) -> CryptoStorage& = delete; + + /** + * Reinitializes the storage, by effectively initializing a new empty storage. + * + * Although the resulting storage is empty it will include some internal data needed for the + * master key management. + * + * @param pin Used only under Linux. A pin code that will be used for derivation of the master key. + * Under windows ncrypt is used for generating a RSA key which is used for encryption of the + * master key, and thus the pin is not used. + * + * @throws Error on failure. + */ + void Recreate(const std::string& pin); + + /** + * Open the storage. + * + * @param pin Used only under Linux. A pin code that will be used for derivation of the master key. + * Under windows ncrypt is used for generating a RSA key which is used for encryption of the + * master key, and thus the pin is not used. + * + * @throws StorageNotInitializedError when storage is not initialized yet. One must use + * CryptoStorage::Reset to initialize the storage prior calling CryptoStorage::Open. + * + * @throws InvalidPinCodeError (only under Linux) when the pin code is empty or does not match + * the pin code used with CryptoStorage::Reset. + * + * @throws Error when the key derivation under Linux fails. + * + * @throws InvalidIdentityError when the master key could not be decrypted under Windows. + * This possibly means that the RSA key was changed. + */ + void Open(const std::string& pin); + + /** + * Encrypt and store bytes value into the storage. + * + * @param key The key under which the value will be stored. + * @param value The bytes that will be encrypted and stored. + * + * @throws StorageNotInitializedError when the storage is not initialized. + * @throws InvalidIdentityError when another application had reset the storage. + */ + void PutBytes(const std::string& key, bytes::View value); + + /** + * Retrieve and decrypt bytes value from the storage. + * + * @param key The key of the value that will be retrieved. + * @param value Buffer where the value will be returned. + * + * @throws StorageNotInitializedError when the storage is not initialized. + * @throws ValueNotFoundError when there is no value under the provided key. + * @throws encoding::Error when the encrypted value cannot be decoded. + * @throws crypto::OpenSSLError when the value cannot be decrypted. + */ + void GetBytes(const std::string& key, bytes::Buffer& value); + +private: + std::unique_ptr<detail::CryptoStorageImpl> impl_; +}; + +} // namespace vereign::kvstore + +#endif // __VEREIGN_KVSTORE_CRYPTO_STORAGE_HH diff --git a/cpp/src/vereign/kvstore/detail/base_crypto_storage.cc b/cpp/src/vereign/kvstore/detail/base_crypto_storage.cc new file mode 100644 index 0000000000000000000000000000000000000000..83bb4c7b1930b76829af0192b6357b674a42f7ae --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/base_crypto_storage.cc @@ -0,0 +1,98 @@ +#include <vereign/kvstore/detail/base_crypto_storage.hh> + +#include <vereign/kvstore/detail/value_encoder.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/kvstore/lock.hh> + +#include <vereign/crypto/digest.hh> +#include <vereign/crypto/errors.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/crypto/rsa.hh> +#include <vereign/crypto/aes.hh> +#include <vereign/crypto/bio.hh> + +#include <boost/core/ignore_unused.hpp> +#include <chrono> + +namespace { + + // FIXME: should these be injected and provided by the integrator + constexpr int tagSizeBytes = 16; + constexpr int lockRetryCount = 10; + constexpr auto lockRetrySleep = std::chrono::milliseconds{1000}; +} + +namespace vereign::kvstore::detail { + +BaseCryptoStorageImpl::BaseCryptoStorageImpl(kvstore::Storage& storage) + : storage_{storage} +{ +} + +void BaseCryptoStorageImpl::encryptBytes(const std::string& key, bytes::View value) { + if (key_.Size() == 0) { + throw StorageNotInitializedError{"key not initialized"}; + } + + bytes::Buffer iv; + bytes::Buffer tag; + bytes::Buffer encrypted; + + crypto::aes::GCM256Encrypt(value, key_.View(), iv, tag, encrypted); + + bytes::Buffer encoded_value; + EncodeEncryptedValue(encoded_value, iv.View(), tag.View(), encrypted.View()); + + storage_.PutBytes(key, encoded_value.View()); +} + +void BaseCryptoStorageImpl::PutBytes(const std::string& key, bytes::View value) { + kvstore::Lock l{storage_, lockRetryCount, lockRetrySleep}; + + if (!isTagValid()) { + throw InvalidIdentityError{}; + } + + encryptBytes(key, value); +} + +void BaseCryptoStorageImpl::GetBytes(const std::string& key, bytes::Buffer& value) const { + kvstore::Lock l{storage_, lockRetryCount, lockRetrySleep}; + + if (key_.Size() == 0) { + throw StorageNotInitializedError{"key not initialized"}; + } + + bytes::Buffer encoded; + storage_.GetBytes(key, encoded); + + bytes::View iv; + bytes::View tag; + bytes::View encrypted; + DecodeEncryptedValue(encoded.View(), iv, tag, encrypted); + + crypto::aes::GCM256Decrypt(encrypted, key_.View(), iv, tag, value); +} + +void BaseCryptoStorageImpl::initKey(bytes::Buffer&& key) { + key_ = std::move(key); +} + +auto BaseCryptoStorageImpl::isTagValid() const -> bool { + bytes::Buffer tag; + try { + GetBytes("__tag", tag); + + return true; + } catch (const crypto::Error&) { + return false; + } +} + +void BaseCryptoStorageImpl::updateTag() { + auto tag = crypto::Rand(tagSizeBytes); + + encryptBytes("__tag", tag.View()); +} + +} // namespace vereign::kvstore::detail diff --git a/cpp/src/vereign/kvstore/detail/base_crypto_storage.hh b/cpp/src/vereign/kvstore/detail/base_crypto_storage.hh new file mode 100644 index 0000000000000000000000000000000000000000..49278c3f6847d4555dfd3ba58fc52a38a7d05e07 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/base_crypto_storage.hh @@ -0,0 +1,37 @@ +#ifndef __VEREIGN_KVSTORE_DETAIL_BASE_CRYPTO_STORAGE_HH +#define __VEREIGN_KVSTORE_DETAIL_BASE_CRYPTO_STORAGE_HH + +#include <vereign/kvstore/storage.hh> + +namespace vereign::kvstore::detail { + +class BaseCryptoStorageImpl { +public: + BaseCryptoStorageImpl(kvstore::Storage& storage); + + // disable copying + BaseCryptoStorageImpl(const BaseCryptoStorageImpl&) = delete; + auto operator=(const BaseCryptoStorageImpl&) -> BaseCryptoStorageImpl& = delete; + + void PutBytes(const std::string& key, bytes::View value); + void GetBytes(const std::string& key, bytes::Buffer& value) const; + +protected: + void initKey(bytes::Buffer&& key); + auto isTagValid() const -> bool; + void updateTag(); + +private: + void encryptBytes(const std::string& key, bytes::View value); + +protected: + kvstore::Storage& storage_; + +private: + bytes::Buffer key_; +}; + +} // namespace vereign::kvstore::detail + + +#endif // __VEREIGN_KVSTORE_DETAIL_BASE_CRYPTO_STORAGE_HH diff --git a/cpp/src/vereign/kvstore/detail/linux_crypto_storage.cc b/cpp/src/vereign/kvstore/detail/linux_crypto_storage.cc new file mode 100644 index 0000000000000000000000000000000000000000..1d59144d03098d016c2d7d1c29942fb7e95bac07 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/linux_crypto_storage.cc @@ -0,0 +1,118 @@ +#include <vereign/kvstore/detail/linux_crypto_storage.hh> + +#include <vereign/kvstore/detail/value_encoder.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/kvstore/lock.hh> + +#include <vereign/crypto/digest.hh> +#include <vereign/crypto/errors.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/crypto/rsa.hh> +#include <vereign/crypto/aes.hh> +#include <vereign/crypto/bio.hh> + +#include <boost/core/ignore_unused.hpp> +#include <chrono> + +namespace { + // FIXME: should these be injected and provided by the integrator + constexpr int iterations = 1 << 18; + constexpr int saltSizeBytes = 16; + constexpr int aesKeySizeBytes = 32; + + constexpr int lockRetryCount = 10; + constexpr auto lockRetrySleep = std::chrono::milliseconds{1000}; +} + +namespace vereign::kvstore::detail { + +CryptoStorageImpl::CryptoStorageImpl(kvstore::Storage& storage, bool disable_key_protection) + : BaseCryptoStorageImpl{storage} +{ + boost::ignore_unused(disable_key_protection); +} + +void CryptoStorageImpl::Open(const std::string& pin) { + if (pin.empty()) { + throw InvalidPinCodeError{}; + } + + kvstore::Lock l{storage_, lockRetryCount, lockRetrySleep}; + + bytes::Buffer salt; + + int64_t iterations = 0; + try { + iterations = storage_.GetInt64("__master_key_iterations"); + storage_.GetBytes("__master_key_salt", salt); + } catch (const std::exception& e) { + throw StorageNotInitializedError{e.what()}; + } + + if (iterations == 0) { + throw StorageNotInitializedError{"iterations cannot be zero"}; + } + + bytes::Buffer key{aesKeySizeBytes}; + + int result = PKCS5_PBKDF2_HMAC( + pin.data(), + pin.length(), + salt.View().Data(), + salt.View().Size(), + iterations, + EVP_sha256(), + aesKeySizeBytes, + key.end() + ); + if (result == 0) { + throw Error("key derivation failed"); + } + + key.IncSize(aesKeySizeBytes); + + initKey(std::move(key)); + if (!isTagValid()) { + throw InvalidPinCodeError{}; + } +} + +void CryptoStorageImpl::Recreate(const std::string& pin) { + if (pin.empty()) { + throw InvalidPinCodeError{}; + } + + auto salt = crypto::Rand(saltSizeBytes); + + bytes::Buffer key{aesKeySizeBytes}; + + int result = PKCS5_PBKDF2_HMAC( + pin.data(), + pin.length(), + salt.View().Data(), + salt.View().Size(), + iterations, + EVP_sha256(), + aesKeySizeBytes, + key.end() + ); + if (result == 0) { + throw Error("key derivation failed"); + } + + key.IncSize(aesKeySizeBytes); + initKey(std::move(key)); + + { + kvstore::Lock l{storage_, lockRetryCount, lockRetrySleep}; + + storage_.DeleteAll(); + + updateTag(); + + storage_.PutInt64("__master_key_iterations", iterations); + storage_.PutBytes("__master_key_salt", salt.View()); + } +} + +} // namespace vereign::kvstore::detail diff --git a/cpp/src/vereign/kvstore/detail/linux_crypto_storage.hh b/cpp/src/vereign/kvstore/detail/linux_crypto_storage.hh new file mode 100644 index 0000000000000000000000000000000000000000..fcc3e1fc0b67664ede137622c8ac79a7c765a6f6 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/linux_crypto_storage.hh @@ -0,0 +1,24 @@ +#ifndef __VEREIGN_KVSTORE_DETAIL_LINUX_CRYPTO_STORAGE_HH +#define __VEREIGN_KVSTORE_DETAIL_LINUX_CRYPTO_STORAGE_HH + +#include <vereign/kvstore/storage.hh> +#include <vereign/kvstore/detail/base_crypto_storage.hh> + +namespace vereign::kvstore::detail { + +class CryptoStorageImpl : public BaseCryptoStorageImpl { +public: + CryptoStorageImpl(kvstore::Storage& storage, bool disable_key_protection); + + // disable copying + CryptoStorageImpl(const CryptoStorageImpl&) = delete; + auto operator=(const CryptoStorageImpl&) -> CryptoStorageImpl& = delete; + + void Recreate(const std::string& pin); + void Open(const std::string& pin); +}; + +} // namespace vereign::kvstore::detail + + +#endif // __VEREIGN_KVSTORE_DETAIL_LINUX_CRYPTO_STORAGE_HH diff --git a/cpp/src/vereign/kvstore/detail/value_encoder.cc b/cpp/src/vereign/kvstore/detail/value_encoder.cc new file mode 100644 index 0000000000000000000000000000000000000000..6144bebbdffdee83f9797cf063d9729b34d96c35 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/value_encoder.cc @@ -0,0 +1,42 @@ +#include <vereign/kvstore/detail/value_encoder.hh> + +#include <vereign/kvstore/errors.hh> +#include <vereign/encoding/binary.hh> + +namespace vereign::kvstore::detail { + +void EncodeEncryptedValue( + bytes::Buffer& out, + bytes::View iv, + bytes::View tag, + bytes::View encrypted +) { + // 25 = buffers size numbers (3 int64) plus 1 byte for the version + out.Reserve(iv.Size() + tag.Size() + encrypted.Size() + 25); + // encode version + encoding::binary::EncodeUint8(out, 1); + + // encode data + encoding::binary::EncodeBytes(out, iv); + encoding::binary::EncodeBytes(out, tag); + encoding::binary::EncodeBytes(out, encrypted); +} + +void DecodeEncryptedValue( + bytes::View encoded, + bytes::View& iv, + bytes::View& tag, + bytes::View& encrypted +) { + auto version = encoding::binary::DecodeUint8(encoded); + if (version != 1) { + throw Error("decoding encrypted value failed: invalid version"); + } + + auto offset = 1; + offset += encoding::binary::DecodeBytes(encoded.Slice(offset), iv); + offset += encoding::binary::DecodeBytes(encoded.Slice(offset), tag); + offset += encoding::binary::DecodeBytes(encoded.Slice(offset), encrypted); +} + +} // namespace vereign::kvstore::detail diff --git a/cpp/src/vereign/kvstore/detail/value_encoder.hh b/cpp/src/vereign/kvstore/detail/value_encoder.hh new file mode 100644 index 0000000000000000000000000000000000000000..3c9e532853a853febaadf44b39c7941c1f0f28e1 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/value_encoder.hh @@ -0,0 +1,46 @@ +#ifndef __VEREIGN_KVSTORE_DETAIL_VALUE_ENCODER_HH +#define __VEREIGN_KVSTORE_DETAIL_VALUE_ENCODER_HH + +#include <vereign/bytes/view.hh> +#include <vereign/bytes/buffer.hh> + +namespace vereign::kvstore::detail { + +/** + * Encodes value encrypted with AES in GCM mode. + * + * @param out The encoded result. + * @param iv The IV of the encrypted value. + * @param tag The tag of the encrypted value. + * @param encrypted The encrypted bytes. + */ +void EncodeEncryptedValue( + bytes::Buffer& out, + bytes::View iv, + bytes::View tag, + bytes::View encrypted +); + +/** + * Decode value encrypted with AES in GCM mode. + * + * Note that iv, tag and encrypted are decoded in-place, meaning that they point to the same memory + * of the `encoded` input. + * + * @param out The encoded value. + * @param iv The decoded IV of the encrypted value. + * @param tag The decoded tag of the encrypted value. + * @param encrypted The decoded encrypted bytes. + * + * @throws kvstore::Error on failure. + */ +void DecodeEncryptedValue( + bytes::View encoded, + bytes::View& iv, + bytes::View& tag, + bytes::View& encrypted +); + +} // namespace vereign::kvstore::detail + +#endif // __VEREIGN_KVSTORE_DETAIL_VALUE_ENCODER_HH diff --git a/cpp/src/vereign/kvstore/detail/win_crypto_storage.cc b/cpp/src/vereign/kvstore/detail/win_crypto_storage.cc new file mode 100644 index 0000000000000000000000000000000000000000..6d8651f38261282aa1de180d208e1a3506df1b94 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/win_crypto_storage.cc @@ -0,0 +1,108 @@ +#include <vereign/kvstore/detail/win_crypto_storage.hh> + +#include <vereign/kvstore/detail/value_encoder.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/kvstore/lock.hh> + +#include <vereign/crypto/digest.hh> +#include <vereign/crypto/errors.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/crypto/rsa.hh> +#include <vereign/crypto/aes.hh> +#include <vereign/crypto/bio.hh> + +#include <boost/core/ignore_unused.hpp> +#include <vereign/ncrypt/rsa.hh> +#include <vereign/ncrypt/errors.hh> + +#include <chrono> + +namespace { + // FIXME: should these be injected and provided by the integrator + constexpr int keySizeBits = 2048; + constexpr int aesKeySizeBytes = 32; + + constexpr int lockRetryCount = 10; + constexpr auto lockRetrySleep = std::chrono::milliseconds{1000}; + + // FIXME: ask business for these values + constexpr const auto vereignKeyCreationTitle = std::string_view{"Vereign Client"}; + constexpr const auto vereignKeyDescription = std::string_view{ + "Vereign Client will use this key to authenticate with the Vereign Services" + }; + constexpr const auto vereignKeyFriendlyName = std::string_view{"Vereign Client Identity Key"}; +} + +namespace vereign::kvstore::detail { + +CryptoStorageImpl::CryptoStorageImpl(kvstore::Storage& storage, bool disable_key_protection) + : BaseCryptoStorageImpl{storage}, + disable_key_protection_{disable_key_protection} +{} + +void CryptoStorageImpl::Open(const std::string& pin) { + boost::ignore_unused(pin); + kvstore::Lock l{storage_, lockRetryCount, lockRetrySleep}; + + auto provider = ncrypt::rsa::OpenStorageProvider(); + auto rsa_key = ncrypt::rsa::LoadKey(provider.Get(), std::string(VereignKeyName)); + if (!rsa_key) { + throw StorageNotInitializedError{"key not initialized"}; + } + + bytes::Buffer key; + try { + bytes::Buffer encrypted_key; + storage_.GetBytes("__master_key", encrypted_key); + + ncrypt::rsa::PrivateKeyDecrypt(rsa_key.Get(), encrypted_key.View(), key); + } catch(const std::exception&) { + throw InvalidIdentityError{}; + } + + initKey(std::move(key)); + // FIXME: write tests for tampering and regular identity change + if (!isTagValid()) { + throw InvalidIdentityError{}; + } +} + +void CryptoStorageImpl::Recreate(const std::string& pin) { + boost::ignore_unused(pin); + kvstore::Lock l{storage_, lockRetryCount, lockRetrySleep}; + + auto provider = ncrypt::rsa::OpenStorageProvider(); + auto old_key = ncrypt::rsa::LoadKey(provider.Get(), std::string(VereignKeyName)); + if (old_key) { + ncrypt::rsa::DeleteKey(old_key.Get()); + } + + std::optional<ncrypt::rsa::KeyUIPolicy> ui_policy; + if (!disable_key_protection_) { + ui_policy = ncrypt::rsa::KeyUIPolicy{ + vereignKeyCreationTitle, + vereignKeyDescription, + vereignKeyFriendlyName + }; + } + + auto rsa_key = ncrypt::rsa::CreateKey( + provider.Get(), + keySizeBits, + std::string(VereignKeyName), + ui_policy + ); + + storage_.DeleteAll(); + + auto key = crypto::Rand(aesKeySizeBytes); + + bytes::Buffer encrypted_key; + ncrypt::rsa::PublicKeyEncrypt(rsa_key.Get(), key.View(), encrypted_key); + storage_.PutBytes("__master_key", encrypted_key.View()); + + initKey(std::move(key)); + updateTag(); +} + +} diff --git a/cpp/src/vereign/kvstore/detail/win_crypto_storage.hh b/cpp/src/vereign/kvstore/detail/win_crypto_storage.hh new file mode 100644 index 0000000000000000000000000000000000000000..48150ac4ff6068fbe79b3abffd257f508b89e907 --- /dev/null +++ b/cpp/src/vereign/kvstore/detail/win_crypto_storage.hh @@ -0,0 +1,27 @@ +#ifndef __VEREIGN_KVSTORE_DETAIL_WIN_CRYPTO_STORAGE_HH +#define __VEREIGN_KVSTORE_DETAIL_WIN_CRYPTO_STORAGE_HH + +#include <vereign/kvstore/storage.hh> +#include <vereign/kvstore/detail/base_crypto_storage.hh> + +namespace vereign::kvstore::detail { + +class CryptoStorageImpl : public BaseCryptoStorageImpl { +public: + CryptoStorageImpl(kvstore::Storage& storage, bool disable_key_protection); + + // disable copying + CryptoStorageImpl(const CryptoStorageImpl&) = delete; + auto operator=(const CryptoStorageImpl&) -> CryptoStorageImpl& = delete; + + void Recreate(const std::string& pin); + void Open(const std::string& pin); + +private: + bool disable_key_protection_ = false; +}; + +} // namespace vereign::kvstore::detail + + +#endif // __VEREIGN_KVSTORE_DETAIL_WIN_CRYPTO_STORAGE_HH diff --git a/cpp/src/vereign/kvstore/errors.hh b/cpp/src/vereign/kvstore/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..c119c510273cce58d67071e56da2ad16f43983da --- /dev/null +++ b/cpp/src/vereign/kvstore/errors.hh @@ -0,0 +1,58 @@ +#ifndef __VEREIGN_KVSTORE_ERRORS_HH +#define __VEREIGN_KVSTORE_ERRORS_HH + +#include <stdexcept> + +namespace vereign::kvstore { + +class Error : public std::runtime_error { +public: + Error(const std::string& what) + : std::runtime_error(what) + { + } +}; + +class ValueNotFoundError : public Error { +public: + ValueNotFoundError() + : Error{"value not found"} + { + } +}; + +class StorageNotInitializedError : public Error { +public: + StorageNotInitializedError(const std::string& reason) + : Error{"storage is not initialized: " + reason} + { + } +}; + +class LockError : public Error { +public: + LockError() + : Error{"cannot acquire storage lock"} + { + } +}; + +class InvalidPinCodeError : public Error { +public: + InvalidPinCodeError() + : Error{"invalid pin code"} + { + } +}; + +class InvalidIdentityError : public Error { +public: + InvalidIdentityError() + : Error{"invalid identity"} + { + } +}; + +} // namespace vereign::kvstore + +#endif // __VEREIGN_KVSTORE_ERRORS_HH diff --git a/cpp/src/vereign/kvstore/lock.cc b/cpp/src/vereign/kvstore/lock.cc new file mode 100644 index 0000000000000000000000000000000000000000..5a0863e967ea6de6243652a7bbb1752c8a286480 --- /dev/null +++ b/cpp/src/vereign/kvstore/lock.cc @@ -0,0 +1,39 @@ +#include <vereign/kvstore/lock.hh> + +#include <vereign/kvstore/errors.hh> + +#include <thread> +#include <sqlite3.h> + +namespace vereign::kvstore { + +Lock::Lock(Storage& storage) + : storage_{storage} +{ + storage.Lock(); +} + +Lock::Lock(Storage& storage, int retry_count, std::chrono::milliseconds sleep_interval) + : storage_{storage} +{ + for (int i = 0; i < retry_count; i++) { + try { + storage.Lock(); + + return; + } catch (const LockError&) { + std::this_thread::sleep_for(sleep_interval); + + continue; + } + } + + throw LockError{}; +} + +Lock::~Lock() noexcept { + storage_.Unlock(); +} + + +} // namespace vereign::kvstore diff --git a/cpp/src/vereign/kvstore/lock.hh b/cpp/src/vereign/kvstore/lock.hh new file mode 100644 index 0000000000000000000000000000000000000000..1989b1dd0376353417224edfd29c249c1fae4108 --- /dev/null +++ b/cpp/src/vereign/kvstore/lock.hh @@ -0,0 +1,53 @@ +#ifndef __VEREIGN_KVSTORE_LOCK_HH +#define __VEREIGN_KVSTORE_LOCK_HH + +#include <vereign/kvstore/storage.hh> +#include <chrono> + +namespace vereign::kvstore { + +/** + * Lock guard used for lock/unlock Storage within a scope. + * + * When the Lock is constructed it locks the Storage, and when it is destroyed it unlock it. + */ +class Lock { +public: + /** + * Creates a Lock and locks the Storage. + * + * @param storage The storage to lock. + * @throws LockError when the lock is held by another process. + */ + explicit Lock(Storage& storage); + + /** + * Creates a Lock and locks the Storage. + * + * If the lock is not possible it retries `retry_count` and sleeps between retries `sleep_interval`. + * + * @param storage The storage to lock. + * @param retry_count How many times to retry if the lock is held by another process. + * @param sleep_interval How many time to sleep between retries. + * + * @throws LockError If the lock could not be held after `retry_count` retries. + */ + Lock(Storage& storage, int retry_count, std::chrono::milliseconds sleep_interval); + + /** + * Unlocks the storage. + */ + ~Lock() noexcept; + + // copying is disabled. + Lock(const Lock&) = delete; + auto operator=(const Lock&) -> Lock& = delete; + +private: + Storage& storage_; +}; + + +} // namespace vereign::kvstore + +#endif // __VEREIGN_KVSTORE_LOCK_HH diff --git a/cpp/src/vereign/kvstore/sqlite_storage.cc b/cpp/src/vereign/kvstore/sqlite_storage.cc new file mode 100644 index 0000000000000000000000000000000000000000..4789346fef43cde99a8701c620d2d93eea7f0fb7 --- /dev/null +++ b/cpp/src/vereign/kvstore/sqlite_storage.cc @@ -0,0 +1,133 @@ +#include <vereign/kvstore/sqlite_storage.hh> + +#include <vereign/kvstore/errors.hh> +#include <vereign/kvstore/lock.hh> + +#include <vereign/encoding/binary.hh> +#include <boost/optional.hpp> +#include <vereign/core/lock_guard.hh> +#include <vereign/sqlite/errors.hh> +#include <sqlite3.h> + +#include <array> + +namespace { +constexpr int createTableRetryCount = 10; +constexpr auto createTableRetrySleep = std::chrono::milliseconds{1000}; +} + +namespace vereign::kvstore { + +SqliteStorage::SqliteStorage(const std::string& db_path) + : db_{db_path} +{ + kvstore::Lock l{*this, createTableRetryCount, createTableRetrySleep}; + + db_.Execute(R"( +CREATE TABLE IF NOT EXISTS storage ( + key TEXT PRIMARY KEY NOT NULL, + value BLOB +); + )"); +} + +SqliteStorage::~SqliteStorage() { + if (lock_count_ != 0) { + db_.Commit(); + } +} + +void SqliteStorage::Lock() { + if (lock_count_ != 0) { + lock_count_++; + + return; + } + + try { + db_.BeginExplicitTransaction(); + lock_count_++; + } catch (const sqlite::Error& err) { + if (err.code() == SQLITE_BUSY) { + throw LockError{}; + } + + throw; + } +} + +void SqliteStorage::Unlock() { + if (lock_count_ == 0) { + throw Error{"unexpected call Unlock with non existent lock"}; + } + + lock_count_--; + if (lock_count_ == 0) { + db_.Commit(); + } +} + + +void SqliteStorage::DeleteAll() { + kvstore::Lock l{*this}; + + db_.Execute("DELETE FROM storage;"); +} + +void SqliteStorage::PutBytes(const std::string& key, bytes::View value) { + kvstore::Lock l{*this}; + + auto stmt = db_.Prepare("REPLACE INTO storage(key, value) VALUES(?, ?);"); + stmt.BindText(1, key); + stmt.BindBlob(2, value); + stmt.Step(); +} + +void SqliteStorage::GetBytes(const std::string& key, bytes::Buffer& value) { + kvstore::Lock l{*this}; + + auto stmt = db_.Prepare("SELECT value FROM storage WHERE key = ?"); + stmt.BindText(1, key); + auto end = stmt.Step(); + + if (end) { + throw ValueNotFoundError{}; + } + + value.Write(stmt.GetColumnBlob(0)); +} + +void SqliteStorage::PutInt64(const std::string& key, int64_t value) { + kvstore::Lock l{*this}; + + std::array<uint8_t, 8> encoded; + encoding::binary::EncodeUint64(encoded.data(), value); + + auto stmt = db_.Prepare("REPLACE INTO storage(key, value) VALUES(?, ?);"); + stmt.BindText(1, key); + stmt.BindBlob(2, bytes::View(encoded.data(), 8)); + stmt.Step(); +} + +auto SqliteStorage::GetInt64(const std::string& key) -> int64_t { + kvstore::Lock l{*this}; + + auto stmt = db_.Prepare("SELECT value FROM storage WHERE key = ?"); + stmt.BindText(1, key); + auto end = stmt.Step(); + + if (end) { + throw ValueNotFoundError{}; + } + + auto buf = stmt.GetColumnBlob(0); + if (buf.Size() != 8) { + throw Error("cannot decode bytes size"); + } + + int64_t result = encoding::binary::DecodeUint64(buf); + + return result; +} + +} // namespace vereign::kvstore diff --git a/cpp/src/vereign/kvstore/sqlite_storage.hh b/cpp/src/vereign/kvstore/sqlite_storage.hh new file mode 100644 index 0000000000000000000000000000000000000000..6f7d13992cb82dd6c1507e1f66183da9ca4a5012 --- /dev/null +++ b/cpp/src/vereign/kvstore/sqlite_storage.hh @@ -0,0 +1,108 @@ +#ifndef __VEREIGN_KVSTORE_SQLITE_STORAGE_HH +#define __VEREIGN_KVSTORE_SQLITE_STORAGE_HH + +#include <vereign/kvstore/storage.hh> +#include <vereign/sqlite/connection.hh> + +namespace vereign::kvstore { + +/** + * Sqlite implementation of the kvstore::Storage interface. + */ +class SqliteStorage : public Storage { +public: + /** + * Creates SqliteStorage instance. + * + * @param db_path Full path to the sqlite database file. + */ + SqliteStorage(const std::string& db_path); + + /** + * Closes the connection with the database. + */ + ~SqliteStorage() override; + + // disable copying + SqliteStorage(const SqliteStorage&) = delete; + auto operator=(const SqliteStorage&) -> SqliteStorage& = delete; + + /** + * Locks the storage. + * + * The lock must be recursive, meaning that may be called multiple times. + * Storage::Unlock must be called the same number of times the Storage::Lock was called. + * + * Use kvstore::Lock for lock guard and lock with retrials. + * + * @throws LockError when the lock is held by another process. + */ + void Lock() override; + + /** + * Locks the storage. + * + * The lock must be recursive, meaning that may be called multiple times. + * Storage::Unlock must be called the same number of times the Storage::Lock was called. + * + * Use kvstore::Lock for lock guard and lock with retrials. + */ + void Unlock() override; + + /** + * Deletes all the values in the storage. + * + * @throws sqlite::Error on failure. + */ + void DeleteAll() override; + + /** + * Store bytes value into the storage. + * + * @param key The key under which the value will be stored. + * @param value The bytes that will be stored. + * + * @throws sqlite::Error on failure. + */ + void PutBytes(const std::string& key, bytes::View value) override; + + /** + * Retrieve bytes value from the storage. + * + * @param key The key of the value that will be retrieved. + * @param value Buffer where the value will be returned. + * + * @throws ValueNotFoundError when the key does not exist. + * @throws sqlite::Error on failure. + */ + void GetBytes(const std::string& key, bytes::Buffer& value) override; + + /** + * Store int64_t value into the storage. + * + * @param key The key under which the value will be stored. + * @param value The value that will be stored. + * + * @throws sqlite::Error on failure. + */ + void PutInt64(const std::string& key, int64_t value) override; + + /** + * Retrieve int64_t value from the storage. + * + * @param key The key of the value that will be retrieved. + * @param value Buffer where the value will be returned. + * + * @throws ValueNotFoundError when the key does not exist. + * @throws sqlite::Error on failure. + */ + auto GetInt64(const std::string& key) -> int64_t override; + +private: + sqlite::Connection db_; + int lock_count_ = 0; +}; + +} // namespace vereign::kvstore + +#endif // __VEREIGN_KVSTORE_SQLITE_STORAGE_HH diff --git a/cpp/src/vereign/kvstore/storage.hh b/cpp/src/vereign/kvstore/storage.hh new file mode 100644 index 0000000000000000000000000000000000000000..2e8c55344f0c8481e924fb0c4673e263faa05585 --- /dev/null +++ b/cpp/src/vereign/kvstore/storage.hh @@ -0,0 +1,87 @@ +#ifndef __VEREIGN_KVSTORE_STORAGE_HH +#define __VEREIGN_KVSTORE_STORAGE_HH + +#include <vereign/bytes/buffer.hh> + +namespace vereign::kvstore { + +// The vereign RSA master key name. +constexpr const auto VereignKeyName = std::string_view{"vereign_key"}; + +/** + * Key/value storage interface. + */ +class Storage { +public: + /** + * Locks the storage. + * + * The lock must be recursive, meaning that may be called multiple times. + * Storage::Unlock must be called the same number of times the Storage::Lock was called. + * + * Use kvstore::Lock for lock guard and lock with retrials. + * + * @throws LockError when the lock is held by another process. + */ + virtual void Lock() = 0; + + /** + * Locks the storage. + * + * The lock must be recursive, meaning that may be called multiple times. + * Storage::Unlock must be called the same number of times the Storage::Lock was called. + * + * Use kvstore::Lock for lock guard and lock with retrials. + */ + virtual void Unlock() = 0; + + /** + * Deletes all the values in the storage. + */ + virtual void DeleteAll() = 0; + + /** + * Store bytes value into the storage. + * + * @param key The key under which the value will be stored. + * @param value The bytes that will be stored. + */ + virtual void PutBytes(const std::string& key, bytes::View value) = 0; + + /** + * Retrieve bytes value from the storage. + * + * @param key The key of the value that will be retrieved. + * @param value Buffer where the value will be returned. + * + * @throws ValueNotFoundError when the key does not exist. + */ + virtual void GetBytes(const std::string& key, bytes::Buffer& value) = 0; + + /** + * Store int64_t value into the storage. + * + * @param key The key under which the value will be stored. + * @param value The value that will be stored. + */ + virtual void PutInt64(const std::string& key, int64_t value) = 0; + + /** + * Retrieve int64_t value from the storage. + * + * @param key The key of the value that will be retrieved. + * @param value Buffer where the value will be returned. + * + * @throws ValueNotFoundError when the key does not exist. + */ + virtual auto GetInt64(const std::string& key) -> int64_t = 0; + + /** + * Destroy and cleanup. + */ + virtual ~Storage() = default; +}; + +} // namespace vereign::kvstore + +#endif // __VEREIGN_KVSTORE_STORAGE_HH diff --git a/cpp/src/vereign/ncrypt/errors.cc b/cpp/src/vereign/ncrypt/errors.cc new file mode 100644 index 0000000000000000000000000000000000000000..fedb516591b3709bad2cbc244caabc0f4f9a3e79 --- /dev/null +++ b/cpp/src/vereign/ncrypt/errors.cc @@ -0,0 +1,45 @@ +#include <vereign/ncrypt/errors.hh> +#include <vereign/bytes/buffer.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/encoding/hex.hh> +#include <vereign/encoding/binary.hh> + +#include <string> + +namespace vereign::ncrypt { + +auto SecurityStatusToString(SECURITY_STATUS status) -> std::string { + switch (status) { + case NTE_FAIL: + return "NTE_FAIL"; + case NTE_INVALID_PARAMETER: + return "NTE_INVALID_PARAMETER"; + case NTE_BUFFER_TOO_SMALL: + return "NTE_BUFFER_TOO_SMALL"; + case NTE_EXISTS: + return "NTE_EXISTS"; + case NTE_BAD_KEYSET: + return "NTE_BAD_KEYSET"; + case NTE_INVALID_HANDLE: + return "NTE_INVALID_HANDLE"; + case NTE_NOT_SUPPORTED: + return "NTE_NOT_SUPPORTED"; + case NTE_NULL_REFERENCE_POINTER: + return "NTE_NULL_REFERENCE_POINTER"; + default: + bytes::Buffer encoded; + encoding::hex::EncodeReverse(bytes::View(&status, sizeof(status)), encoded); + return std::string(encoded.View().String()); + } +} + +Error::Error(SECURITY_STATUS status, const std::string& msg) + : std::runtime_error{msg + ": " + SecurityStatusToString(status)}, + status_{status} +{} + +auto Error::SecurityStatus() const -> SECURITY_STATUS { + return status_; +} + +} // vereign::ncrypt diff --git a/cpp/src/vereign/ncrypt/errors.hh b/cpp/src/vereign/ncrypt/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..fe6920132b3e3cc1f1596c68af9671c3cfa2764f --- /dev/null +++ b/cpp/src/vereign/ncrypt/errors.hh @@ -0,0 +1,49 @@ +#ifndef __VEREIGN_NCRYPT_ERRORS_HH +#define __VEREIGN_NCRYPT_ERRORS_HH + +#include <windows.h> +#include <ncrypt.h> +#include <stdexcept> + +namespace vereign::ncrypt { + +// windows returns this error when there is unexpected NULL input +constexpr SECURITY_STATUS NTE_NULL_REFERENCE_POINTER = 0x800706f4; + +/** + * Returns a string representation of the SECURITY_STATUS errors. + * + * @param status The SECURITY_STATUS error. + * @returns a string representation of the SECURITY_STATUS error. + */ +auto SecurityStatusToString(SECURITY_STATUS status) -> std::string; + +/** + * The base error type for the namespace vereign::ncrypto. + */ +class Error : public std::runtime_error { +public: + /** + * Creates Error with status and additional message. + * + * Example: + * @code + * auto err = Error{NTE_FAIL, "operation failed"}; + * assert(err.what() == "operation failed: NTE_FAIL"); + * assert(err.SecurityStatus() == NTE_FAIL); + * @endcode + */ + Error(SECURITY_STATUS status, const std::string& msg); + + /** + * Returns the SECURITY_STATUS associated with this error. + */ + auto SecurityStatus() const -> SECURITY_STATUS; + +private: + SECURITY_STATUS status_; +}; + +} // vereign::ncrypt + +#endif // __VEREIGN_NCRYPT_ERRORS_HH diff --git a/cpp/src/vereign/ncrypt/rsa.cc b/cpp/src/vereign/ncrypt/rsa.cc new file mode 100644 index 0000000000000000000000000000000000000000..a9e351d4a3e7f15f513167b05d154716a5d2d188 --- /dev/null +++ b/cpp/src/vereign/ncrypt/rsa.cc @@ -0,0 +1,182 @@ +#include <vereign/ncrypt/rsa.hh> + +#include <vereign/ncrypt/errors.hh> +#include <vereign/core/string.hh> + +namespace vereign::ncrypt::rsa { + +auto OpenStorageProvider() -> UniquePtr { + UniquePtr provider{}; + auto status = NCryptOpenStorageProvider(provider.Ref(), MS_KEY_STORAGE_PROVIDER, 0); + if (status != ERROR_SUCCESS) { + throw Error{status, "open crypto store failed"}; + } + + return provider; +} + +auto LoadKey(NCRYPT_PROV_HANDLE provider, const std::string& key_name) -> UniquePtr { + UniquePtr key{}; + auto wkey_name = string::widen(key_name); + auto status = NCryptOpenKey(provider, key.Ref(), wkey_name.data(), 0, 0); + if (status != ERROR_SUCCESS && status != NTE_BAD_KEYSET) { + throw Error{status, "open key failed"}; + } + + return key; +} + +auto CreateKey( + NCRYPT_PROV_HANDLE provider, + int bits, + const std::string& key_name, + std::optional<KeyUIPolicy> ui_policy +) -> UniquePtr { + UniquePtr key{}; + auto wkey_name = string::widen(key_name); + auto status = NCryptCreatePersistedKey( + provider, + key.Ref(), + BCRYPT_RSA_ALGORITHM, + wkey_name.data(), + 0, + 0 + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "creating rsa key failed"}; + } + + auto key_len = DWORD(bits); + status = NCryptSetProperty( + key.Get(), + NCRYPT_LENGTH_PROPERTY, + (PBYTE)&key_len, + sizeof(key_len), + NCRYPT_PERSIST_FLAG + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "setup rsa key length failed"}; + } + + if (ui_policy) { + auto creation_title = vereign::string::widen(ui_policy->CreationTitle); + auto description = vereign::string::widen(ui_policy->Description); + auto friendly_name = vereign::string::widen(ui_policy->FriendlyName); + + NCRYPT_UI_POLICY ui_policy_prop{}; + ui_policy_prop.dwVersion = 1; + ui_policy_prop.dwFlags = NCRYPT_UI_PROTECT_KEY_FLAG; + ui_policy_prop.pszCreationTitle = creation_title.data(); + ui_policy_prop.pszDescription = description.data(); + ui_policy_prop.pszFriendlyName = friendly_name.data(); + + status = NCryptSetProperty( + key.Get(), + NCRYPT_UI_POLICY_PROPERTY, + (PBYTE)&ui_policy_prop, + sizeof(ui_policy_prop), + NCRYPT_PERSIST_FLAG + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "configure key ui policy failed"}; + } + } + + status = NCryptFinalizeKey(key.Get(), 0); + if (status != ERROR_SUCCESS) { + throw Error{status, "finalizing rsa key failed"}; + } + + return key; +} + +void DeleteKey(NCRYPT_KEY_HANDLE key) { + auto status = NCryptDeleteKey(key, 0); + if (status != ERROR_SUCCESS) { + throw Error{status, "deleting key failed"}; + } +} + +void PublicKeyEncrypt(NCRYPT_KEY_HANDLE key, bytes::View src, bytes::Buffer& encrypted) { + BCRYPT_OAEP_PADDING_INFO pad; + int flags = NCRYPT_PAD_OAEP_FLAG; + pad.pszAlgId = BCRYPT_SHA1_ALGORITHM; + pad.pbLabel = nullptr; + pad.cbLabel = 0; + DWORD size; + + auto status = NCryptEncrypt( + key, + (PBYTE)src.Data(), + (DWORD)src.Size(), + &pad, + nullptr, + 0, + &size, + flags + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "encryption failed"}; + } + + encrypted.Reserve(size); + + status = NCryptEncrypt( + key, + (PBYTE)src.Data(), + (DWORD)src.Size(), + &pad, + (PBYTE)encrypted.end(), + size, + &size, + flags + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "encryption failed"}; + } + + encrypted.IncSize(size); +} + +void PrivateKeyDecrypt(NCRYPT_KEY_HANDLE key, bytes::View src, bytes::Buffer& decrypted) { + BCRYPT_OAEP_PADDING_INFO pad; + int flags = NCRYPT_PAD_OAEP_FLAG; + pad.pszAlgId = BCRYPT_SHA1_ALGORITHM; + pad.pbLabel = nullptr; + pad.cbLabel = 0; + DWORD size; + + auto status = NCryptDecrypt( + key, + (PBYTE)src.Data(), + (DWORD)src.Size(), + &pad, + nullptr, + 0, + &size, + flags + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "decryption failed"}; + } + + decrypted.Reserve(size); + + status = NCryptDecrypt( + key, + (PBYTE)src.Data(), + (DWORD)src.Size(), + &pad, + (PBYTE)decrypted.end(), + size, + &size, + flags + ); + if (status != ERROR_SUCCESS) { + throw Error{status, "decryption failed"}; + } + + decrypted.IncSize(size); +} + +} // vereign::ncrypt::rsa diff --git a/cpp/src/vereign/ncrypt/rsa.hh b/cpp/src/vereign/ncrypt/rsa.hh new file mode 100644 index 0000000000000000000000000000000000000000..06d3f05d2cb1892b6a43956c6e6940f6d6b3d0a0 --- /dev/null +++ b/cpp/src/vereign/ncrypt/rsa.hh @@ -0,0 +1,150 @@ +#ifndef __VEREIGN_NCRYPT_RSA_HH +#define __VEREIGN_NCRYPT_RSA_HH + +#include <vereign/ncrypt/unique_ptr.hh> +#include <vereign/bytes/buffer.hh> + +#include <windows.h> +#include <ncrypt.h> +#include <string> +#include <optional> + +namespace vereign::ncrypt::rsa { + +/** + * KeyUIPolicy is used to specify some UI captions shown to the user in a dialog when a key is + * created or opened for the first time in a process. + */ +struct KeyUIPolicy { + std::string_view CreationTitle; + std::string_view Description; + std::string_view FriendlyName; +}; + +/** + * Opens the default ncrypt storage provider. + * + * @returns the storage provider handle. + * + * @throws ncrypt::Error on failure. + */ +auto OpenStorageProvider() -> UniquePtr; + +/** + * Loads a key from a ncrypt storage provider. + * + * Example: + * @code + * auto provider = ncrypt::rsa::OpenStorageProvider(); + * auto key = ncrypt::rsa::LoadKey(provider.Get(), "test_key"); + * assert(key.Get() != 0); + * @endcode + * + * @param provider The ncrypt storage provider. + * @param key_name The name of the key that will be loaded. + * @returns the loaded key if the key exists, or null ncrypt::UniquePtr if the key does not exists. + * + * @throws ncrypt::Error on failure. + */ +auto LoadKey(NCRYPT_PROV_HANDLE provider, const std::string& key_name) -> UniquePtr; + +/** + * Creates persistent RSA key into a given storage provider. + * + * Example: + * @code + * auto provider = ncrypt::rsa::OpenStorageProvider(); + * // create key without UI policy + * auto key = ncrypt::rsa::CreateKey(provider.Get(), 2048, "test_key", {}); + * assert(key.Get() != 0); + * @endcode + * + * @param provider The ncrypt storage provider. + * @param bits The length of the key in bits. + * @param key_name The new key name. + * @param ui_policy The UI policy. If the UI policy is not provided, the key will not have any + * protection. If the UI policy is provided when the key is created and loaded the user will be + * asked for his consent by showing a dialog window with text information specified in the UI policy. + * + * @returns the created key on success. + * + * @throws ncrypt::Error on failure. + */ +auto CreateKey( + NCRYPT_PROV_HANDLE provider, + int bits, + const std::string& key_name, + std::optional<KeyUIPolicy> ui_policy +) -> UniquePtr; + +/** + * Deletes a key. + * + * Example: + * @code + * auto provider = ncrypt::rsa::OpenStorageProvider(); + * auto key = ncrypt::rsa::LoadKey(provider.Get(), "test_key"); + * if (key) { + * ncryp::rsa::DeleteKey(key.Get()); + * } + * @endcode + * + * @param key The key to delete. + * + * @throws ncrypt::Error on failure. + */ +void DeleteKey(NCRYPT_KEY_HANDLE key); + +/** + * Encrypts given bytes with RSA public key. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * auto provider = ncrypt::rsa::OpenStorageProvider(); + * auto key = ncrypt::rsa::CreateKey(provider.Get(), 2048, "test_key", {}); + * + * bytes::Buffer encrypted; + * ncrypt::rsa::PublicKeyEncrypt(key.Get(), bytes::View(input), encrypted); + * + * bytes::Buffer decrypted; + * ncrypt::rsa::PrivateKeyDecrypt(key.Get(), encrypted.View(), decrypted); + * assert(decrypted.View() == encrypted.View()); + * @endcode + * + * @param key The RSA key. + * @param src The bytes that will be encrypted. + * @param encrypted The result of the encryption. + * + * @throws ncrypt::Error on failure. + */ +void PublicKeyEncrypt(NCRYPT_KEY_HANDLE key, bytes::View src, bytes::Buffer& encrypted); + +/** + * Decrypts given bytes with RSA private key. + * + * Example: + * @code + * const std::string input{"foo bar"}; + * auto provider = ncrypt::rsa::OpenStorageProvider(); + * auto key = ncrypt::rsa::CreateKey(provider.Get(), 2048, "test_key", {}); + * + * bytes::Buffer encrypted; + * ncrypt::rsa::PublicKeyEncrypt(key.Get(), bytes::View(input), encrypted); + * + * bytes::Buffer decrypted; + * ncrypt::rsa::PrivateKeyDecrypt(key.Get(), encrypted.View(), decrypted); + * assert(decrypted.View() == encrypted.View()); + * @endcode + * + * @param key The RSA key. + * @param src The bytes that will be decrypted. + * @param decrypted The result of the decryption. + * + * @throws ncrypt::Error on failure. + */ +void PrivateKeyDecrypt(NCRYPT_KEY_HANDLE key, bytes::View src, bytes::Buffer& decrypted); + +} // vereign::ncrypt::rsa + +#endif // __VEREIGN_NCRYPT_RSA_HH diff --git a/cpp/src/vereign/ncrypt/unique_ptr.cc b/cpp/src/vereign/ncrypt/unique_ptr.cc new file mode 100644 index 0000000000000000000000000000000000000000..a177839f4ec6c2a12780a5e204db45e92965ecd1 --- /dev/null +++ b/cpp/src/vereign/ncrypt/unique_ptr.cc @@ -0,0 +1,82 @@ +#include <vereign/ncrypt/unique_ptr.hh> + +#include <vereign/ncrypt/errors.hh> +#include <utility> +#include <iostream> + +namespace vereign::ncrypt { + +UniquePtr::UniquePtr() noexcept + : ptr_{0} +{ +} + +UniquePtr::UniquePtr(ULONG_PTR handle) noexcept + : ptr_{handle} +{ +} + +UniquePtr::UniquePtr(UniquePtr&& other) noexcept + : ptr_{other.ptr_} +{ + other.ptr_ = 0; +} + +auto UniquePtr::operator=(UniquePtr&& other) noexcept -> UniquePtr& { + std::swap(ptr_, other.ptr_); + + return *this; +} + +UniquePtr::~UniquePtr() noexcept { + if (ptr_ == 0) { + return; + } + + NCryptFreeObject(ptr_); +} + +auto UniquePtr::Get() const noexcept -> ULONG_PTR { + return ptr_; +} + +auto UniquePtr::Ref() noexcept -> ULONG_PTR* { + return &ptr_; +} + +void UniquePtr::Reset() { + if (ptr_ == 0) { + return; + } + + auto status = NCryptFreeObject(ptr_); + if (status == NTE_INVALID_HANDLE) { + throw Error(status, "free object failed"); + } + + ptr_ = 0; +} + +auto UniquePtr::Release() -> ULONG_PTR { + if (ptr_ == 0) { + return 0; + } + + auto result = ptr_; + + auto status = NCryptFreeObject(ptr_); + if (status == NTE_INVALID_HANDLE) { + throw Error(status, "free object failed"); + } + + ptr_ = 0; + + return result; +} + + +UniquePtr::operator bool() const noexcept { + return ptr_ != 0; +} + +} // vereign::ncrypt diff --git a/cpp/src/vereign/ncrypt/unique_ptr.hh b/cpp/src/vereign/ncrypt/unique_ptr.hh new file mode 100644 index 0000000000000000000000000000000000000000..ae4475300c7399f136810082988e4c19d3495666 --- /dev/null +++ b/cpp/src/vereign/ncrypt/unique_ptr.hh @@ -0,0 +1,98 @@ +#ifndef __VEREIGN_NCRYPT_UNIQUE_PTR_HH +#define __VEREIGN_NCRYPT_UNIQUE_PTR_HH + +#include <windows.h> + +namespace vereign::ncrypt { + +/** + * Holds ownership of ncrypt handles like NCRYPT_PROV_HANDLE, NCRYPT_PROV_HANDLE. + * + * The UniquePtr should be used any time a ncrypt API returns a handle in order to ensure exception + * safety and resource cleanup. + * + * The owned handler is typically cleaned up in the UniquePtr::~UniquePtr() by using + * NCryptFreeObject function. + */ +class UniquePtr { +public: + /** + * Constructs a default empty object. + */ + UniquePtr() noexcept; + + /** + * Constructs a UniquePtr that becomes an owner of the passed handle. + * + * @param handle The handle that becomes owned by the crated UniquePtr. + */ + explicit UniquePtr(ULONG_PTR handle) noexcept; + + /** + * Move constructor. + */ + UniquePtr(UniquePtr&& other) noexcept; + + /** + * Move assignment operator. + */ + auto operator=(UniquePtr&& other) noexcept -> UniquePtr&; + + // Disable copying + UniquePtr(const UniquePtr&) = delete; + auto operator=(const UniquePtr&) -> UniquePtr& = delete; + + /** + * Upon destruction the owned handle if any is freed with NCryptFreeObject function. + */ + ~UniquePtr() noexcept; + + /** + * Retrieve the owned handle. + */ + auto Get() const noexcept -> ULONG_PTR; + + /** + * Retrieve a pointer to the owned handle. + * + * Example: + * @code + * UniquePtr key{}; + * NCryptOpenKey(provider, key.Ref(), L"test_key", 0, 0); + * assert(bool(key) == true); + * @endcode + * + * This makes it possible for a ncrypt API to inject its output handle directly into the + * UniquePtr object. + */ + auto Ref() noexcept -> ULONG_PTR*; + + /** + * Free the owned handler. + * + * If the owned handler is not null, it frees the handle by calling NCryptFreeObject, and sets + * the owned handler to null. + */ + void Reset(); + + /** + * Releases the ownership of the owned handler. + * + * @returns the owned handler, before releasing the ownership. + */ + auto Release() -> ULONG_PTR; + + /** + * Checks if *this owns a non-null handler. + * + * @returns true if *this owns a handler, false otherwise. + */ + operator bool() const noexcept; + +private: + ULONG_PTR ptr_; +}; + +} // vereign::ncrypt + +#endif // __VEREIGN_NCRYPT_UNIQUE_PTR_HH diff --git a/cpp/src/vereign/restapi/client.cc b/cpp/src/vereign/restapi/client.cc new file mode 100644 index 0000000000000000000000000000000000000000..e42834bb8dc48363d3b2a67bb38ca520b8c1ef2d --- /dev/null +++ b/cpp/src/vereign/restapi/client.cc @@ -0,0 +1,290 @@ +#include <vereign/restapi/client.hh> + +#include <vereign/restapi/detail/http_reader.hh> + +#include <boost/asio/strand.hpp> +#include <boost/beast/ssl.hpp> +#include <boost/asio/ip/tcp.hpp> +#include <boost/beast/version.hpp> +#include <boost/asio/dispatch.hpp> + +namespace { + constexpr std::string_view httpUserAgent = "Vereign Client Library"; +} + +namespace vereign { +namespace restapi { + +constexpr auto defaultTimeout = std::chrono::seconds(30); + +Client::Client( + boost::asio::io_context& ioc, + boost::asio::ssl::context& ssl_ctx, + const std::string& host, + const std::string& port +) + : user_agent_{httpUserAgent}, + executor_{asio::make_strand(ioc)}, + ssl_ctx_{ssl_ctx}, + resolver_{ioc}, + reader_{nullptr}, + host_{host}, + port_{port}, + expiry_time_{defaultTimeout}, + connecting_{false}, + writing_{false}, + reading_{false}, + closed_{false} +{ +} + +Client::Client( + boost::asio::io_context& ioc, + boost::asio::ssl::context& ssl_ctx, + const std::string& host, + const std::string& port, + std::chrono::nanoseconds expiry_time +) + : user_agent_{httpUserAgent}, + executor_{asio::make_strand(ioc)}, + ssl_ctx_{ssl_ctx}, + resolver_{ioc}, + reader_{nullptr}, + host_{host}, + port_{port}, + expiry_time_{expiry_time}, + connecting_{false}, + writing_{false}, + reading_{false}, + closed_{false} +{ +} + +Client::~Client() noexcept { + Close(); +} + +auto Client::UserAgent() const -> const std::string& { + return user_agent_; +} + +void Client::Close() { + asio::post( + executor_, + [this]() { + if (closed_) { + return; + } + closed_ = true; + + if (stream_) { + beast::get_lowest_layer(*stream_).close(); + stream_.reset(); + } + } + ); +} + +const asio::executor& Client::GetExecutor() const { + return executor_; +} + +void Client::addPostTask(detail::PostTaskBasePtr&& task) { + asio::post( + executor_, + [this, task = std::move(task)]() mutable { + if (closed_) { + task->Complete(detail::PostError{"client closed"}); + return; + } + + task_queue_.push_back(std::move(task)); + if (task_queue_.size() == 1) { + doPost(); + } + }); +} + +void Client::completeTask( + const boost::optional<detail::HttpResponse>& resp, + const detail::PostError& err +) { + if (task_queue_.empty()) { + return; + } + + auto task = std::move(task_queue_.front()); + task_queue_.pop_front(); + if (!err) { + task->DecodeResponse(*resp); + } + + asio::dispatch(executor_, [task = std::move(task), err]() mutable { + task->Complete(err); + }); +} + +void Client::handleError(const detail::PostError& err) { + completeTask(boost::none, err); + resetStream(); + + if (task_queue_.size() > 0) { + asio::post( + executor_, + [this]() { + doPost(); + }); + } +} + +void Client::resolve() { + resolver_.async_resolve( + host_, + port_, + [this](beast::error_code ec, tcp::resolver::results_type results) { + if (ec) { + connecting_ = false; + handleError(ec.message()); + return; + } + + connect(results); + }); +} + +void Client::connect(tcp::resolver::results_type results) { + stream_ = std::make_shared<streamType>(executor_, ssl_ctx_); + reader_ = std::make_shared<detail::HttpReader>(stream_, expiry_time_); + + using endpoint_t = tcp::resolver::results_type::endpoint_type; + beast::get_lowest_layer(*stream_).expires_after(expiry_time_); + auto stream = stream_; + beast::get_lowest_layer(*stream_).async_connect( + results, + [this, stream](beast::error_code ec, endpoint_t) { + if (ec) { + connecting_ = false; + handleError(ec.message()); + return; + } + + handshake(); + } + ); +} + +void Client::handshake() { + auto stream = stream_; + stream_->async_handshake( + asio::ssl::stream_base::client, + [this, stream](beast::error_code ec) { + connecting_ = false; + if (ec) { + handleError(ec.message()); + return; + } + + doPost(); + } + ); +} + +void Client::cancelAllTasks(const detail::PostError& err) { + while (task_queue_.size() > 0) { + auto task = std::move(task_queue_.front()); + task_queue_.pop_front(); + + task->Complete(err); + } +} + +void Client::doPost() { + if (writing_ || connecting_ || task_queue_.size() == 0) { + return; + } + + if (closed_) { + cancelAllTasks(detail::PostError("client closed")); + + return; + } + + if (!stream_ || reader_->IsClosed()) { + connecting_ = true; + resolve(); + return; + } + + auto& task = task_queue_.front(); + req_.emplace(); + req_->method(beast::http::verb::post); + req_->version(11); + req_->target(task->Path()); + req_->set(beast::http::field::host, host_); + req_->set(beast::http::field::user_agent, user_agent_); + req_->set(beast::http::field::content_type, "application/json"); + + auto err = task->EncodeRequest(*req_); + if (err) { + handleError(err); + return; + } + + req_->prepare_payload(); + + auto stream = stream_; + writing_ = true; + beast::get_lowest_layer(*stream_).expires_after(expiry_time_); + beast::http::async_write( + *stream_, + *req_, + [this, stream](beast::error_code ec, std::size_t bytes_transferred) { + writing_ = false; + boost::ignore_unused(bytes_transferred); + + if (ec) { + handleError(ec.message()); + return; + } + + readResponse(); + }); +} + +void Client::resetStream() { + if (!stream_) { + return; + } + + beast::get_lowest_layer(*stream_).close(); + stream_.reset(); +} + +void Client::readResponse() { + if (reading_) { + return; + } + + reader_->AsyncRead( + [this](const detail::HttpResponse& resp, beast::error_code ec) { + reading_ = false; + + if (ec) { + handleError(ec.message()); + return; + } + + completeTask(resp, boost::none); + + if (task_queue_.size() > 0) { + asio::post( + executor_, + [this]() { + doPost(); + }); + } + }); +} + +} +} diff --git a/cpp/src/vereign/restapi/client.hh b/cpp/src/vereign/restapi/client.hh new file mode 100644 index 0000000000000000000000000000000000000000..6fddf6037d58c5ce4f8c562ba7b00b273510ec75 --- /dev/null +++ b/cpp/src/vereign/restapi/client.hh @@ -0,0 +1,371 @@ +#ifndef __VEREIGN_RESTAPI_CLIENT_HH +#define __VEREIGN_RESTAPI_CLIENT_HH + +#include <vereign/restapi/detail/post_task.hh> +#include <vereign/restapi/http_header.hh> + +#include <boost/asio/io_context.hpp> +#include <boost/asio/ssl/context.hpp> +#include <boost/beast/core/tcp_stream.hpp> +#include <boost/beast/ssl.hpp> +#include <boost/beast/http.hpp> +#include <google/protobuf/message.h> + +#include <string> +#include <future> +#include <deque> +#include <chrono> +#include <type_traits> + +namespace vereign { +namespace restapi { + +namespace beast = boost::beast; +namespace asio = boost::asio; + +using tcp = asio::ip::tcp; +using RequestPtr = std::unique_ptr<google::protobuf::Message>; + +namespace detail { + +class HttpReader; + +} // namespace detail + +/** + * Client is a http client for the Vereign Restful API. + * + * Internally the Client uses the [boost::beast][] library. + * + * The client provides both async and blocking APIs for making POST requests. + * + * The blocking methods return futures, and must not be called inside the + * async callbacks.Their purpose is to be used in threads outside of the + * Client's executor. + * + * The POST requests are queued and executed sequentially reusing single + * connection, reconnecting if needed. + * + * The connection is kept alive until there are requests, or when idle until + * specified timeout is expired. + * + * [boost::beast]: \boostlib/libs/beast/doc/html/index.html + * + * ### Thread Safety + * + * All public methods are thread safe. + */ +class Client { +public: + /** + * Constructs Client instance with default timeout (30s). + * + * @param ioc IO context. + * @param ssl_ctx SSL context. + * @param host Vereign restapi host. + * @param port Vereign restapi port. For example "https" or "443". + * @returns Client instance. + */ + Client( + asio::io_context& ioc, + asio::ssl::context& ssl_ctx, + const std::string& host, + const std::string& port + ); + + /** + * Constructs Client instance. + * + * @param ioc IO context. + * @param ssl_ctx SSL context. + * @param host Vereign restapi host. + * @param port Vereign restapi port. For example "https" or "443". + * @param expiry_time Connect, read, write expiration time. + * @returns Client instance. + */ + Client( + asio::io_context& ioc, + asio::ssl::context& ssl_ctx, + const std::string& host, + const std::string& port, + std::chrono::nanoseconds expiry_time + ); + + /** + * Closes the connection. + * + * @see Client::Close + */ + ~Client() noexcept; + + // Disable copying + Client(const Client&) = delete; + Client& operator=(const Client&) = delete; + + /** + * Retrieve client http user agent string. + * + * This is what the client puts in the requests as `User-Agent` header. + * + * @returns the client http user agent string. + */ + auto UserAgent() const -> const std::string&; + + /** + * Close closes the connection. + * + * The connection to the server is closed, and the current pending request + * is cancelled with an error. All other requests in the queue will be also + * cancelled. Subsequent calls to Client::Post or Client::PostAsync methods + * will return with error, i.e. the client won't execute any requests anymore. + */ + void Close(); + + /** + * GetExecutor returns the client's strand executor. + * + * @returns the client's strand executor. + */ + const asio::executor& GetExecutor() const; + + /** + * Post makes a blocking post request. + * + * The passed `req` and `resp` parameters are moved in and returned back once, + * the returned future is resolved. + * + * @param path HTTP path, for example `/api/identity/loginWithPreviouslyAddedDevice`. + * @param req Request object that will be serialized as JSON body. + * It can be a const pointer or std::unique_ptr to protobuf message. + * + * @param resp Response object that will be used to decode the response. + * It can be a pointer or std::unique_ptr to protobuf message. + * + * @returns future that will be resolved with a result containing both + * the request and response objects originally passed to the `Post` call. + */ + template <class RequestPtrType, class ResponsePtrType> + auto Post( + const std::string& path, + RequestPtrType&& req, + ResponsePtrType&& resp + ) { + using RequestPtr = typename std::remove_reference<RequestPtrType>::type; + using ResponsePtr = typename std::remove_reference<ResponsePtrType>::type; + using Result = PostResult<RequestPtr, ResponsePtr>; + std::promise<Result> promise{}; + auto future = promise.get_future(); + + PostAsync( + path, + std::move(req), + std::move(resp), + [promise = std::move(promise)] (Result&& result) mutable { + promise.set_value(std::move(result)); + } + ); + + return future; + } + + /** + * Post makes a blocking post request with additional http headers. + * + * The passed `req` and `resp` parameters are moved in and returned back once, + * the returned future is resolved. + * + * @param path HTTP path, for example `/api/identity/loginWithPreviouslyAddedDevice`. + * @param req Request object that will be serialized as JSON body. + * It can be a const pointer or std::unique_ptr to protobuf message. + * + * @param resp Response object that will be used to decode the response. + * It can be a pointer or std::unique_ptr to protobuf message. + * + * @param headers HTTP headers to include in the request. + * + * @returns future that will be resolved with a result containing both + * the request and response objects originally passed to the `Post` call. + */ + template <class RequestPtrType, class ResponsePtrType> + auto Post( + const std::string& path, + RequestPtrType&& req, + ResponsePtrType&& resp, + std::vector<HttpHeader>&& headers + ) { + using RequestPtr = typename std::remove_reference<RequestPtrType>::type; + using ResponsePtr = typename std::remove_reference<ResponsePtrType>::type; + using Result = PostResult<RequestPtr, ResponsePtr>; + + std::promise<Result> promise{}; + auto future = promise.get_future(); + + PostAsync( + path, + std::move(req), + std::move(resp), + std::move(headers), + [promise = std::move(promise)] (Result&& result) mutable { + promise.set_value(std::move(result)); + } + ); + + return future; + } + + /** + * PostAsync makes non blocking post request. + * + * The passed `req` and `resp` parameters are moved in and returned back once + * the CompletionFunc is called. + * + * @tparam CompletionFunc A completion functor - `void (Result&&)`, where + * the `Result` is restapi::PostResult <RequestPtr, ResponsePtr>, where + * RequestPtr is `std::remove_reference<RequestPtrType>::type` and + * ResponsePtr is `std::remove_reference<RequestPtrType>::type`. + * + * @param path HTTP path, for example `/api/identity/loginWithPreviouslyAddedDevice`. + * @param req Request object that will be serialized as JSON body. + * It can be a const pointer or std::unique_ptr to protobuf message. + * + * @param resp Response object that will be used to decode the response. + * It can be a pointer or std::unique_ptr to protobuf message. + * + * @param func Completion func, that will be called when the post request + * is finished. + */ + template <class RequestPtrType, class ResponsePtrType, class CompletionFunc> + void PostAsync( + const std::string& path, + RequestPtrType&& req, + ResponsePtrType&& resp, + CompletionFunc&& func + ) { + using RequestPtr = typename std::remove_reference<RequestPtrType>::type; + using ResponsePtr = typename std::remove_reference<ResponsePtrType>::type; + + addPostTask( + std::make_unique<detail::PostTask<RequestPtr, ResponsePtr, CompletionFunc>>( + path, + std::move(req), + std::move(resp), + std::move(func) + ) + ); + } + + /** + * PostAsync makes non blocking post request with additional http headers. + * + * The passed `req` and `resp` parameters are moved in and returned back once + * the CompletionFunc is called. + * + * @tparam CompletionFunc A completion functor - `void (Result&&)`, where + * the `Result` is restapi::PostResult <RequestPtr, ResponsePtr>, where + * RequestPtr is `std::remove_reference<RequestPtrType>::type` and + * ResponsePtr is `std::remove_reference<RequestPtrType>::type`. + * + * @param path HTTP path, for example `/api/identity/loginWithPreviouslyAddedDevice`. + * @param req Request object that will be serialized as JSON body. + * It can be a const pointer or std::unique_ptr to protobuf message. + * + * @param resp Response object that will be used to decode the response. + * It can be a pointer or std::unique_ptr to protobuf message. + * + * @param headers HTTP headers to include in the request. + * + * @param func Completion func, that will be called when the post request + * is finished. + */ + template <class RequestPtrType, class ResponsePtrType, class CompletionFunc> + void PostAsync( + const std::string& path, + RequestPtrType&& req, + ResponsePtrType&& resp, + std::vector<HttpHeader>&& headers, + CompletionFunc&& func + ) { + using RequestPtr = typename std::remove_reference<RequestPtrType>::type; + using ResponsePtr = typename std::remove_reference<ResponsePtrType>::type; + + addPostTask( + std::make_unique<detail::PostTask<RequestPtr, ResponsePtr, CompletionFunc>>( + path, + std::move(req), + std::move(resp), + std::move(headers), + std::move(func) + ) + ); + } + +private: + using streamType = beast::ssl_stream<beast::tcp_stream>; + + void handleError(const boost::optional<std::string>& err); + void addPostTask(detail::PostTaskBasePtr&& task); + + void completeTask( + const boost::optional<detail::HttpResponse>& resp, + const boost::optional<std::string>& err + ); + + void doPost(); + void resolve(); + void connect(tcp::resolver::results_type results); + void handshake(); + void readResponse(); + void resetStream(); + void cancelAllTasks(const detail::PostError& err); + +private: + // http user agent. + std::string user_agent_; + + // a strand that calls all completion handlers in single thread. + asio::executor executor_; + + // ssl context used for the https connection. + asio::ssl::context& ssl_ctx_; + + // all post requests are added as tasks in this queue. + std::deque<detail::PostTaskBasePtr> task_queue_; + + // ssl stream used for the http requests. + std::shared_ptr<streamType> stream_; + + // used for resolving the host name into ip address. + tcp::resolver resolver_; + + // request object used for the async_write calls of the post requests. + boost::optional<detail::HttpRequest> req_; + + // reads the requests responses. + std::shared_ptr<detail::HttpReader> reader_; + + // http server host name. + std::string host_; + + // http server port - https, 443 ... + std::string port_; + + // connecting, read, write expiration time. + std::chrono::nanoseconds expiry_time_; + + // indicates that the client is currently in connecting state. + bool connecting_; + + // indicates that the client is currently writing a post request. + bool writing_; + + // indicates that the client is currently waiting for response to be read. + bool reading_; + + // indicates that the client is closed. + bool closed_; +}; + +} // namespace restapi +} // namespace vereign + +#endif // __VEREIGN_RESTAPI_CLIENT_HH diff --git a/cpp/src/vereign/restapi/client_session.hh b/cpp/src/vereign/restapi/client_session.hh new file mode 100644 index 0000000000000000000000000000000000000000..a94fdce3cb020f7ea9c1a11eec61044c4ba7c83d --- /dev/null +++ b/cpp/src/vereign/restapi/client_session.hh @@ -0,0 +1,466 @@ +#ifndef __VEREIGN_RESTAPI_CLIENT_SESSION_HH +#define __VEREIGN_RESTAPI_CLIENT_SESSION_HH + +#include <vereign/restapi/client.hh> +#include <vereign/restapi/http_header.hh> +#include <vereign/client_library/common_types.pb.h> +#include <vereign/client_library/identity_types.pb.h> + +#include <boost/none.hpp> + +namespace vereign::restapi { + +namespace detail { +struct AuthErrorType { + std::string Code; + std::string Status; + std::string Error; + + template <class T> + void AssignTo(T& dest) const { + dest.set_code(Code); + dest.set_status(Status); + dest.set_error(Error); + } +}; + +using AuthError = boost::optional<AuthErrorType>; + +inline auto MakeAuthError( + const client_library::LoginFormPreviousAddedDeviceResponse& resp +) -> AuthError { + if (resp.code() == "200") { + return boost::none; + } + + return AuthErrorType{ + resp.code(), + resp.status(), + resp.error() + }; +} + +inline auto NoAuthError() -> AuthError { + return boost::none; +} + +struct Session { + std::string Token; + std::string UUID; +}; + +} // namespace detail + +/** + * ClientSession is a Client decorator, that maintains authenticated session. + * + * All public methods are thread safe. + */ +class ClientSession { +public: + /** + * Constructs ClientSession instance with default API base path. + * + * The default API base path is `/api`. + * + * @param client Restapi client. + * @returns ClientSession instance. + */ + ClientSession(Client& client) + : client_{client}, + base_path_{"/api"}, + pub_key_{""} + {} + + /** + * Constructs ClientSession instance. + * + * @param client Restapi client. + * @param base_path API base path, for example `/api` + * @returns ClientSession instance. + */ + ClientSession(Client& client, std::string base_path) : client_{client}, + base_path_{std::move(base_path)}, + pub_key_{""} + {} + + // Disable copying. + ClientSession(const ClientSession&) = delete; + auto operator=(const ClientSession&) -> ClientSession& = delete; + + /** + * Closes the connection. + */ + ~ClientSession() noexcept { + Close(); + } + + /** + * Set public key used for authentication. + * + * This effectively resets the current session (if any). + * + * @param key The public key that will be used for authentication. + */ + void SetPubKey(std::string key) { + std::lock_guard<std::mutex> l{mu_}; + + pub_key_ = std::move(key); + session_token_ = ""; + uuid_ = ""; + } + + /** + * Retrieve the current public key used for authentication. + */ + auto GetPubKey() -> std::string { + std::lock_guard<std::mutex> l{mu_}; + + return pub_key_; + } + + /** + * Retrieve the underlying http client. + */ + auto GetClient() -> Client& { + return client_; + } + + /** + * Close closes the connection. + * + * The connection to the server is closed, and the current pending request + * is cancelled with an error. All other requests in the queue will be also + * cancelled. Subsequent calls to Client::Post or Client::PostAsync methods + * will return with error, i.e. the client won't execute any requests anymore. + */ + void Close() { + client_.Close(); + } + + /** + * Post makes a blocking post request. + * + * The passed `req` and `resp` parameters are moved in and returned back once, + * the returned future is resolved. + * + * @param path HTTP path, for example `/passport/listPassports`. + * The path will be added to the ClientSession base path. + * @param req Request object that will be serialized as JSON body. + * It can be a const pointer or std::unique_ptr to protobuf message. + * + * @param resp Response object that will be used to decode the response. + * It can be a pointer or std::unique_ptr to protobuf message. + * + * @returns future that will be resolved with a result containing both + * the request and response objects originally passed to the `Post` call. + */ + template <class RequestPtrType, class ResponsePtrType> + auto Post( + const std::string& path, + RequestPtrType&& req, + ResponsePtrType&& resp + ) { + using RequestPtr = typename std::remove_reference<RequestPtrType>::type; + using ResponsePtr = typename std::remove_reference<ResponsePtrType>::type; + using Result = PostResult<RequestPtr, ResponsePtr>; + + std::promise<Result> promise{}; + auto future = promise.get_future(); + + PostAsync( + path, + std::move(req), + std::move(resp), + [promise = std::move(promise)] (Result&& result) mutable { + promise.set_value(std::move(result)); + } + ); + + return future; + } + + /** + * PostAsync makes non blocking post request. + * + * The passed `req` and `resp` parameters are moved in and returned back once + * the CompletionFunc is called. + * + * @tparam CompletionFunc A completion functor - `void (Result&&)`, where + * the `Result` is restapi::PostResult <RequestPtr, ResponsePtr>, where + * RequestPtr is `std::remove_reference<RequestPtrType>::type` and + * ResponsePtr is `std::remove_reference<RequestPtrType>::type`. + * + * @param path HTTP path, for example `/passport/listPassports`. + * @param req Request object that will be serialized as JSON body. + * It can be a const pointer or std::unique_ptr to protobuf message. + * + * @param resp Response object that will be used to decode the response. + * It can be a pointer or std::unique_ptr to protobuf message. + * + * @param func Completion func, that will be called when the post request + * is finished. + */ + template <class RequestPtrType, class ResponsePtrType, class CompletionFunc> + void PostAsync( + const std::string& path, + RequestPtrType&& req, + ResponsePtrType&& resp, + CompletionFunc&& cf + ) { + using RequestPtr = typename std::remove_reference<RequestPtrType>::type; + using ResponsePtr = typename std::remove_reference<ResponsePtrType>::type; + + using namespace std::placeholders; + withAuthentication( + std::bind( + &ClientSession::authPostAsync<RequestPtr, ResponsePtr, CompletionFunc>, + this, + _1, + base_path_ + path, + std::move(req), + std::move(resp), + std::move(cf) + ) + ); + } + + /** + * Initiate authentication. + * + * This method is blocking. + * + * @param pub_key The public key to authenticate with. + * @param resp Authentication response. + */ + auto Authenticate(const std::string& pub_key, client_library::EmptyResponse* resp) { + std::promise<void> promise; + auto future = promise.get_future(); + + { + std::lock_guard<std::mutex> l{mu_}; + pub_key_ = pub_key; + session_token_ = ""; + uuid_ = ""; + } + + withAuthentication( + [resp, promise = std::move(promise)](const detail::AuthError& err) mutable { + if (err) { + err->AssignTo(*resp); + } else { + resp->set_code("200"); + resp->set_status("OK"); + } + + promise.set_value(); + } + ); + + future.wait(); + } + + /** + * Retrieve the restful-api base path. + * + * @returns the base path used for http requests, for example: `api/`. + */ + auto BasePath() const -> const std::string& { + return base_path_; + } + +private: + auto hasSession() -> bool { + std::lock_guard<std::mutex> l{mu_}; + + return session_token_.size() != 0; + } + + void updateSession(const std::string& token, const std::string& uuid) { + std::lock_guard<std::mutex> l{mu_}; + + session_token_ = token; + uuid_ = uuid; + } + + auto getSession() -> detail::Session { + std::lock_guard<std::mutex> l{mu_}; + + return detail::Session{ + session_token_, + uuid_ + }; + } + + template <class RequestPtr, class ResponsePtr, class CompletionFunc> + void authPostAsync( + const detail::AuthError& err, + const std::string& path, + RequestPtr& req, + ResponsePtr& resp, + CompletionFunc& cf + ) { + if (err) { + err->AssignTo(*resp); + cf(PostResult<RequestPtr, ResponsePtr>{ + std::move(req), + std::move(resp) + }); + return; + } + + using namespace std::placeholders; + auto session = getSession(); + + client_.PostAsync( + path, + std::move(req), + std::move(resp), + std::vector<vereign::restapi::HttpHeader>{ + {"publicKey", GetPubKey()}, + {"token", session.Token}, + {"uuid", session.UUID} + }, + std::bind( + &ClientSession::handlePostResult<RequestPtr, ResponsePtr, CompletionFunc>, + this, + _1, + path, + std::move(cf) + ) + ); + } + + template <class RequestPtr, class ResponsePtr, class CompletionFunc> + void authPostRetryAsync( + const detail::AuthError& err, + const std::string& path, + RequestPtr& req, + ResponsePtr& resp, + CompletionFunc& cf + ) { + if (err) { + err->AssignTo(*resp); + cf(PostResult<RequestPtr, ResponsePtr>{ + std::move(req), + std::move(resp) + }); + return; + } + + using namespace std::placeholders; + auto session = getSession(); + + client_.PostAsync( + path, + std::move(req), + std::move(resp), + std::vector<vereign::restapi::HttpHeader>{ + {"publicKey", GetPubKey()}, + {"token", session.Token}, + {"uuid", session.UUID} + }, + std::move(cf) + ); + } + + template <class RequestPtr, class ResponsePtr, class CompletionFunc> + void handlePostResult( + PostResult<RequestPtr, ResponsePtr>&& result, + const std::string& path, + CompletionFunc& cf + ) { + using namespace std::placeholders; + auto& resp = result.Response; + if (resp->code() == "400" && resp->status() == "Bad session") { + withAuthentication( + std::bind( + &ClientSession::authPostRetryAsync<RequestPtr, ResponsePtr, CompletionFunc>, + this, + _1, + path, + std::move(result.Request), + std::move(result.Response), + std::move(cf) + ) + ); + + return; + } + + cf(std::move(result)); + } + + template <class CompletionFunc> + void withAuthentication(CompletionFunc&& cf) { + asio::post( + client_.GetExecutor(), + [this, cf = std::move(cf)]() mutable { + if (hasSession()) { + cf(detail::NoAuthError()); + return; + } + + using ResultType = PostResult< + std::unique_ptr<client_library::EmptyRequest>, + std::unique_ptr<client_library::LoginFormPreviousAddedDeviceResponse>>; + + client_.PostAsync( + base_path_ + "/identity/loginWithPreviouslyAddedDevice", + std::make_unique<client_library::EmptyRequest>(), + std::make_unique<client_library::LoginFormPreviousAddedDeviceResponse>(), + std::vector<vereign::restapi::HttpHeader>{ + {"publicKey", GetPubKey()} + }, + [this, cf = std::move(cf)] (ResultType&& result) mutable { + if (result.Response->code() != "200") { + cf(detail::AuthErrorType{ + result.Response->code(), + result.Response->status(), + result.Response->error() + }); + return; + } + + if (!result.Response->has_data()) { + cf(detail::AuthErrorType{ + "500", + "Invalid response", + "Invalid response" + }); + return; + } + + updateSession(result.Response->data().session(), result.Response->data().uuid()); + + cf(detail::MakeAuthError(*result.Response)); + } + ); + } + ); + } + +private: + // http client + Client& client_; + + // http base path of the api calls, for example `/api` + std::string base_path_; + + // protects the data that follows + std::mutex mu_; + + // session uuid + std::string uuid_; + + // session token + std::string session_token_; + + + // public key used for creating the authenticated sessions + std::string pub_key_; +}; + +} // namespace vereign + +#endif // __VEREIGN_RESTAPI_CLIENT_SESSION_HH diff --git a/cpp/src/vereign/restapi/detail/http_reader.cc b/cpp/src/vereign/restapi/detail/http_reader.cc new file mode 100644 index 0000000000000000000000000000000000000000..191dab03604bc60586334c1ab37b5ebf7531612b --- /dev/null +++ b/cpp/src/vereign/restapi/detail/http_reader.cc @@ -0,0 +1,73 @@ +#include <vereign/restapi/detail/http_reader.hh> + +namespace vereign { +namespace restapi { +namespace detail { + +HttpReader::HttpReader( + std::shared_ptr<HttpReader::StreamType> stream, + std::chrono::nanoseconds expiry_time +) + : stream_{stream}, + reading_{false}, + closed_{false}, + expiry_time_{expiry_time} +{} + +void HttpReader::doAsyncRead(CompletionBasePtr&& completion) { + if (reading_) { + completion_ = std::move(completion); + return; + } + + if (resp_) { + if (completion) { + completion->Complete(*resp_, resp_error_); + completion.reset(); + doAsyncRead(nullptr); + } + return; + } + + completion_ = std::move(completion); + resp_.emplace(); + resp_error_.clear(); + + beast::get_lowest_layer(*stream_).expires_after(expiry_time_); + auto self = this->shared_from_this(); + auto stream = stream_; + reading_ = true; + beast::http::async_read( + *stream_, + responseBuffer_, + resp_.get(), + [this, self, stream](beast::error_code ec, std::size_t bytes_transferred) { + boost::ignore_unused(bytes_transferred); + reading_ = false; + resp_error_ = ec; + + if (!completion_) { + if (ec) { + closed_ = true; + beast::get_lowest_layer(*stream_).close(); + } + return; + } + + completion_->Complete(*resp_, ec); + completion_.reset(); + resp_.reset(); + + if (!ec) { + doAsyncRead(nullptr); + } + }); +} + +bool HttpReader::IsClosed() const { + return closed_; +} + +} // namespace detail +} // namespace restapi +} // namespace vereign diff --git a/cpp/src/vereign/restapi/detail/http_reader.hh b/cpp/src/vereign/restapi/detail/http_reader.hh new file mode 100644 index 0000000000000000000000000000000000000000..fcde129baf721ab48e2a079945672ffa3140939a --- /dev/null +++ b/cpp/src/vereign/restapi/detail/http_reader.hh @@ -0,0 +1,72 @@ +#ifndef __VEREIGN_RESTAPI_DETAIL_HTTP_READER_HH +#define __VEREIGN_RESTAPI_DETAIL_HTTP_READER_HH + +#include <boost/beast/http.hpp> +#include <boost/beast/ssl.hpp> +#include <boost/beast/ssl/ssl_stream.hpp> +#include <boost/beast/core/tcp_stream.hpp> + +namespace vereign { +namespace restapi { +namespace detail { + +namespace beast = boost::beast; +namespace asio = boost::asio; +using HttpResponse = beast::http::response<beast::http::string_body>; + +class HttpReaderCompletionBase { +public: + virtual void Complete(const HttpResponse& resp, beast::error_code) = 0; + virtual ~HttpReaderCompletionBase() {} +}; + +template <class CompletionFunc> +class HttpReaderCompletion : public HttpReaderCompletionBase { +public: + HttpReaderCompletion(CompletionFunc&& func) + : func_{std::move(func)} + {} + + void Complete(const HttpResponse& resp, beast::error_code ec) override { + func_(resp, ec); + } +private: + CompletionFunc func_; +}; + +class HttpReader : public std::enable_shared_from_this<HttpReader> { +public: + using StreamType = beast::ssl_stream<beast::tcp_stream>; + using CompletionBasePtr = std::unique_ptr<HttpReaderCompletionBase>; + + explicit HttpReader( + std::shared_ptr<StreamType> stream, + std::chrono::nanoseconds expiry_time + ); + + template <class CompletionFunc> + void AsyncRead(CompletionFunc&& func) { + using CompletionType = HttpReaderCompletion<CompletionFunc>; + doAsyncRead(std::make_unique<CompletionType>(std::move(func))); + } + + bool IsClosed() const; +private: + void doAsyncRead(CompletionBasePtr&& completion); + +private: + std::shared_ptr<StreamType> stream_; + boost::optional<detail::HttpResponse> resp_; + beast::error_code resp_error_; + beast::flat_buffer responseBuffer_; + CompletionBasePtr completion_; + bool reading_; + bool closed_; + std::chrono::nanoseconds expiry_time_; +}; + +} // namespace detail +} // namespace restapi +} // namespace vereign + +#endif // __VEREIGN_RESTAPI_DETAIL_HTTP_READER_HH diff --git a/cpp/src/vereign/restapi/detail/post_task.hh b/cpp/src/vereign/restapi/detail/post_task.hh new file mode 100644 index 0000000000000000000000000000000000000000..74f1ea70ae57b105207529f64c86aa27aaaa48bc --- /dev/null +++ b/cpp/src/vereign/restapi/detail/post_task.hh @@ -0,0 +1,174 @@ +#ifndef __VEREIGN_RESTAPI_DETAIL_POST_TASK_HH +#define __VEREIGN_RESTAPI_DETAIL_POST_TASK_HH + +#include <vereign/restapi/http_header.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/common_types.pb.h> +#include <vereign/grpc/json/encoder.hh> + +#include <google/protobuf/message.h> +#include <boost/optional.hpp> +#include <boost/beast/http.hpp> +#include <google/protobuf/util/json_util.h> +#include <fmt/core.h> + +namespace vereign { +namespace restapi { + +namespace beast = boost::beast; + +using RequestPtr = std::unique_ptr<google::protobuf::Message>; + +namespace detail { + +using HttpResponse = beast::http::response<beast::http::string_body>; +using HttpRequest = beast::http::request<beast::http::string_body>; +using PostError = boost::optional<std::string>; + +class PostTaskBase { +public: + virtual void Complete(const PostError& err) = 0; + virtual auto Path() const -> const std::string& = 0; + virtual auto EncodeRequest(HttpRequest& req) -> PostError = 0; + virtual void DecodeResponse(const HttpResponse& resp) = 0; + virtual ~PostTaskBase() = default; +}; + +using PostTaskBasePtr = std::unique_ptr<PostTaskBase>; + +template <class RequestPtr, class ResponsePtr, class CompletionFunc> +class PostTask: public PostTaskBase { +public: + PostTask( + std::string path, + RequestPtr&& req, + ResponsePtr&& resp, + CompletionFunc&& completion_func + ) + : path_{std::move(path)}, + req_{std::move(req)}, + resp_{std::move(resp)}, + func_{std::move(completion_func)} + {} + + PostTask( + std::string path, + RequestPtr&& req, + ResponsePtr&& resp, + std::vector<HttpHeader>&& headers, + CompletionFunc&& completion_func + ) + : path_{std::move(path)}, + req_{std::move(req)}, + resp_{std::move(resp)}, + headers_{std::move(headers)}, + func_{std::move(completion_func)} + {} + + ~PostTask() override = default; + PostTask(PostTask&&) = default; + + PostTask(const PostTask&) = delete; + auto operator=(const PostTask&) -> PostTask& = delete; + + void DecodeResponse(const HttpResponse& httpResp) override { + if (httpResp.result() != beast::http::status::ok) { + decodeErrorResponse(httpResp); + return; + } + + google::protobuf::util::JsonParseOptions options; + options.ignore_unknown_fields = true; + + auto status = google::protobuf::util::JsonStringToMessage( + httpResp.body(), + &*resp_, + options + ); + + if (!status.ok()) { + resp_->set_code("500"); + resp_->set_status("response decoding failed"); + resp_->set_error(status.error_message()); + return; + } + } + + auto EncodeRequest(HttpRequest& req) -> PostError override { + for (auto& header : headers_) { + req.insert(header.Key, header.Value); + } + + try { + grpc::json::Encode(*req_, req.body(), grpc::json::EncodeOptions{}.WithOmitEmpty()); + return boost::none; + } catch (const std::exception& err) { + return fmt::format("request json encode failed: {}", err.what()); + } + } + + void Complete(const PostError& err) override { + if (err) { + resp_->set_error(err.value()); + } + + func_(PostResult<RequestPtr, ResponsePtr>{ + std::move(req_), + std::move(resp_) + }); + } + + auto Path() const -> const std::string& override { + return path_; + } + +private: + + void decodeErrorResponse(const HttpResponse& httpResp) { + google::protobuf::util::JsonParseOptions options; + + client_library::ErrorStringResponse stringResp; + auto status = google::protobuf::util::JsonStringToMessage( + httpResp.body(), + &stringResp, + options + ); + if (status.ok()) { + resp_->set_code(stringResp.code()); + resp_->set_status(stringResp.status()); + resp_->set_error(stringResp.data()); + return; + } + + options.ignore_unknown_fields = true; + client_library::ErrorEmptyResponse emptyResp; + status = google::protobuf::util::JsonStringToMessage( + httpResp.body(), + &emptyResp, + options + ); + if (!status.ok()) { + resp_->set_code("500"); + resp_->set_status("decoding error response failed"); + resp_->set_error(status.error_message()); + return; + } + + resp_->set_code(emptyResp.code()); + resp_->set_status(emptyResp.status()); + resp_->set_error("api call failed"); + } + +private: + std::string path_; + RequestPtr req_; + ResponsePtr resp_; + std::vector<HttpHeader> headers_; + CompletionFunc func_; +}; + +} // namespace detail +} // namespace restapi +} // namespace vereign + +#endif // __VEREIGN_RESTAPI_DETAIL_POST_TASK_HH diff --git a/cpp/src/vereign/restapi/http_header.hh b/cpp/src/vereign/restapi/http_header.hh new file mode 100644 index 0000000000000000000000000000000000000000..58fa7c512d5ae341987de977cf95e0dc0dba930a --- /dev/null +++ b/cpp/src/vereign/restapi/http_header.hh @@ -0,0 +1,17 @@ +#ifndef __VEREIGN_RESTAPI_HTTP_HEADER_HH +#define __VEREIGN_RESTAPI_HTTP_HEADER_HH + +#include <string> + +namespace vereign { +namespace restapi { + +struct HttpHeader { + std::string Key; + std::string Value; +}; + +} // namespace restapi +} // namespace vereign + +#endif diff --git a/cpp/src/vereign/restapi/post_result.hh b/cpp/src/vereign/restapi/post_result.hh new file mode 100644 index 0000000000000000000000000000000000000000..a975f0efdac8f4fb509d45918bc7a5cf3d31cd56 --- /dev/null +++ b/cpp/src/vereign/restapi/post_result.hh @@ -0,0 +1,35 @@ +#ifndef __VEREIGN_RESTAPI_POST_RESULT_HH +#define __VEREIGN_RESTAPI_POST_RESULT_HH + +#include <memory> +#include <iostream> + +namespace vereign { +namespace restapi { + +template <class RequestPtr, class ResponsePtr> +struct PostResult { + RequestPtr Request; + ResponsePtr Response; + + PostResult() + : Request{nullptr}, + Response{nullptr} + {} + + PostResult(RequestPtr req, ResponsePtr resp) + : Request{std::move(req)}, + Response{std::move(resp)} + {} + + PostResult(PostResult&& other) = default; + PostResult& operator=(PostResult&& other) = default; + + PostResult(const PostResult&) = delete; + PostResult& operator=(const PostResult&) = delete; +}; + +} // namespace restapi +} // namespace vereign + +#endif // __VEREIGN_RESTAPI_POST_RESULT_HH diff --git a/cpp/src/vereign/service/gen/action_service.cc b/cpp/src/vereign/service/gen/action_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..53d3d6b19b8715e1b5779d73b5d1e29e1567bf19 --- /dev/null +++ b/cpp/src/vereign/service/gen/action_service.cc @@ -0,0 +1,45 @@ +#include <vereign/service/gen/action_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string getActionsPath = "getActions"; + const std::string getActionsWithoutSessionPath = "getActionsWithoutSession"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string ActionService::ServicePath = "/action/"; + +ActionService::ActionService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<ActionService::GetActionsResult> +ActionService::GetActions( + const client_library::GetActionsForm* req, + client_library::GetActionsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getActionsPath, + req, + resp + ); +} + +std::future<ActionService::GetActionsWithoutSessionResult> +ActionService::GetActionsWithoutSession( + const client_library::GetActionsForm* req, + client_library::GetActionsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getActionsWithoutSessionPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/action_service.hh b/cpp/src/vereign/service/gen/action_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..cc2432361053975f973467ea51c7dc3f95af28e6 --- /dev/null +++ b/cpp/src/vereign/service/gen/action_service.hh @@ -0,0 +1,57 @@ +#ifndef __VEREIGN_SERVICE_GEN_ACTION_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_ACTION_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class ActionService { +public: + static const std::string ServicePath; + + explicit ActionService(restapi::ClientSession& client_session); + + ActionService(const ActionService&) = delete; + ActionService& operator=(const ActionService&) = delete; + + using GetActionsResult = Result< + const client_library::GetActionsForm*, + client_library::GetActionsFormResponse*>; + + std::future<GetActionsResult> GetActions( + const client_library::GetActionsForm* req, + client_library::GetActionsFormResponse* resp + ); + + using GetActionsWithoutSessionResult = Result< + const client_library::GetActionsForm*, + client_library::GetActionsFormResponse*>; + + std::future<GetActionsWithoutSessionResult> GetActionsWithoutSession( + const client_library::GetActionsForm* req, + client_library::GetActionsFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_ACTION_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/activity_service.cc b/cpp/src/vereign/service/gen/activity_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..1fc83d3a2b2100d9ec5476d327fba3847dd2187d --- /dev/null +++ b/cpp/src/vereign/service/gen/activity_service.cc @@ -0,0 +1,32 @@ +#include <vereign/service/gen/activity_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string getActivityPath = "getActivity"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string ActivityService::ServicePath = "/activity/"; + +ActivityService::ActivityService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<ActivityService::GetActivityResult> +ActivityService::GetActivity( + const client_library::GetActivityForm* req, + client_library::GetActivityFormResponse* resp +) { + return client_session_.Post( + ServicePath + getActivityPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/activity_service.hh b/cpp/src/vereign/service/gen/activity_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..620bb3b3404207329bf04cdd0e3a1d7a14459beb --- /dev/null +++ b/cpp/src/vereign/service/gen/activity_service.hh @@ -0,0 +1,48 @@ +#ifndef __VEREIGN_SERVICE_GEN_ACTIVITY_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_ACTIVITY_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class ActivityService { +public: + static const std::string ServicePath; + + explicit ActivityService(restapi::ClientSession& client_session); + + ActivityService(const ActivityService&) = delete; + ActivityService& operator=(const ActivityService&) = delete; + + using GetActivityResult = Result< + const client_library::GetActivityForm*, + client_library::GetActivityFormResponse*>; + + std::future<GetActivityResult> GetActivity( + const client_library::GetActivityForm* req, + client_library::GetActivityFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_ACTIVITY_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/company_service.cc b/cpp/src/vereign/service/gen/company_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..9cd740d1f6a5140329ed768ac4ed7fbf8e3b36f9 --- /dev/null +++ b/cpp/src/vereign/service/gen/company_service.cc @@ -0,0 +1,305 @@ +#include <vereign/service/gen/company_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string addClaimToProfileTemplatePath = "addClaimToProfileTemplate"; + const std::string addEmployeePath = "addEmployee"; + const std::string addProfileTemplatePath = "addProfileTemplate"; + const std::string addRolePath = "addRole"; + const std::string addSharedIdentityPath = "addSharedIdentity"; + const std::string applyProfileTemplatePath = "applyProfileTemplate"; + const std::string applyRoleTemplatesToEmployeePath = "applyRoleTemplatesToEmployee"; + const std::string createCompanyPath = "createCompany"; + const std::string deleteCompanyLogoPath = "deleteCompanyLogo"; + const std::string deleteRolePath = "deleteRole"; + const std::string getCompanyLogoPath = "getCompanyLogo"; + const std::string getInfrastructurePath = "getInfrastructure"; + const std::string listCompaniesPath = "listCompanies"; + const std::string listEmployeesPath = "listEmployees"; + const std::string listEmployeesForSharedIdentityPath = "listEmployeesForSharedIdentity"; + const std::string listProfileTemplatesPath = "listProfileTemplates"; + const std::string listSharedIdentitiesPath = "listSharedIdentities"; + const std::string listSharedIdentitiesForEmployeePath = "listSharedIdentitiesForEmployee"; + const std::string listSubscribedTemplatesToRolePath = "listSubscribedTemplatesToRole"; + const std::string putCompanyLogoPath = "putCompanyLogo"; + const std::string removeClaimFromProfileTemplatePath = "removeClaimFromProfileTemplate"; + const std::string updateEmployeeStatusPath = "updateEmployeeStatus"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string CompanyService::ServicePath = "/company/"; + +CompanyService::CompanyService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<CompanyService::AddClaimToProfileTemplateResult> +CompanyService::AddClaimToProfileTemplate( + const client_library::AddClaimToProfileTemplateForm* req, + client_library::AddClaimToProfileTemplateFormResponse* resp +) { + return client_session_.Post( + ServicePath + addClaimToProfileTemplatePath, + req, + resp + ); +} + +std::future<CompanyService::AddEmployeeResult> +CompanyService::AddEmployee( + const client_library::AddEmployeeForm* req, + client_library::AddEmployeeFormResponse* resp +) { + return client_session_.Post( + ServicePath + addEmployeePath, + req, + resp + ); +} + +std::future<CompanyService::AddProfileTemplateResult> +CompanyService::AddProfileTemplate( + const client_library::AddProfileTemplateForm* req, + client_library::AddProfileTemplateFormResponse* resp +) { + return client_session_.Post( + ServicePath + addProfileTemplatePath, + req, + resp + ); +} + +std::future<CompanyService::AddRoleResult> +CompanyService::AddRole( + const client_library::AddRoleForm* req, + client_library::AddRoleFormResponse* resp +) { + return client_session_.Post( + ServicePath + addRolePath, + req, + resp + ); +} + +std::future<CompanyService::AddSharedIdentityResult> +CompanyService::AddSharedIdentity( + const client_library::AddSharedIdentityForm* req, + client_library::AddSharedIdentityFormResponse* resp +) { + return client_session_.Post( + ServicePath + addSharedIdentityPath, + req, + resp + ); +} + +std::future<CompanyService::ApplyProfileTemplateResult> +CompanyService::ApplyProfileTemplate( + const client_library::ApplyProfileTemplateForm* req, + client_library::ApplyProfileTemplateFormResponse* resp +) { + return client_session_.Post( + ServicePath + applyProfileTemplatePath, + req, + resp + ); +} + +std::future<CompanyService::ApplyRoleTemplatesToEmployeeResult> +CompanyService::ApplyRoleTemplatesToEmployee( + const client_library::ApplyRoleTemplatesToEmployeeForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + applyRoleTemplatesToEmployeePath, + req, + resp + ); +} + +std::future<CompanyService::CreateCompanyResult> +CompanyService::CreateCompany( + const client_library::CreateCompanyForm* req, + client_library::CreateCompanyFormResponse* resp +) { + return client_session_.Post( + ServicePath + createCompanyPath, + req, + resp + ); +} + +std::future<CompanyService::DeleteCompanyLogoResult> +CompanyService::DeleteCompanyLogo( + const client_library::DeleteCompanyLogoForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + deleteCompanyLogoPath, + req, + resp + ); +} + +std::future<CompanyService::DeleteRoleResult> +CompanyService::DeleteRole( + const client_library::DeleteRoleForm* req, + client_library::DeleteRoleFormResponse* resp +) { + return client_session_.Post( + ServicePath + deleteRolePath, + req, + resp + ); +} + +std::future<CompanyService::GetCompanyLogoResult> +CompanyService::GetCompanyLogo( + const client_library::GetCompanyLogoForm* req, + client_library::GetCompanyLogoFormResponse* resp +) { + return client_session_.Post( + ServicePath + getCompanyLogoPath, + req, + resp + ); +} + +std::future<CompanyService::GetInfrastructureResult> +CompanyService::GetInfrastructure( + const client_library::GetInfrastructureForm* req, + client_library::GetInfrastructureFormResponse* resp +) { + return client_session_.Post( + ServicePath + getInfrastructurePath, + req, + resp + ); +} + +std::future<CompanyService::ListCompaniesResult> +CompanyService::ListCompanies( + const client_library::ListCompaniesForm* req, + client_library::ListCompaniesFormResponse* resp +) { + return client_session_.Post( + ServicePath + listCompaniesPath, + req, + resp + ); +} + +std::future<CompanyService::ListEmployeesResult> +CompanyService::ListEmployees( + const client_library::ListEmployeesForm* req, + client_library::ListEmployeesFormResponse* resp +) { + return client_session_.Post( + ServicePath + listEmployeesPath, + req, + resp + ); +} + +std::future<CompanyService::ListEmployeesForSharedIdentityResult> +CompanyService::ListEmployeesForSharedIdentity( + const client_library::ListEmployeesForSharedIdentityForm* req, + client_library::ListEmployeesForSharedIdentityFormResponse* resp +) { + return client_session_.Post( + ServicePath + listEmployeesForSharedIdentityPath, + req, + resp + ); +} + +std::future<CompanyService::ListProfileTemplatesResult> +CompanyService::ListProfileTemplates( + const client_library::ListProfileTemplatesForm* req, + client_library::ListProfileTemplatesFormResponse* resp +) { + return client_session_.Post( + ServicePath + listProfileTemplatesPath, + req, + resp + ); +} + +std::future<CompanyService::ListSharedIdentitiesResult> +CompanyService::ListSharedIdentities( + const client_library::ListSharedIdentitiesForm* req, + client_library::ListSharedIdentitiesFormResponse* resp +) { + return client_session_.Post( + ServicePath + listSharedIdentitiesPath, + req, + resp + ); +} + +std::future<CompanyService::ListSharedIdentitiesForEmployeeResult> +CompanyService::ListSharedIdentitiesForEmployee( + const client_library::ListSharedIdentitiesForEmployeeForm* req, + client_library::ListSharedIdentitiesForEmployeeFormResponse* resp +) { + return client_session_.Post( + ServicePath + listSharedIdentitiesForEmployeePath, + req, + resp + ); +} + +std::future<CompanyService::ListSubscribedTemplatesToRoleResult> +CompanyService::ListSubscribedTemplatesToRole( + const client_library::ListSubscribedTemplatesToRoleForm* req, + client_library::ListSubscribedTemplatesToRoleFormResponse* resp +) { + return client_session_.Post( + ServicePath + listSubscribedTemplatesToRolePath, + req, + resp + ); +} + +std::future<CompanyService::PutCompanyLogoResult> +CompanyService::PutCompanyLogo( + const client_library::PutCompanyLogoForm* req, + client_library::PutCompanyLogoFormResponse* resp +) { + return client_session_.Post( + ServicePath + putCompanyLogoPath, + req, + resp + ); +} + +std::future<CompanyService::RemoveClaimFromProfileTemplateResult> +CompanyService::RemoveClaimFromProfileTemplate( + const client_library::RemoveClaimFromProfileTemplateForm* req, + client_library::RemoveClaimFromProfileTemplateFormResponse* resp +) { + return client_session_.Post( + ServicePath + removeClaimFromProfileTemplatePath, + req, + resp + ); +} + +std::future<CompanyService::UpdateEmployeeStatusResult> +CompanyService::UpdateEmployeeStatus( + const client_library::UpdateEmployeeStatusForm* req, + client_library::UpdateEmployeeStatusFormResponse* resp +) { + return client_session_.Post( + ServicePath + updateEmployeeStatusPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/company_service.hh b/cpp/src/vereign/service/gen/company_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..ee59d4fe9deecc893a6dfe7ade367ed2f2f8e223 --- /dev/null +++ b/cpp/src/vereign/service/gen/company_service.hh @@ -0,0 +1,237 @@ +#ifndef __VEREIGN_SERVICE_GEN_COMPANY_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_COMPANY_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class CompanyService { +public: + static const std::string ServicePath; + + explicit CompanyService(restapi::ClientSession& client_session); + + CompanyService(const CompanyService&) = delete; + CompanyService& operator=(const CompanyService&) = delete; + + using AddClaimToProfileTemplateResult = Result< + const client_library::AddClaimToProfileTemplateForm*, + client_library::AddClaimToProfileTemplateFormResponse*>; + + std::future<AddClaimToProfileTemplateResult> AddClaimToProfileTemplate( + const client_library::AddClaimToProfileTemplateForm* req, + client_library::AddClaimToProfileTemplateFormResponse* resp + ); + + using AddEmployeeResult = Result< + const client_library::AddEmployeeForm*, + client_library::AddEmployeeFormResponse*>; + + std::future<AddEmployeeResult> AddEmployee( + const client_library::AddEmployeeForm* req, + client_library::AddEmployeeFormResponse* resp + ); + + using AddProfileTemplateResult = Result< + const client_library::AddProfileTemplateForm*, + client_library::AddProfileTemplateFormResponse*>; + + std::future<AddProfileTemplateResult> AddProfileTemplate( + const client_library::AddProfileTemplateForm* req, + client_library::AddProfileTemplateFormResponse* resp + ); + + using AddRoleResult = Result< + const client_library::AddRoleForm*, + client_library::AddRoleFormResponse*>; + + std::future<AddRoleResult> AddRole( + const client_library::AddRoleForm* req, + client_library::AddRoleFormResponse* resp + ); + + using AddSharedIdentityResult = Result< + const client_library::AddSharedIdentityForm*, + client_library::AddSharedIdentityFormResponse*>; + + std::future<AddSharedIdentityResult> AddSharedIdentity( + const client_library::AddSharedIdentityForm* req, + client_library::AddSharedIdentityFormResponse* resp + ); + + using ApplyProfileTemplateResult = Result< + const client_library::ApplyProfileTemplateForm*, + client_library::ApplyProfileTemplateFormResponse*>; + + std::future<ApplyProfileTemplateResult> ApplyProfileTemplate( + const client_library::ApplyProfileTemplateForm* req, + client_library::ApplyProfileTemplateFormResponse* resp + ); + + using ApplyRoleTemplatesToEmployeeResult = Result< + const client_library::ApplyRoleTemplatesToEmployeeForm*, + client_library::EmptyResponse*>; + + std::future<ApplyRoleTemplatesToEmployeeResult> ApplyRoleTemplatesToEmployee( + const client_library::ApplyRoleTemplatesToEmployeeForm* req, + client_library::EmptyResponse* resp + ); + + using CreateCompanyResult = Result< + const client_library::CreateCompanyForm*, + client_library::CreateCompanyFormResponse*>; + + std::future<CreateCompanyResult> CreateCompany( + const client_library::CreateCompanyForm* req, + client_library::CreateCompanyFormResponse* resp + ); + + using DeleteCompanyLogoResult = Result< + const client_library::DeleteCompanyLogoForm*, + client_library::EmptyResponse*>; + + std::future<DeleteCompanyLogoResult> DeleteCompanyLogo( + const client_library::DeleteCompanyLogoForm* req, + client_library::EmptyResponse* resp + ); + + using DeleteRoleResult = Result< + const client_library::DeleteRoleForm*, + client_library::DeleteRoleFormResponse*>; + + std::future<DeleteRoleResult> DeleteRole( + const client_library::DeleteRoleForm* req, + client_library::DeleteRoleFormResponse* resp + ); + + using GetCompanyLogoResult = Result< + const client_library::GetCompanyLogoForm*, + client_library::GetCompanyLogoFormResponse*>; + + std::future<GetCompanyLogoResult> GetCompanyLogo( + const client_library::GetCompanyLogoForm* req, + client_library::GetCompanyLogoFormResponse* resp + ); + + using GetInfrastructureResult = Result< + const client_library::GetInfrastructureForm*, + client_library::GetInfrastructureFormResponse*>; + + std::future<GetInfrastructureResult> GetInfrastructure( + const client_library::GetInfrastructureForm* req, + client_library::GetInfrastructureFormResponse* resp + ); + + using ListCompaniesResult = Result< + const client_library::ListCompaniesForm*, + client_library::ListCompaniesFormResponse*>; + + std::future<ListCompaniesResult> ListCompanies( + const client_library::ListCompaniesForm* req, + client_library::ListCompaniesFormResponse* resp + ); + + using ListEmployeesResult = Result< + const client_library::ListEmployeesForm*, + client_library::ListEmployeesFormResponse*>; + + std::future<ListEmployeesResult> ListEmployees( + const client_library::ListEmployeesForm* req, + client_library::ListEmployeesFormResponse* resp + ); + + using ListEmployeesForSharedIdentityResult = Result< + const client_library::ListEmployeesForSharedIdentityForm*, + client_library::ListEmployeesForSharedIdentityFormResponse*>; + + std::future<ListEmployeesForSharedIdentityResult> ListEmployeesForSharedIdentity( + const client_library::ListEmployeesForSharedIdentityForm* req, + client_library::ListEmployeesForSharedIdentityFormResponse* resp + ); + + using ListProfileTemplatesResult = Result< + const client_library::ListProfileTemplatesForm*, + client_library::ListProfileTemplatesFormResponse*>; + + std::future<ListProfileTemplatesResult> ListProfileTemplates( + const client_library::ListProfileTemplatesForm* req, + client_library::ListProfileTemplatesFormResponse* resp + ); + + using ListSharedIdentitiesResult = Result< + const client_library::ListSharedIdentitiesForm*, + client_library::ListSharedIdentitiesFormResponse*>; + + std::future<ListSharedIdentitiesResult> ListSharedIdentities( + const client_library::ListSharedIdentitiesForm* req, + client_library::ListSharedIdentitiesFormResponse* resp + ); + + using ListSharedIdentitiesForEmployeeResult = Result< + const client_library::ListSharedIdentitiesForEmployeeForm*, + client_library::ListSharedIdentitiesForEmployeeFormResponse*>; + + std::future<ListSharedIdentitiesForEmployeeResult> ListSharedIdentitiesForEmployee( + const client_library::ListSharedIdentitiesForEmployeeForm* req, + client_library::ListSharedIdentitiesForEmployeeFormResponse* resp + ); + + using ListSubscribedTemplatesToRoleResult = Result< + const client_library::ListSubscribedTemplatesToRoleForm*, + client_library::ListSubscribedTemplatesToRoleFormResponse*>; + + std::future<ListSubscribedTemplatesToRoleResult> ListSubscribedTemplatesToRole( + const client_library::ListSubscribedTemplatesToRoleForm* req, + client_library::ListSubscribedTemplatesToRoleFormResponse* resp + ); + + using PutCompanyLogoResult = Result< + const client_library::PutCompanyLogoForm*, + client_library::PutCompanyLogoFormResponse*>; + + std::future<PutCompanyLogoResult> PutCompanyLogo( + const client_library::PutCompanyLogoForm* req, + client_library::PutCompanyLogoFormResponse* resp + ); + + using RemoveClaimFromProfileTemplateResult = Result< + const client_library::RemoveClaimFromProfileTemplateForm*, + client_library::RemoveClaimFromProfileTemplateFormResponse*>; + + std::future<RemoveClaimFromProfileTemplateResult> RemoveClaimFromProfileTemplate( + const client_library::RemoveClaimFromProfileTemplateForm* req, + client_library::RemoveClaimFromProfileTemplateFormResponse* resp + ); + + using UpdateEmployeeStatusResult = Result< + const client_library::UpdateEmployeeStatusForm*, + client_library::UpdateEmployeeStatusFormResponse*>; + + std::future<UpdateEmployeeStatusResult> UpdateEmployeeStatus( + const client_library::UpdateEmployeeStatusForm* req, + client_library::UpdateEmployeeStatusFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_COMPANY_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/contacts_service.cc b/cpp/src/vereign/service/gen/contacts_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..e23a6623b958d6ba28f47cee706ba1595d910726 --- /dev/null +++ b/cpp/src/vereign/service/gen/contacts_service.cc @@ -0,0 +1,71 @@ +#include <vereign/service/gen/contacts_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string changeStatusPath = "changeStatus"; + const std::string getUserContactsPath = "getUserContacts"; + const std::string listContactsPath = "listContacts"; + const std::string searchContactsPath = "searchContacts"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string ContactsService::ServicePath = "/contacts/"; + +ContactsService::ContactsService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<ContactsService::ChangeStatusResult> +ContactsService::ChangeStatus( + const client_library::ChangeStatusForm* req, + client_library::ChangeStatusFormResponse* resp +) { + return client_session_.Post( + ServicePath + changeStatusPath, + req, + resp + ); +} + +std::future<ContactsService::GetUserContactsResult> +ContactsService::GetUserContacts( + const client_library::GetUserContactsForm* req, + client_library::GetUserContactsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getUserContactsPath, + req, + resp + ); +} + +std::future<ContactsService::ListContactsResult> +ContactsService::ListContacts( + const client_library::ListContactsForm* req, + client_library::ListContactsFormResponse* resp +) { + return client_session_.Post( + ServicePath + listContactsPath, + req, + resp + ); +} + +std::future<ContactsService::SearchContactsResult> +ContactsService::SearchContacts( + const client_library::SearchContactsForm* req, + client_library::SearchContactsFormResponse* resp +) { + return client_session_.Post( + ServicePath + searchContactsPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/contacts_service.hh b/cpp/src/vereign/service/gen/contacts_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..3b11f3b5e859fd82af6d220d2d1a30018c54bec0 --- /dev/null +++ b/cpp/src/vereign/service/gen/contacts_service.hh @@ -0,0 +1,75 @@ +#ifndef __VEREIGN_SERVICE_GEN_CONTACTS_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_CONTACTS_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class ContactsService { +public: + static const std::string ServicePath; + + explicit ContactsService(restapi::ClientSession& client_session); + + ContactsService(const ContactsService&) = delete; + ContactsService& operator=(const ContactsService&) = delete; + + using ChangeStatusResult = Result< + const client_library::ChangeStatusForm*, + client_library::ChangeStatusFormResponse*>; + + std::future<ChangeStatusResult> ChangeStatus( + const client_library::ChangeStatusForm* req, + client_library::ChangeStatusFormResponse* resp + ); + + using GetUserContactsResult = Result< + const client_library::GetUserContactsForm*, + client_library::GetUserContactsFormResponse*>; + + std::future<GetUserContactsResult> GetUserContacts( + const client_library::GetUserContactsForm* req, + client_library::GetUserContactsFormResponse* resp + ); + + using ListContactsResult = Result< + const client_library::ListContactsForm*, + client_library::ListContactsFormResponse*>; + + std::future<ListContactsResult> ListContacts( + const client_library::ListContactsForm* req, + client_library::ListContactsFormResponse* resp + ); + + using SearchContactsResult = Result< + const client_library::SearchContactsForm*, + client_library::SearchContactsFormResponse*>; + + std::future<SearchContactsResult> SearchContacts( + const client_library::SearchContactsForm* req, + client_library::SearchContactsFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_CONTACTS_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/conversation_service.cc b/cpp/src/vereign/service/gen/conversation_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..1074092a371a4f8c5a3bb3626e5a3a52b98f6ebc --- /dev/null +++ b/cpp/src/vereign/service/gen/conversation_service.cc @@ -0,0 +1,71 @@ +#include <vereign/service/gen/conversation_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string addEmailPath = "addEmail"; + const std::string getConversationsPath = "getConversations"; + const std::string getConversationsAndMessageIDByMessageUUIDPath = "getConversationsAndMessageIDByMessageUUID"; + const std::string getEmailsPath = "getEmails"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string ConversationService::ServicePath = "/conversation/"; + +ConversationService::ConversationService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<ConversationService::AddEmailResult> +ConversationService::AddEmail( + const client_library::AddEmailForm* req, + client_library::AddEmailFormResponse* resp +) { + return client_session_.Post( + ServicePath + addEmailPath, + req, + resp + ); +} + +std::future<ConversationService::GetConversationsResult> +ConversationService::GetConversations( + const client_library::GetConversationsForm* req, + client_library::GetConversationsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getConversationsPath, + req, + resp + ); +} + +std::future<ConversationService::GetConversationsAndMessageIDByMessageUUIDResult> +ConversationService::GetConversationsAndMessageIDByMessageUUID( + const client_library::GetConversationsAndMessageIDByMessageUUIDForm* req, + client_library::GetConversationsAndMessageIDByMessageUUIDResponse* resp +) { + return client_session_.Post( + ServicePath + getConversationsAndMessageIDByMessageUUIDPath, + req, + resp + ); +} + +std::future<ConversationService::GetEmailsResult> +ConversationService::GetEmails( + const client_library::GetEmailsForm* req, + client_library::GetEmailsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getEmailsPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/conversation_service.hh b/cpp/src/vereign/service/gen/conversation_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..01031de41cbc7cff453b3883bed71d6bc5b6c4e5 --- /dev/null +++ b/cpp/src/vereign/service/gen/conversation_service.hh @@ -0,0 +1,75 @@ +#ifndef __VEREIGN_SERVICE_GEN_CONVERSATION_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_CONVERSATION_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class ConversationService { +public: + static const std::string ServicePath; + + explicit ConversationService(restapi::ClientSession& client_session); + + ConversationService(const ConversationService&) = delete; + ConversationService& operator=(const ConversationService&) = delete; + + using AddEmailResult = Result< + const client_library::AddEmailForm*, + client_library::AddEmailFormResponse*>; + + std::future<AddEmailResult> AddEmail( + const client_library::AddEmailForm* req, + client_library::AddEmailFormResponse* resp + ); + + using GetConversationsResult = Result< + const client_library::GetConversationsForm*, + client_library::GetConversationsFormResponse*>; + + std::future<GetConversationsResult> GetConversations( + const client_library::GetConversationsForm* req, + client_library::GetConversationsFormResponse* resp + ); + + using GetConversationsAndMessageIDByMessageUUIDResult = Result< + const client_library::GetConversationsAndMessageIDByMessageUUIDForm*, + client_library::GetConversationsAndMessageIDByMessageUUIDResponse*>; + + std::future<GetConversationsAndMessageIDByMessageUUIDResult> GetConversationsAndMessageIDByMessageUUID( + const client_library::GetConversationsAndMessageIDByMessageUUIDForm* req, + client_library::GetConversationsAndMessageIDByMessageUUIDResponse* resp + ); + + using GetEmailsResult = Result< + const client_library::GetEmailsForm*, + client_library::GetEmailsFormResponse*>; + + std::future<GetEmailsResult> GetEmails( + const client_library::GetEmailsForm* req, + client_library::GetEmailsFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_CONVERSATION_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/delete_service.cc b/cpp/src/vereign/service/gen/delete_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..11da596808a5f1093a1f16d880d15e35263c9648 --- /dev/null +++ b/cpp/src/vereign/service/gen/delete_service.cc @@ -0,0 +1,45 @@ +#include <vereign/service/gen/delete_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string deleteInteractionPath = "deleteInteraction"; + const std::string deletePassportPath = "deletePassport"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string DeleteService::ServicePath = "/delete/"; + +DeleteService::DeleteService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<DeleteService::DeleteInteractionResult> +DeleteService::DeleteInteraction( + const client_library::DeleteInteractionForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + deleteInteractionPath, + req, + resp + ); +} + +std::future<DeleteService::DeletePassportResult> +DeleteService::DeletePassport( + const client_library::DeletePassportForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + deletePassportPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/delete_service.hh b/cpp/src/vereign/service/gen/delete_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..7e5ddfd5eb7f9b7950d1a569ff1668ad8ef4c274 --- /dev/null +++ b/cpp/src/vereign/service/gen/delete_service.hh @@ -0,0 +1,57 @@ +#ifndef __VEREIGN_SERVICE_GEN_DELETE_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_DELETE_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class DeleteService { +public: + static const std::string ServicePath; + + explicit DeleteService(restapi::ClientSession& client_session); + + DeleteService(const DeleteService&) = delete; + DeleteService& operator=(const DeleteService&) = delete; + + using DeleteInteractionResult = Result< + const client_library::DeleteInteractionForm*, + client_library::EmptyResponse*>; + + std::future<DeleteInteractionResult> DeleteInteraction( + const client_library::DeleteInteractionForm* req, + client_library::EmptyResponse* resp + ); + + using DeletePassportResult = Result< + const client_library::DeletePassportForm*, + client_library::EmptyResponse*>; + + std::future<DeletePassportResult> DeletePassport( + const client_library::DeletePassportForm* req, + client_library::EmptyResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_DELETE_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/document_service.cc b/cpp/src/vereign/service/gen/document_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..68d18f8ea5e626d7002cde492c8d35a665d1d156 --- /dev/null +++ b/cpp/src/vereign/service/gen/document_service.cc @@ -0,0 +1,162 @@ +#include <vereign/service/gen/document_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string convertDocumentByUUIDPath = "convertDocumentByUUID"; + const std::string deleteIdentityImagePath = "deleteIdentityImage"; + const std::string getDocumentPath = "getDocument"; + const std::string getDocumentByResourceIDPath = "getDocumentByResourceID"; + const std::string getDocumentByUUIDPath = "getDocumentByUUID"; + const std::string getFileInfoPath = "getFileInfo"; + const std::string getIdentityImagePath = "getIdentityImage"; + const std::string listDocumentsPath = "listDocuments"; + const std::string putDocumentByUUIDPath = "putDocumentByUUID"; + const std::string putIdentityImagePath = "putIdentityImage"; + const std::string signDocumentByUUIDPath = "signDocumentByUUID"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string DocumentService::ServicePath = "/document/"; + +DocumentService::DocumentService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<DocumentService::ConvertDocumentByUUIDResult> +DocumentService::ConvertDocumentByUUID( + const client_library::ConvertDocumentByUUIDForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + convertDocumentByUUIDPath, + req, + resp + ); +} + +std::future<DocumentService::DeleteIdentityImageResult> +DocumentService::DeleteIdentityImage( + const client_library::DeleteIdentityImageForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + deleteIdentityImagePath, + req, + resp + ); +} + +std::future<DocumentService::GetDocumentResult> +DocumentService::GetDocument( + const client_library::EmptyRequest* req, + client_library::ListDocumentsResponse* resp +) { + return client_session_.Post( + ServicePath + getDocumentPath, + req, + resp + ); +} + +std::future<DocumentService::GetDocumentByResourceIDResult> +DocumentService::GetDocumentByResourceID( + const client_library::GetDocumentByResourceIDForm* req, + client_library::GetDocumentByResourceIDFormResponse* resp +) { + return client_session_.Post( + ServicePath + getDocumentByResourceIDPath, + req, + resp + ); +} + +std::future<DocumentService::GetDocumentByUUIDResult> +DocumentService::GetDocumentByUUID( + const client_library::GetDocumentByUUIDForm* req, + client_library::GetDocumentByUUIDFormResponse* resp +) { + return client_session_.Post( + ServicePath + getDocumentByUUIDPath, + req, + resp + ); +} + +std::future<DocumentService::GetFileInfoResult> +DocumentService::GetFileInfo( + const client_library::EmptyRequest* req, + client_library::GetFileInfoResponse* resp +) { + return client_session_.Post( + ServicePath + getFileInfoPath, + req, + resp + ); +} + +std::future<DocumentService::GetIdentityImageResult> +DocumentService::GetIdentityImage( + const client_library::GetIdentityImageForm* req, + client_library::GetIdentityImageFormResponse* resp +) { + return client_session_.Post( + ServicePath + getIdentityImagePath, + req, + resp + ); +} + +std::future<DocumentService::ListDocumentsResult> +DocumentService::ListDocuments( + const client_library::EmptyRequest* req, + client_library::ListDocumentsResponse* resp +) { + return client_session_.Post( + ServicePath + listDocumentsPath, + req, + resp + ); +} + +std::future<DocumentService::PutDocumentByUUIDResult> +DocumentService::PutDocumentByUUID( + const client_library::PutDocumentByUUIDForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + putDocumentByUUIDPath, + req, + resp + ); +} + +std::future<DocumentService::PutIdentityImageResult> +DocumentService::PutIdentityImage( + const client_library::PutIdentityImageForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + putIdentityImagePath, + req, + resp + ); +} + +std::future<DocumentService::SignDocumentByUUIDResult> +DocumentService::SignDocumentByUUID( + const client_library::SignDocumentByUUIDForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + signDocumentByUUIDPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/document_service.hh b/cpp/src/vereign/service/gen/document_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..8d78e7d890268f8af45e988612284d4c370149c8 --- /dev/null +++ b/cpp/src/vereign/service/gen/document_service.hh @@ -0,0 +1,138 @@ +#ifndef __VEREIGN_SERVICE_GEN_DOCUMENT_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_DOCUMENT_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class DocumentService { +public: + static const std::string ServicePath; + + explicit DocumentService(restapi::ClientSession& client_session); + + DocumentService(const DocumentService&) = delete; + DocumentService& operator=(const DocumentService&) = delete; + + using ConvertDocumentByUUIDResult = Result< + const client_library::ConvertDocumentByUUIDForm*, + client_library::EmptyResponse*>; + + std::future<ConvertDocumentByUUIDResult> ConvertDocumentByUUID( + const client_library::ConvertDocumentByUUIDForm* req, + client_library::EmptyResponse* resp + ); + + using DeleteIdentityImageResult = Result< + const client_library::DeleteIdentityImageForm*, + client_library::EmptyResponse*>; + + std::future<DeleteIdentityImageResult> DeleteIdentityImage( + const client_library::DeleteIdentityImageForm* req, + client_library::EmptyResponse* resp + ); + + using GetDocumentResult = Result< + const client_library::EmptyRequest*, + client_library::ListDocumentsResponse*>; + + std::future<GetDocumentResult> GetDocument( + const client_library::EmptyRequest* req, + client_library::ListDocumentsResponse* resp + ); + + using GetDocumentByResourceIDResult = Result< + const client_library::GetDocumentByResourceIDForm*, + client_library::GetDocumentByResourceIDFormResponse*>; + + std::future<GetDocumentByResourceIDResult> GetDocumentByResourceID( + const client_library::GetDocumentByResourceIDForm* req, + client_library::GetDocumentByResourceIDFormResponse* resp + ); + + using GetDocumentByUUIDResult = Result< + const client_library::GetDocumentByUUIDForm*, + client_library::GetDocumentByUUIDFormResponse*>; + + std::future<GetDocumentByUUIDResult> GetDocumentByUUID( + const client_library::GetDocumentByUUIDForm* req, + client_library::GetDocumentByUUIDFormResponse* resp + ); + + using GetFileInfoResult = Result< + const client_library::EmptyRequest*, + client_library::GetFileInfoResponse*>; + + std::future<GetFileInfoResult> GetFileInfo( + const client_library::EmptyRequest* req, + client_library::GetFileInfoResponse* resp + ); + + using GetIdentityImageResult = Result< + const client_library::GetIdentityImageForm*, + client_library::GetIdentityImageFormResponse*>; + + std::future<GetIdentityImageResult> GetIdentityImage( + const client_library::GetIdentityImageForm* req, + client_library::GetIdentityImageFormResponse* resp + ); + + using ListDocumentsResult = Result< + const client_library::EmptyRequest*, + client_library::ListDocumentsResponse*>; + + std::future<ListDocumentsResult> ListDocuments( + const client_library::EmptyRequest* req, + client_library::ListDocumentsResponse* resp + ); + + using PutDocumentByUUIDResult = Result< + const client_library::PutDocumentByUUIDForm*, + client_library::EmptyResponse*>; + + std::future<PutDocumentByUUIDResult> PutDocumentByUUID( + const client_library::PutDocumentByUUIDForm* req, + client_library::EmptyResponse* resp + ); + + using PutIdentityImageResult = Result< + const client_library::PutIdentityImageForm*, + client_library::EmptyResponse*>; + + std::future<PutIdentityImageResult> PutIdentityImage( + const client_library::PutIdentityImageForm* req, + client_library::EmptyResponse* resp + ); + + using SignDocumentByUUIDResult = Result< + const client_library::SignDocumentByUUIDForm*, + client_library::EmptyResponse*>; + + std::future<SignDocumentByUUIDResult> SignDocumentByUUID( + const client_library::SignDocumentByUUIDForm* req, + client_library::EmptyResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_DOCUMENT_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/email_service.cc b/cpp/src/vereign/service/gen/email_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..bb3b681ae6080bdd682660f3ddfd667c5f96b74f --- /dev/null +++ b/cpp/src/vereign/service/gen/email_service.cc @@ -0,0 +1,136 @@ +#include <vereign/service/gen/email_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string getEmailStatusAllPath = "getEmailStatusAll"; + const std::string getEmailStatusListPath = "getEmailStatusList"; + const std::string getGmailMessageIDsByGmailThreadIDPath = "getGmailMessageIDsByGmailThreadID"; + const std::string getMessageIDsByGmailMessageIDsPath = "getMessageIDsByGmailMessageIDs"; + const std::string initializeEmailStatusPath = "initializeEmailStatus"; + const std::string sendEmailSmtpPath = "sendEmailSmtp"; + const std::string sendFeedbackPath = "sendFeedback"; + const std::string storeGmailMessageIdPath = "storeGmailMessageId"; + const std::string updateRecipientEmailStatusPath = "updateRecipientEmailStatus"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string EmailService::ServicePath = "/email/"; + +EmailService::EmailService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<EmailService::GetEmailStatusAllResult> +EmailService::GetEmailStatusAll( + const client_library::GetEmailStatusAllForm* req, + client_library::GetEmailStatusAllFormResponse* resp +) { + return client_session_.Post( + ServicePath + getEmailStatusAllPath, + req, + resp + ); +} + +std::future<EmailService::GetEmailStatusListResult> +EmailService::GetEmailStatusList( + const client_library::GetEmailStatusListForm* req, + client_library::GetEmailStatusListFormResponse* resp +) { + return client_session_.Post( + ServicePath + getEmailStatusListPath, + req, + resp + ); +} + +std::future<EmailService::GetGmailMessageIDsByGmailThreadIDResult> +EmailService::GetGmailMessageIDsByGmailThreadID( + const client_library::GetGmailMessageIDsByGmailThreadIDForm* req, + client_library::GetGmailMessageIDsByGmailThreadIDFormResponse* resp +) { + return client_session_.Post( + ServicePath + getGmailMessageIDsByGmailThreadIDPath, + req, + resp + ); +} + +std::future<EmailService::GetMessageIDsByGmailMessageIDsResult> +EmailService::GetMessageIDsByGmailMessageIDs( + const client_library::GetMessageIDsByGmailMessageIDsForm* req, + client_library::GetMessageIDsByGmailMessageIDsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getMessageIDsByGmailMessageIDsPath, + req, + resp + ); +} + +std::future<EmailService::InitializeEmailStatusResult> +EmailService::InitializeEmailStatus( + const client_library::InitializeEmailStatusForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + initializeEmailStatusPath, + req, + resp + ); +} + +std::future<EmailService::SendEmailSmtpResult> +EmailService::SendEmailSmtp( + const client_library::SendEmailSmtpForm* req, + client_library::SendEmailSmtpFormResponse* resp +) { + return client_session_.Post( + ServicePath + sendEmailSmtpPath, + req, + resp + ); +} + +std::future<EmailService::SendFeedbackResult> +EmailService::SendFeedback( + const client_library::SendFeedbackForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + sendFeedbackPath, + req, + resp + ); +} + +std::future<EmailService::StoreGmailMessageIdResult> +EmailService::StoreGmailMessageId( + const client_library::StoreGmailMessageIdForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + storeGmailMessageIdPath, + req, + resp + ); +} + +std::future<EmailService::UpdateRecipientEmailStatusResult> +EmailService::UpdateRecipientEmailStatus( + const client_library::UpdateRecipientEmailStatusForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + updateRecipientEmailStatusPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/email_service.hh b/cpp/src/vereign/service/gen/email_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..9f25846caac1ead3416b9e4a014b931476d62d3c --- /dev/null +++ b/cpp/src/vereign/service/gen/email_service.hh @@ -0,0 +1,120 @@ +#ifndef __VEREIGN_SERVICE_GEN_EMAIL_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_EMAIL_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class EmailService { +public: + static const std::string ServicePath; + + explicit EmailService(restapi::ClientSession& client_session); + + EmailService(const EmailService&) = delete; + EmailService& operator=(const EmailService&) = delete; + + using GetEmailStatusAllResult = Result< + const client_library::GetEmailStatusAllForm*, + client_library::GetEmailStatusAllFormResponse*>; + + std::future<GetEmailStatusAllResult> GetEmailStatusAll( + const client_library::GetEmailStatusAllForm* req, + client_library::GetEmailStatusAllFormResponse* resp + ); + + using GetEmailStatusListResult = Result< + const client_library::GetEmailStatusListForm*, + client_library::GetEmailStatusListFormResponse*>; + + std::future<GetEmailStatusListResult> GetEmailStatusList( + const client_library::GetEmailStatusListForm* req, + client_library::GetEmailStatusListFormResponse* resp + ); + + using GetGmailMessageIDsByGmailThreadIDResult = Result< + const client_library::GetGmailMessageIDsByGmailThreadIDForm*, + client_library::GetGmailMessageIDsByGmailThreadIDFormResponse*>; + + std::future<GetGmailMessageIDsByGmailThreadIDResult> GetGmailMessageIDsByGmailThreadID( + const client_library::GetGmailMessageIDsByGmailThreadIDForm* req, + client_library::GetGmailMessageIDsByGmailThreadIDFormResponse* resp + ); + + using GetMessageIDsByGmailMessageIDsResult = Result< + const client_library::GetMessageIDsByGmailMessageIDsForm*, + client_library::GetMessageIDsByGmailMessageIDsFormResponse*>; + + std::future<GetMessageIDsByGmailMessageIDsResult> GetMessageIDsByGmailMessageIDs( + const client_library::GetMessageIDsByGmailMessageIDsForm* req, + client_library::GetMessageIDsByGmailMessageIDsFormResponse* resp + ); + + using InitializeEmailStatusResult = Result< + const client_library::InitializeEmailStatusForm*, + client_library::EmptyResponse*>; + + std::future<InitializeEmailStatusResult> InitializeEmailStatus( + const client_library::InitializeEmailStatusForm* req, + client_library::EmptyResponse* resp + ); + + using SendEmailSmtpResult = Result< + const client_library::SendEmailSmtpForm*, + client_library::SendEmailSmtpFormResponse*>; + + std::future<SendEmailSmtpResult> SendEmailSmtp( + const client_library::SendEmailSmtpForm* req, + client_library::SendEmailSmtpFormResponse* resp + ); + + using SendFeedbackResult = Result< + const client_library::SendFeedbackForm*, + client_library::EmptyResponse*>; + + std::future<SendFeedbackResult> SendFeedback( + const client_library::SendFeedbackForm* req, + client_library::EmptyResponse* resp + ); + + using StoreGmailMessageIdResult = Result< + const client_library::StoreGmailMessageIdForm*, + client_library::EmptyResponse*>; + + std::future<StoreGmailMessageIdResult> StoreGmailMessageId( + const client_library::StoreGmailMessageIdForm* req, + client_library::EmptyResponse* resp + ); + + using UpdateRecipientEmailStatusResult = Result< + const client_library::UpdateRecipientEmailStatusForm*, + client_library::EmptyResponse*>; + + std::future<UpdateRecipientEmailStatusResult> UpdateRecipientEmailStatus( + const client_library::UpdateRecipientEmailStatusForm* req, + client_library::EmptyResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_EMAIL_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/entity_service.cc b/cpp/src/vereign/service/gen/entity_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..b5294a6bf8481b8ee809940602db2eecb1e2b886 --- /dev/null +++ b/cpp/src/vereign/service/gen/entity_service.cc @@ -0,0 +1,305 @@ +#include <vereign/service/gen/entity_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string addChildPath = "addChild"; + const std::string addClaimPath = "addClaim"; + const std::string addGuardedPath = "addGuarded"; + const std::string addGuardianPath = "addGuardian"; + const std::string addMemberPath = "addMember"; + const std::string addMemberOfPath = "addMemberOf"; + const std::string addParentPath = "addParent"; + const std::string addViewerPath = "addViewer"; + const std::string createEntityPath = "createEntity"; + const std::string deleteClaimPath = "deleteClaim"; + const std::string getClaimPath = "getClaim"; + const std::string getEntityPath = "getEntity"; + const std::string removeChildPath = "removeChild"; + const std::string removeGuardedPath = "removeGuarded"; + const std::string removeGuardianPath = "removeGuardian"; + const std::string removeMemberPath = "removeMember"; + const std::string removeMemberOfPath = "removeMemberOf"; + const std::string removeParentPath = "removeParent"; + const std::string removeViewerPath = "removeViewer"; + const std::string sendClaimCodePath = "sendClaimCode"; + const std::string updateClaimPath = "updateClaim"; + const std::string verifyClaimCodePath = "verifyClaimCode"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string EntityService::ServicePath = "/entity/"; + +EntityService::EntityService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<EntityService::AddChildResult> +EntityService::AddChild( + const client_library::AddChildForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addChildPath, + req, + resp + ); +} + +std::future<EntityService::AddClaimResult> +EntityService::AddClaim( + const client_library::AddClaimForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addClaimPath, + req, + resp + ); +} + +std::future<EntityService::AddGuardedResult> +EntityService::AddGuarded( + const client_library::AddGuardedForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addGuardedPath, + req, + resp + ); +} + +std::future<EntityService::AddGuardianResult> +EntityService::AddGuardian( + const client_library::AddGuardianForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addGuardianPath, + req, + resp + ); +} + +std::future<EntityService::AddMemberResult> +EntityService::AddMember( + const client_library::AddMemberForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addMemberPath, + req, + resp + ); +} + +std::future<EntityService::AddMemberOfResult> +EntityService::AddMemberOf( + const client_library::AddMemberOfForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addMemberOfPath, + req, + resp + ); +} + +std::future<EntityService::AddParentResult> +EntityService::AddParent( + const client_library::AddParentForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addParentPath, + req, + resp + ); +} + +std::future<EntityService::AddViewerResult> +EntityService::AddViewer( + const client_library::AddViewerForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + addViewerPath, + req, + resp + ); +} + +std::future<EntityService::CreateEntityResult> +EntityService::CreateEntity( + const client_library::CreateEntityForm* req, + client_library::CreateEntityFormResponse* resp +) { + return client_session_.Post( + ServicePath + createEntityPath, + req, + resp + ); +} + +std::future<EntityService::DeleteClaimResult> +EntityService::DeleteClaim( + const client_library::DeleteClaimForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + deleteClaimPath, + req, + resp + ); +} + +std::future<EntityService::GetClaimResult> +EntityService::GetClaim( + const client_library::GetClaimForm* req, + client_library::GetClaimFormResponse* resp +) { + return client_session_.Post( + ServicePath + getClaimPath, + req, + resp + ); +} + +std::future<EntityService::GetEntityResult> +EntityService::GetEntity( + const client_library::GetEntityForm* req, + client_library::GetEntityFormResponse* resp +) { + return client_session_.Post( + ServicePath + getEntityPath, + req, + resp + ); +} + +std::future<EntityService::RemoveChildResult> +EntityService::RemoveChild( + const client_library::RemoveChildForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeChildPath, + req, + resp + ); +} + +std::future<EntityService::RemoveGuardedResult> +EntityService::RemoveGuarded( + const client_library::RemoveGuardedForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeGuardedPath, + req, + resp + ); +} + +std::future<EntityService::RemoveGuardianResult> +EntityService::RemoveGuardian( + const client_library::RemoveGuardianForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeGuardianPath, + req, + resp + ); +} + +std::future<EntityService::RemoveMemberResult> +EntityService::RemoveMember( + const client_library::RemoveMemberForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeMemberPath, + req, + resp + ); +} + +std::future<EntityService::RemoveMemberOfResult> +EntityService::RemoveMemberOf( + const client_library::RemoveMemberOfForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeMemberOfPath, + req, + resp + ); +} + +std::future<EntityService::RemoveParentResult> +EntityService::RemoveParent( + const client_library::RemoveParentForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeParentPath, + req, + resp + ); +} + +std::future<EntityService::RemoveViewerResult> +EntityService::RemoveViewer( + const client_library::RemoveViewerForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + removeViewerPath, + req, + resp + ); +} + +std::future<EntityService::SendClaimCodeResult> +EntityService::SendClaimCode( + const client_library::ClaimSendCodeForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + sendClaimCodePath, + req, + resp + ); +} + +std::future<EntityService::UpdateClaimResult> +EntityService::UpdateClaim( + const client_library::AddClaimForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + updateClaimPath, + req, + resp + ); +} + +std::future<EntityService::VerifyClaimCodeResult> +EntityService::VerifyClaimCode( + const client_library::ClaimVerifyCodeForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + verifyClaimCodePath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/entity_service.hh b/cpp/src/vereign/service/gen/entity_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..322ae79c62c9a2a14a01326cf919b3cebb8b9a21 --- /dev/null +++ b/cpp/src/vereign/service/gen/entity_service.hh @@ -0,0 +1,237 @@ +#ifndef __VEREIGN_SERVICE_GEN_ENTITY_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_ENTITY_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class EntityService { +public: + static const std::string ServicePath; + + explicit EntityService(restapi::ClientSession& client_session); + + EntityService(const EntityService&) = delete; + EntityService& operator=(const EntityService&) = delete; + + using AddChildResult = Result< + const client_library::AddChildForm*, + client_library::EmptyResponse*>; + + std::future<AddChildResult> AddChild( + const client_library::AddChildForm* req, + client_library::EmptyResponse* resp + ); + + using AddClaimResult = Result< + const client_library::AddClaimForm*, + client_library::EmptyResponse*>; + + std::future<AddClaimResult> AddClaim( + const client_library::AddClaimForm* req, + client_library::EmptyResponse* resp + ); + + using AddGuardedResult = Result< + const client_library::AddGuardedForm*, + client_library::EmptyResponse*>; + + std::future<AddGuardedResult> AddGuarded( + const client_library::AddGuardedForm* req, + client_library::EmptyResponse* resp + ); + + using AddGuardianResult = Result< + const client_library::AddGuardianForm*, + client_library::EmptyResponse*>; + + std::future<AddGuardianResult> AddGuardian( + const client_library::AddGuardianForm* req, + client_library::EmptyResponse* resp + ); + + using AddMemberResult = Result< + const client_library::AddMemberForm*, + client_library::EmptyResponse*>; + + std::future<AddMemberResult> AddMember( + const client_library::AddMemberForm* req, + client_library::EmptyResponse* resp + ); + + using AddMemberOfResult = Result< + const client_library::AddMemberOfForm*, + client_library::EmptyResponse*>; + + std::future<AddMemberOfResult> AddMemberOf( + const client_library::AddMemberOfForm* req, + client_library::EmptyResponse* resp + ); + + using AddParentResult = Result< + const client_library::AddParentForm*, + client_library::EmptyResponse*>; + + std::future<AddParentResult> AddParent( + const client_library::AddParentForm* req, + client_library::EmptyResponse* resp + ); + + using AddViewerResult = Result< + const client_library::AddViewerForm*, + client_library::EmptyResponse*>; + + std::future<AddViewerResult> AddViewer( + const client_library::AddViewerForm* req, + client_library::EmptyResponse* resp + ); + + using CreateEntityResult = Result< + const client_library::CreateEntityForm*, + client_library::CreateEntityFormResponse*>; + + std::future<CreateEntityResult> CreateEntity( + const client_library::CreateEntityForm* req, + client_library::CreateEntityFormResponse* resp + ); + + using DeleteClaimResult = Result< + const client_library::DeleteClaimForm*, + client_library::EmptyResponse*>; + + std::future<DeleteClaimResult> DeleteClaim( + const client_library::DeleteClaimForm* req, + client_library::EmptyResponse* resp + ); + + using GetClaimResult = Result< + const client_library::GetClaimForm*, + client_library::GetClaimFormResponse*>; + + std::future<GetClaimResult> GetClaim( + const client_library::GetClaimForm* req, + client_library::GetClaimFormResponse* resp + ); + + using GetEntityResult = Result< + const client_library::GetEntityForm*, + client_library::GetEntityFormResponse*>; + + std::future<GetEntityResult> GetEntity( + const client_library::GetEntityForm* req, + client_library::GetEntityFormResponse* resp + ); + + using RemoveChildResult = Result< + const client_library::RemoveChildForm*, + client_library::EmptyResponse*>; + + std::future<RemoveChildResult> RemoveChild( + const client_library::RemoveChildForm* req, + client_library::EmptyResponse* resp + ); + + using RemoveGuardedResult = Result< + const client_library::RemoveGuardedForm*, + client_library::EmptyResponse*>; + + std::future<RemoveGuardedResult> RemoveGuarded( + const client_library::RemoveGuardedForm* req, + client_library::EmptyResponse* resp + ); + + using RemoveGuardianResult = Result< + const client_library::RemoveGuardianForm*, + client_library::EmptyResponse*>; + + std::future<RemoveGuardianResult> RemoveGuardian( + const client_library::RemoveGuardianForm* req, + client_library::EmptyResponse* resp + ); + + using RemoveMemberResult = Result< + const client_library::RemoveMemberForm*, + client_library::EmptyResponse*>; + + std::future<RemoveMemberResult> RemoveMember( + const client_library::RemoveMemberForm* req, + client_library::EmptyResponse* resp + ); + + using RemoveMemberOfResult = Result< + const client_library::RemoveMemberOfForm*, + client_library::EmptyResponse*>; + + std::future<RemoveMemberOfResult> RemoveMemberOf( + const client_library::RemoveMemberOfForm* req, + client_library::EmptyResponse* resp + ); + + using RemoveParentResult = Result< + const client_library::RemoveParentForm*, + client_library::EmptyResponse*>; + + std::future<RemoveParentResult> RemoveParent( + const client_library::RemoveParentForm* req, + client_library::EmptyResponse* resp + ); + + using RemoveViewerResult = Result< + const client_library::RemoveViewerForm*, + client_library::EmptyResponse*>; + + std::future<RemoveViewerResult> RemoveViewer( + const client_library::RemoveViewerForm* req, + client_library::EmptyResponse* resp + ); + + using SendClaimCodeResult = Result< + const client_library::ClaimSendCodeForm*, + client_library::EmptyResponse*>; + + std::future<SendClaimCodeResult> SendClaimCode( + const client_library::ClaimSendCodeForm* req, + client_library::EmptyResponse* resp + ); + + using UpdateClaimResult = Result< + const client_library::AddClaimForm*, + client_library::EmptyResponse*>; + + std::future<UpdateClaimResult> UpdateClaim( + const client_library::AddClaimForm* req, + client_library::EmptyResponse* resp + ); + + using VerifyClaimCodeResult = Result< + const client_library::ClaimVerifyCodeForm*, + client_library::EmptyResponse*>; + + std::future<VerifyClaimCodeResult> VerifyClaimCode( + const client_library::ClaimVerifyCodeForm* req, + client_library::EmptyResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_ENTITY_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/event_service.cc b/cpp/src/vereign/service/gen/event_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..3a253c2b36da0651eb5ba04f33fa4506fc24ef08 --- /dev/null +++ b/cpp/src/vereign/service/gen/event_service.cc @@ -0,0 +1,32 @@ +#include <vereign/service/gen/event_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string getEventsPath = "getEvents"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string EventService::ServicePath = "/event/"; + +EventService::EventService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<EventService::GetEventsResult> +EventService::GetEvents( + const client_library::GetEventsForm* req, + client_library::GetEventsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getEventsPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/event_service.hh b/cpp/src/vereign/service/gen/event_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..4537c43fa58fcc6f7835b2ffb9b93ffb13ef110b --- /dev/null +++ b/cpp/src/vereign/service/gen/event_service.hh @@ -0,0 +1,48 @@ +#ifndef __VEREIGN_SERVICE_GEN_EVENT_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_EVENT_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class EventService { +public: + static const std::string ServicePath; + + explicit EventService(restapi::ClientSession& client_session); + + EventService(const EventService&) = delete; + EventService& operator=(const EventService&) = delete; + + using GetEventsResult = Result< + const client_library::GetEventsForm*, + client_library::GetEventsFormResponse*>; + + std::future<GetEventsResult> GetEvents( + const client_library::GetEventsForm* req, + client_library::GetEventsFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_EVENT_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/ews_service.cc b/cpp/src/vereign/service/gen/ews_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..d6c0d88907ec44f6bbda75fcca9af3306764509d --- /dev/null +++ b/cpp/src/vereign/service/gen/ews_service.cc @@ -0,0 +1,32 @@ +#include <vereign/service/gen/ews_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string proxyRequestPath = "proxyRequest"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string EwsService::ServicePath = "/ews/"; + +EwsService::EwsService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<EwsService::ProxyRequestResult> +EwsService::ProxyRequest( + const client_library::EWSProxyRequestForm* req, + client_library::EWSProxyRequestFormResponse* resp +) { + return client_session_.Post( + ServicePath + proxyRequestPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/ews_service.hh b/cpp/src/vereign/service/gen/ews_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..f15a1e8597ffd4a019a4cae863d9e1dde3424ea0 --- /dev/null +++ b/cpp/src/vereign/service/gen/ews_service.hh @@ -0,0 +1,48 @@ +#ifndef __VEREIGN_SERVICE_GEN_EWS_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_EWS_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class EwsService { +public: + static const std::string ServicePath; + + explicit EwsService(restapi::ClientSession& client_session); + + EwsService(const EwsService&) = delete; + EwsService& operator=(const EwsService&) = delete; + + using ProxyRequestResult = Result< + const client_library::EWSProxyRequestForm*, + client_library::EWSProxyRequestFormResponse*>; + + std::future<ProxyRequestResult> ProxyRequest( + const client_library::EWSProxyRequestForm* req, + client_library::EWSProxyRequestFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_EWS_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/gen.hh b/cpp/src/vereign/service/gen/gen.hh new file mode 100644 index 0000000000000000000000000000000000000000..0dda26492de4dd05d64beb6208564e2d5f1bcf3b --- /dev/null +++ b/cpp/src/vereign/service/gen/gen.hh @@ -0,0 +1,25 @@ +#ifndef __VEREIGN_SERVICE_GEN_GEN_HH +#define __VEREIGN_SERVICE_GEN_GEN_HH + + +#include <vereign/service/gen/action_service.hh> +#include <vereign/service/gen/activity_service.hh> +#include <vereign/service/gen/company_service.hh> +#include <vereign/service/gen/contacts_service.hh> +#include <vereign/service/gen/conversation_service.hh> +#include <vereign/service/gen/delete_service.hh> +#include <vereign/service/gen/document_service.hh> +#include <vereign/service/gen/email_service.hh> +#include <vereign/service/gen/entity_service.hh> +#include <vereign/service/gen/event_service.hh> +#include <vereign/service/gen/ews_service.hh> +#include <vereign/service/gen/identity_service.hh> +#include <vereign/service/gen/interactions_service.hh> +#include <vereign/service/gen/orders_service.hh> +#include <vereign/service/gen/passport_service.hh> +#include <vereign/service/gen/reporting_service.hh> +#include <vereign/service/gen/resource_service.hh> +#include <vereign/service/gen/sharing_service.hh> +#include <vereign/service/gen/sign_service.hh> + +#endif // __VEREIGN_SERVICE_GEN_GEN_HH diff --git a/cpp/src/vereign/service/gen/identity_service.cc b/cpp/src/vereign/service/gen/identity_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..1a3e0da1837ecc6757ca6e70fdbfa13e8d6d027d --- /dev/null +++ b/cpp/src/vereign/service/gen/identity_service.cc @@ -0,0 +1,227 @@ +#include <vereign/service/gen/identity_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string authorizeDevicePath = "authorizeDevice"; + const std::string cancelActionPath = "cancelAction"; + const std::string confirmActionPath = "confirmAction"; + const std::string confirmNewCarddavPublicKeyPath = "confirmNewCarddavPublicKey"; + const std::string confirmNewDevicePath = "confirmNewDevice"; + const std::string generateCredentialsPath = "generateCredentials"; + const std::string getAvatarPath = "getAvatar"; + const std::string getIdentityProfileDataPath = "getIdentityProfileData"; + const std::string hasUnauthorizedDevicesPath = "hasUnauthorizedDevices"; + const std::string listDevicesPath = "listDevices"; + const std::string pullAvatarFromGravatarPath = "pullAvatarFromGravatar"; + const std::string register2FAPublicKeyPath = "register2FAPublicKey"; + const std::string renameDevicePath = "renameDevice"; + const std::string resumeDevicePath = "resumeDevice"; + const std::string revokeDevicePath = "revokeDevice"; + const std::string suspendDevicePath = "suspendDevice"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string IdentityService::ServicePath = "/identity/"; + +IdentityService::IdentityService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<IdentityService::AuthorizeDeviceResult> +IdentityService::AuthorizeDevice( + const client_library::AuthorizeDeviceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + authorizeDevicePath, + req, + resp + ); +} + +std::future<IdentityService::CancelActionResult> +IdentityService::CancelAction( + const client_library::CancelActionForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + cancelActionPath, + req, + resp + ); +} + +std::future<IdentityService::ConfirmActionResult> +IdentityService::ConfirmAction( + const client_library::ConfirmActionExecutionForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + confirmActionPath, + req, + resp + ); +} + +std::future<IdentityService::ConfirmNewCarddavPublicKeyResult> +IdentityService::ConfirmNewCarddavPublicKey( + const client_library::ConfirmNewCarddavPublicKeyForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + confirmNewCarddavPublicKeyPath, + req, + resp + ); +} + +std::future<IdentityService::ConfirmNewDeviceResult> +IdentityService::ConfirmNewDevice( + const client_library::ConfirmNewDeviceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + confirmNewDevicePath, + req, + resp + ); +} + +std::future<IdentityService::GenerateCredentialsResult> +IdentityService::GenerateCredentials( + const client_library::GenerateCredentialsForm* req, + client_library::GenerateCredentialsFormResponse* resp +) { + return client_session_.Post( + ServicePath + generateCredentialsPath, + req, + resp + ); +} + +std::future<IdentityService::GetAvatarResult> +IdentityService::GetAvatar( + const client_library::GetIdentityAvatarForm* req, + client_library::GetIdentityAvatarFormResponse* resp +) { + return client_session_.Post( + ServicePath + getAvatarPath, + req, + resp + ); +} + +std::future<IdentityService::GetIdentityProfileDataResult> +IdentityService::GetIdentityProfileData( + const client_library::GetIdentityProfileDataForm* req, + client_library::GetIdentityProfileDataFormResponse* resp +) { + return client_session_.Post( + ServicePath + getIdentityProfileDataPath, + req, + resp + ); +} + +std::future<IdentityService::HasUnauthorizedDevicesResult> +IdentityService::HasUnauthorizedDevices( + const client_library::EmptyRequest* req, + client_library::HasUnauthorizedDevicesHandlerFormResponse* resp +) { + return client_session_.Post( + ServicePath + hasUnauthorizedDevicesPath, + req, + resp + ); +} + +std::future<IdentityService::ListDevicesResult> +IdentityService::ListDevices( + const client_library::EmptyRequest* req, + client_library::ListDevicesHandlerFormResponse* resp +) { + return client_session_.Post( + ServicePath + listDevicesPath, + req, + resp + ); +} + +std::future<IdentityService::PullAvatarFromGravatarResult> +IdentityService::PullAvatarFromGravatar( + const client_library::PullAvatarFromGravatarForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + pullAvatarFromGravatarPath, + req, + resp + ); +} + +std::future<IdentityService::Register2FAPublicKeyResult> +IdentityService::Register2FAPublicKey( + const client_library::Register2FAPublicKeyForm* req, + client_library::Register2FAPublicKeyFormResponse* resp +) { + return client_session_.Post( + ServicePath + register2FAPublicKeyPath, + req, + resp + ); +} + +std::future<IdentityService::RenameDeviceResult> +IdentityService::RenameDevice( + const client_library::RenameDeviceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + renameDevicePath, + req, + resp + ); +} + +std::future<IdentityService::ResumeDeviceResult> +IdentityService::ResumeDevice( + const client_library::ResumeDeviceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + resumeDevicePath, + req, + resp + ); +} + +std::future<IdentityService::RevokeDeviceResult> +IdentityService::RevokeDevice( + const client_library::RevokeDeviceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + revokeDevicePath, + req, + resp + ); +} + +std::future<IdentityService::SuspendDeviceResult> +IdentityService::SuspendDevice( + const client_library::SuspendDeviceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + suspendDevicePath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/identity_service.hh b/cpp/src/vereign/service/gen/identity_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..8c5dad11e7a1ab05a4dcad775315ee785dfd61ab --- /dev/null +++ b/cpp/src/vereign/service/gen/identity_service.hh @@ -0,0 +1,183 @@ +#ifndef __VEREIGN_SERVICE_GEN_IDENTITY_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_IDENTITY_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class IdentityService { +public: + static const std::string ServicePath; + + explicit IdentityService(restapi::ClientSession& client_session); + + IdentityService(const IdentityService&) = delete; + IdentityService& operator=(const IdentityService&) = delete; + + using AuthorizeDeviceResult = Result< + const client_library::AuthorizeDeviceForm*, + client_library::EmptyResponse*>; + + std::future<AuthorizeDeviceResult> AuthorizeDevice( + const client_library::AuthorizeDeviceForm* req, + client_library::EmptyResponse* resp + ); + + using CancelActionResult = Result< + const client_library::CancelActionForm*, + client_library::EmptyResponse*>; + + std::future<CancelActionResult> CancelAction( + const client_library::CancelActionForm* req, + client_library::EmptyResponse* resp + ); + + using ConfirmActionResult = Result< + const client_library::ConfirmActionExecutionForm*, + client_library::EmptyResponse*>; + + std::future<ConfirmActionResult> ConfirmAction( + const client_library::ConfirmActionExecutionForm* req, + client_library::EmptyResponse* resp + ); + + using ConfirmNewCarddavPublicKeyResult = Result< + const client_library::ConfirmNewCarddavPublicKeyForm*, + client_library::EmptyResponse*>; + + std::future<ConfirmNewCarddavPublicKeyResult> ConfirmNewCarddavPublicKey( + const client_library::ConfirmNewCarddavPublicKeyForm* req, + client_library::EmptyResponse* resp + ); + + using ConfirmNewDeviceResult = Result< + const client_library::ConfirmNewDeviceForm*, + client_library::EmptyResponse*>; + + std::future<ConfirmNewDeviceResult> ConfirmNewDevice( + const client_library::ConfirmNewDeviceForm* req, + client_library::EmptyResponse* resp + ); + + using GenerateCredentialsResult = Result< + const client_library::GenerateCredentialsForm*, + client_library::GenerateCredentialsFormResponse*>; + + std::future<GenerateCredentialsResult> GenerateCredentials( + const client_library::GenerateCredentialsForm* req, + client_library::GenerateCredentialsFormResponse* resp + ); + + using GetAvatarResult = Result< + const client_library::GetIdentityAvatarForm*, + client_library::GetIdentityAvatarFormResponse*>; + + std::future<GetAvatarResult> GetAvatar( + const client_library::GetIdentityAvatarForm* req, + client_library::GetIdentityAvatarFormResponse* resp + ); + + using GetIdentityProfileDataResult = Result< + const client_library::GetIdentityProfileDataForm*, + client_library::GetIdentityProfileDataFormResponse*>; + + std::future<GetIdentityProfileDataResult> GetIdentityProfileData( + const client_library::GetIdentityProfileDataForm* req, + client_library::GetIdentityProfileDataFormResponse* resp + ); + + using HasUnauthorizedDevicesResult = Result< + const client_library::EmptyRequest*, + client_library::HasUnauthorizedDevicesHandlerFormResponse*>; + + std::future<HasUnauthorizedDevicesResult> HasUnauthorizedDevices( + const client_library::EmptyRequest* req, + client_library::HasUnauthorizedDevicesHandlerFormResponse* resp + ); + + using ListDevicesResult = Result< + const client_library::EmptyRequest*, + client_library::ListDevicesHandlerFormResponse*>; + + std::future<ListDevicesResult> ListDevices( + const client_library::EmptyRequest* req, + client_library::ListDevicesHandlerFormResponse* resp + ); + + using PullAvatarFromGravatarResult = Result< + const client_library::PullAvatarFromGravatarForm*, + client_library::EmptyResponse*>; + + std::future<PullAvatarFromGravatarResult> PullAvatarFromGravatar( + const client_library::PullAvatarFromGravatarForm* req, + client_library::EmptyResponse* resp + ); + + using Register2FAPublicKeyResult = Result< + const client_library::Register2FAPublicKeyForm*, + client_library::Register2FAPublicKeyFormResponse*>; + + std::future<Register2FAPublicKeyResult> Register2FAPublicKey( + const client_library::Register2FAPublicKeyForm* req, + client_library::Register2FAPublicKeyFormResponse* resp + ); + + using RenameDeviceResult = Result< + const client_library::RenameDeviceForm*, + client_library::EmptyResponse*>; + + std::future<RenameDeviceResult> RenameDevice( + const client_library::RenameDeviceForm* req, + client_library::EmptyResponse* resp + ); + + using ResumeDeviceResult = Result< + const client_library::ResumeDeviceForm*, + client_library::EmptyResponse*>; + + std::future<ResumeDeviceResult> ResumeDevice( + const client_library::ResumeDeviceForm* req, + client_library::EmptyResponse* resp + ); + + using RevokeDeviceResult = Result< + const client_library::RevokeDeviceForm*, + client_library::EmptyResponse*>; + + std::future<RevokeDeviceResult> RevokeDevice( + const client_library::RevokeDeviceForm* req, + client_library::EmptyResponse* resp + ); + + using SuspendDeviceResult = Result< + const client_library::SuspendDeviceForm*, + client_library::EmptyResponse*>; + + std::future<SuspendDeviceResult> SuspendDevice( + const client_library::SuspendDeviceForm* req, + client_library::EmptyResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_IDENTITY_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/interactions_service.cc b/cpp/src/vereign/service/gen/interactions_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..f7832735c20290f17d34b9683ec6c092ed8f1b80 --- /dev/null +++ b/cpp/src/vereign/service/gen/interactions_service.cc @@ -0,0 +1,32 @@ +#include <vereign/service/gen/interactions_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string searchInteractionsPath = "searchInteractions"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string InteractionsService::ServicePath = "/interactions/"; + +InteractionsService::InteractionsService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<InteractionsService::SearchInteractionsResult> +InteractionsService::SearchInteractions( + const client_library::SearchInteractionsForm* req, + client_library::SearchInteractionsFormResponse* resp +) { + return client_session_.Post( + ServicePath + searchInteractionsPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/interactions_service.hh b/cpp/src/vereign/service/gen/interactions_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..105640c151922f69641f662460422d9479f6faf7 --- /dev/null +++ b/cpp/src/vereign/service/gen/interactions_service.hh @@ -0,0 +1,48 @@ +#ifndef __VEREIGN_SERVICE_GEN_INTERACTIONS_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_INTERACTIONS_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class InteractionsService { +public: + static const std::string ServicePath; + + explicit InteractionsService(restapi::ClientSession& client_session); + + InteractionsService(const InteractionsService&) = delete; + InteractionsService& operator=(const InteractionsService&) = delete; + + using SearchInteractionsResult = Result< + const client_library::SearchInteractionsForm*, + client_library::SearchInteractionsFormResponse*>; + + std::future<SearchInteractionsResult> SearchInteractions( + const client_library::SearchInteractionsForm* req, + client_library::SearchInteractionsFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_INTERACTIONS_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/orders_service.cc b/cpp/src/vereign/service/gen/orders_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..1f981a4030acb4d693235b57a9803be02519cc56 --- /dev/null +++ b/cpp/src/vereign/service/gen/orders_service.cc @@ -0,0 +1,84 @@ +#include <vereign/service/gen/orders_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string confirmCardPaymentPath = "confirmCardPayment"; + const std::string getGeneratedInvoiceForOrderPath = "getGeneratedInvoiceForOrder"; + const std::string getOrderPath = "getOrder"; + const std::string initializeCardPaymentPath = "initializeCardPayment"; + const std::string listOrdersPath = "listOrders"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string OrdersService::ServicePath = "/orders/"; + +OrdersService::OrdersService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<OrdersService::ConfirmCardPaymentResult> +OrdersService::ConfirmCardPayment( + const client_library::ConfirmCardPaymentForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + confirmCardPaymentPath, + req, + resp + ); +} + +std::future<OrdersService::GetGeneratedInvoiceForOrderResult> +OrdersService::GetGeneratedInvoiceForOrder( + const client_library::GetGeneratedInvoiceForOrderForm* req, + client_library::GetGeneratedInvoiceForOrderFormResponse* resp +) { + return client_session_.Post( + ServicePath + getGeneratedInvoiceForOrderPath, + req, + resp + ); +} + +std::future<OrdersService::GetOrderResult> +OrdersService::GetOrder( + const client_library::GetOrderForm* req, + client_library::GetOrderFormResponse* resp +) { + return client_session_.Post( + ServicePath + getOrderPath, + req, + resp + ); +} + +std::future<OrdersService::InitializeCardPaymentResult> +OrdersService::InitializeCardPayment( + const client_library::InitializeCardPaymentForm* req, + client_library::InitializeCardPaymentFormResponse* resp +) { + return client_session_.Post( + ServicePath + initializeCardPaymentPath, + req, + resp + ); +} + +std::future<OrdersService::ListOrdersResult> +OrdersService::ListOrders( + const client_library::ListOrdersForm* req, + client_library::ListOrdersFormResponse* resp +) { + return client_session_.Post( + ServicePath + listOrdersPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/orders_service.hh b/cpp/src/vereign/service/gen/orders_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..c6f4e209614ed9af2af6f418678ae7a5927ad083 --- /dev/null +++ b/cpp/src/vereign/service/gen/orders_service.hh @@ -0,0 +1,84 @@ +#ifndef __VEREIGN_SERVICE_GEN_ORDERS_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_ORDERS_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class OrdersService { +public: + static const std::string ServicePath; + + explicit OrdersService(restapi::ClientSession& client_session); + + OrdersService(const OrdersService&) = delete; + OrdersService& operator=(const OrdersService&) = delete; + + using ConfirmCardPaymentResult = Result< + const client_library::ConfirmCardPaymentForm*, + client_library::EmptyResponse*>; + + std::future<ConfirmCardPaymentResult> ConfirmCardPayment( + const client_library::ConfirmCardPaymentForm* req, + client_library::EmptyResponse* resp + ); + + using GetGeneratedInvoiceForOrderResult = Result< + const client_library::GetGeneratedInvoiceForOrderForm*, + client_library::GetGeneratedInvoiceForOrderFormResponse*>; + + std::future<GetGeneratedInvoiceForOrderResult> GetGeneratedInvoiceForOrder( + const client_library::GetGeneratedInvoiceForOrderForm* req, + client_library::GetGeneratedInvoiceForOrderFormResponse* resp + ); + + using GetOrderResult = Result< + const client_library::GetOrderForm*, + client_library::GetOrderFormResponse*>; + + std::future<GetOrderResult> GetOrder( + const client_library::GetOrderForm* req, + client_library::GetOrderFormResponse* resp + ); + + using InitializeCardPaymentResult = Result< + const client_library::InitializeCardPaymentForm*, + client_library::InitializeCardPaymentFormResponse*>; + + std::future<InitializeCardPaymentResult> InitializeCardPayment( + const client_library::InitializeCardPaymentForm* req, + client_library::InitializeCardPaymentFormResponse* resp + ); + + using ListOrdersResult = Result< + const client_library::ListOrdersForm*, + client_library::ListOrdersFormResponse*>; + + std::future<ListOrdersResult> ListOrders( + const client_library::ListOrdersForm* req, + client_library::ListOrdersFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_ORDERS_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/passport_service.cc b/cpp/src/vereign/service/gen/passport_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..c7ce9072744c3f31cca6f62e1ff666c5ef148961 --- /dev/null +++ b/cpp/src/vereign/service/gen/passport_service.cc @@ -0,0 +1,227 @@ +#include <vereign/service/gen/passport_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string attachFunctionPath = "attachFunction"; + const std::string callFunctionPath = "callFunction"; + const std::string generateDIDsPath = "generateDIDs"; + const std::string getAvatarByPassportPath = "getAvatarByPassport"; + const std::string getDIDsPath = "getDIDs"; + const std::string getEmailWithHeaderByPassportPath = "getEmailWithHeaderByPassport"; + const std::string getInteractionsPath = "getInteractions"; + const std::string getVCardImagePath = "getVCardImage"; + const std::string getVCardTemplatePath = "getVCardTemplate"; + const std::string linkClaimPath = "linkClaim"; + const std::string listFunctionsPath = "listFunctions"; + const std::string listPassportsPath = "listPassports"; + const std::string listPassportsForSharedIdentityPath = "listPassportsForSharedIdentity"; + const std::string listSharedIdentitiesWithUserPath = "listSharedIdentitiesWithUser"; + const std::string setVCardImagePath = "setVCardImage"; + const std::string storeDIDsPath = "storeDIDs"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string PassportService::ServicePath = "/passport/"; + +PassportService::PassportService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<PassportService::AttachFunctionResult> +PassportService::AttachFunction( + const client_library::AttachFunctionToPassportClaimForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + attachFunctionPath, + req, + resp + ); +} + +std::future<PassportService::CallFunctionResult> +PassportService::CallFunction( + const client_library::CallFunctionForm* req, + client_library::CallFunctionFormResponse* resp +) { + return client_session_.Post( + ServicePath + callFunctionPath, + req, + resp + ); +} + +std::future<PassportService::GenerateDIDsResult> +PassportService::GenerateDIDs( + const client_library::GenerateDIDsForm* req, + client_library::GenerateDIDsFormResponse* resp +) { + return client_session_.Post( + ServicePath + generateDIDsPath, + req, + resp + ); +} + +std::future<PassportService::GetAvatarByPassportResult> +PassportService::GetAvatarByPassport( + const client_library::GetAvatarByPassportForm* req, + client_library::GetAvatarByPassportFormResponse* resp +) { + return client_session_.Post( + ServicePath + getAvatarByPassportPath, + req, + resp + ); +} + +std::future<PassportService::GetDIDsResult> +PassportService::GetDIDs( + const client_library::GetDIDsForm* req, + client_library::GetDIDsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getDIDsPath, + req, + resp + ); +} + +std::future<PassportService::GetEmailWithHeaderByPassportResult> +PassportService::GetEmailWithHeaderByPassport( + const client_library::GetEmailWithHeaderByPassportForm* req, + client_library::GetEmailWithHeaderByPassportFormResponse* resp +) { + return client_session_.Post( + ServicePath + getEmailWithHeaderByPassportPath, + req, + resp + ); +} + +std::future<PassportService::GetInteractionsResult> +PassportService::GetInteractions( + const client_library::GetInteractionsForm* req, + client_library::GetInteractionsFormResponse* resp +) { + return client_session_.Post( + ServicePath + getInteractionsPath, + req, + resp + ); +} + +std::future<PassportService::GetVCardImageResult> +PassportService::GetVCardImage( + const client_library::GetVCardImageForm* req, + client_library::GetVCardImageFormResponse* resp +) { + return client_session_.Post( + ServicePath + getVCardImagePath, + req, + resp + ); +} + +std::future<PassportService::GetVCardTemplateResult> +PassportService::GetVCardTemplate( + const client_library::GetVCardTemplateForm* req, + client_library::GetVCardTemplateFormResponse* resp +) { + return client_session_.Post( + ServicePath + getVCardTemplatePath, + req, + resp + ); +} + +std::future<PassportService::LinkClaimResult> +PassportService::LinkClaim( + const client_library::LinkClaimToPassportForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + linkClaimPath, + req, + resp + ); +} + +std::future<PassportService::ListFunctionsResult> +PassportService::ListFunctions( + const client_library::EmptyRequest* req, + client_library::ListFunctionsResponse* resp +) { + return client_session_.Post( + ServicePath + listFunctionsPath, + req, + resp + ); +} + +std::future<PassportService::ListPassportsResult> +PassportService::ListPassports( + const client_library::ListPassportsForm* req, + client_library::ListPassportsFormResponse* resp +) { + return client_session_.Post( + ServicePath + listPassportsPath, + req, + resp + ); +} + +std::future<PassportService::ListPassportsForSharedIdentityResult> +PassportService::ListPassportsForSharedIdentity( + const client_library::ListPassportsForSharedIdentityForm* req, + client_library::ListPassportsForSharedIdentityFormResponse* resp +) { + return client_session_.Post( + ServicePath + listPassportsForSharedIdentityPath, + req, + resp + ); +} + +std::future<PassportService::ListSharedIdentitiesWithUserResult> +PassportService::ListSharedIdentitiesWithUser( + const client_library::ListSharedIdentitiesWithUserForm* req, + client_library::ListSharedIdentitiesWithUserFormResponse* resp +) { + return client_session_.Post( + ServicePath + listSharedIdentitiesWithUserPath, + req, + resp + ); +} + +std::future<PassportService::SetVCardImageResult> +PassportService::SetVCardImage( + const client_library::SetVCardImageForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + setVCardImagePath, + req, + resp + ); +} + +std::future<PassportService::StoreDIDsResult> +PassportService::StoreDIDs( + const client_library::StoreDIDsForm* req, + client_library::StoreDIDsFormResponse* resp +) { + return client_session_.Post( + ServicePath + storeDIDsPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/passport_service.hh b/cpp/src/vereign/service/gen/passport_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..d9841ab9bad016bc8518836500a47207d4ef31ea --- /dev/null +++ b/cpp/src/vereign/service/gen/passport_service.hh @@ -0,0 +1,183 @@ +#ifndef __VEREIGN_SERVICE_GEN_PASSPORT_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_PASSPORT_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class PassportService { +public: + static const std::string ServicePath; + + explicit PassportService(restapi::ClientSession& client_session); + + PassportService(const PassportService&) = delete; + PassportService& operator=(const PassportService&) = delete; + + using AttachFunctionResult = Result< + const client_library::AttachFunctionToPassportClaimForm*, + client_library::EmptyResponse*>; + + std::future<AttachFunctionResult> AttachFunction( + const client_library::AttachFunctionToPassportClaimForm* req, + client_library::EmptyResponse* resp + ); + + using CallFunctionResult = Result< + const client_library::CallFunctionForm*, + client_library::CallFunctionFormResponse*>; + + std::future<CallFunctionResult> CallFunction( + const client_library::CallFunctionForm* req, + client_library::CallFunctionFormResponse* resp + ); + + using GenerateDIDsResult = Result< + const client_library::GenerateDIDsForm*, + client_library::GenerateDIDsFormResponse*>; + + std::future<GenerateDIDsResult> GenerateDIDs( + const client_library::GenerateDIDsForm* req, + client_library::GenerateDIDsFormResponse* resp + ); + + using GetAvatarByPassportResult = Result< + const client_library::GetAvatarByPassportForm*, + client_library::GetAvatarByPassportFormResponse*>; + + std::future<GetAvatarByPassportResult> GetAvatarByPassport( + const client_library::GetAvatarByPassportForm* req, + client_library::GetAvatarByPassportFormResponse* resp + ); + + using GetDIDsResult = Result< + const client_library::GetDIDsForm*, + client_library::GetDIDsFormResponse*>; + + std::future<GetDIDsResult> GetDIDs( + const client_library::GetDIDsForm* req, + client_library::GetDIDsFormResponse* resp + ); + + using GetEmailWithHeaderByPassportResult = Result< + const client_library::GetEmailWithHeaderByPassportForm*, + client_library::GetEmailWithHeaderByPassportFormResponse*>; + + std::future<GetEmailWithHeaderByPassportResult> GetEmailWithHeaderByPassport( + const client_library::GetEmailWithHeaderByPassportForm* req, + client_library::GetEmailWithHeaderByPassportFormResponse* resp + ); + + using GetInteractionsResult = Result< + const client_library::GetInteractionsForm*, + client_library::GetInteractionsFormResponse*>; + + std::future<GetInteractionsResult> GetInteractions( + const client_library::GetInteractionsForm* req, + client_library::GetInteractionsFormResponse* resp + ); + + using GetVCardImageResult = Result< + const client_library::GetVCardImageForm*, + client_library::GetVCardImageFormResponse*>; + + std::future<GetVCardImageResult> GetVCardImage( + const client_library::GetVCardImageForm* req, + client_library::GetVCardImageFormResponse* resp + ); + + using GetVCardTemplateResult = Result< + const client_library::GetVCardTemplateForm*, + client_library::GetVCardTemplateFormResponse*>; + + std::future<GetVCardTemplateResult> GetVCardTemplate( + const client_library::GetVCardTemplateForm* req, + client_library::GetVCardTemplateFormResponse* resp + ); + + using LinkClaimResult = Result< + const client_library::LinkClaimToPassportForm*, + client_library::EmptyResponse*>; + + std::future<LinkClaimResult> LinkClaim( + const client_library::LinkClaimToPassportForm* req, + client_library::EmptyResponse* resp + ); + + using ListFunctionsResult = Result< + const client_library::EmptyRequest*, + client_library::ListFunctionsResponse*>; + + std::future<ListFunctionsResult> ListFunctions( + const client_library::EmptyRequest* req, + client_library::ListFunctionsResponse* resp + ); + + using ListPassportsResult = Result< + const client_library::ListPassportsForm*, + client_library::ListPassportsFormResponse*>; + + std::future<ListPassportsResult> ListPassports( + const client_library::ListPassportsForm* req, + client_library::ListPassportsFormResponse* resp + ); + + using ListPassportsForSharedIdentityResult = Result< + const client_library::ListPassportsForSharedIdentityForm*, + client_library::ListPassportsForSharedIdentityFormResponse*>; + + std::future<ListPassportsForSharedIdentityResult> ListPassportsForSharedIdentity( + const client_library::ListPassportsForSharedIdentityForm* req, + client_library::ListPassportsForSharedIdentityFormResponse* resp + ); + + using ListSharedIdentitiesWithUserResult = Result< + const client_library::ListSharedIdentitiesWithUserForm*, + client_library::ListSharedIdentitiesWithUserFormResponse*>; + + std::future<ListSharedIdentitiesWithUserResult> ListSharedIdentitiesWithUser( + const client_library::ListSharedIdentitiesWithUserForm* req, + client_library::ListSharedIdentitiesWithUserFormResponse* resp + ); + + using SetVCardImageResult = Result< + const client_library::SetVCardImageForm*, + client_library::EmptyResponse*>; + + std::future<SetVCardImageResult> SetVCardImage( + const client_library::SetVCardImageForm* req, + client_library::EmptyResponse* resp + ); + + using StoreDIDsResult = Result< + const client_library::StoreDIDsForm*, + client_library::StoreDIDsFormResponse*>; + + std::future<StoreDIDsResult> StoreDIDs( + const client_library::StoreDIDsForm* req, + client_library::StoreDIDsFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_PASSPORT_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/reporting_service.cc b/cpp/src/vereign/service/gen/reporting_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..07d87843e9bdd5ca366543b111967c6fd9c3954f --- /dev/null +++ b/cpp/src/vereign/service/gen/reporting_service.cc @@ -0,0 +1,45 @@ +#include <vereign/service/gen/reporting_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string getbillingdataforperiodPath = "getbillingdataforperiod"; + const std::string getreporttotaldataPath = "getreporttotaldata"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string ReportingService::ServicePath = "/reporting/"; + +ReportingService::ReportingService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<ReportingService::GetbillingdataforperiodResult> +ReportingService::Getbillingdataforperiod( + const client_library::GetBillingDataForPeriodForm* req, + client_library::GetBillingDataForPeriodFormResponse* resp +) { + return client_session_.Post( + ServicePath + getbillingdataforperiodPath, + req, + resp + ); +} + +std::future<ReportingService::GetreporttotaldataResult> +ReportingService::Getreporttotaldata( + const client_library::GetReportTotalDataForm* req, + client_library::GetReportTotalDataFormResponse* resp +) { + return client_session_.Post( + ServicePath + getreporttotaldataPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/reporting_service.hh b/cpp/src/vereign/service/gen/reporting_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..3781e78ed8a3020422b619ccf36e0e891b17be79 --- /dev/null +++ b/cpp/src/vereign/service/gen/reporting_service.hh @@ -0,0 +1,57 @@ +#ifndef __VEREIGN_SERVICE_GEN_REPORTING_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_REPORTING_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class ReportingService { +public: + static const std::string ServicePath; + + explicit ReportingService(restapi::ClientSession& client_session); + + ReportingService(const ReportingService&) = delete; + ReportingService& operator=(const ReportingService&) = delete; + + using GetbillingdataforperiodResult = Result< + const client_library::GetBillingDataForPeriodForm*, + client_library::GetBillingDataForPeriodFormResponse*>; + + std::future<GetbillingdataforperiodResult> Getbillingdataforperiod( + const client_library::GetBillingDataForPeriodForm* req, + client_library::GetBillingDataForPeriodFormResponse* resp + ); + + using GetreporttotaldataResult = Result< + const client_library::GetReportTotalDataForm*, + client_library::GetReportTotalDataFormResponse*>; + + std::future<GetreporttotaldataResult> Getreporttotaldata( + const client_library::GetReportTotalDataForm* req, + client_library::GetReportTotalDataFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_REPORTING_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/resource_service.cc b/cpp/src/vereign/service/gen/resource_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..317105dd543a5673d60ec660500efa5f4810d470 --- /dev/null +++ b/cpp/src/vereign/service/gen/resource_service.cc @@ -0,0 +1,45 @@ +#include <vereign/service/gen/resource_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string deleteResourceByTokenPath = "deleteResourceByToken"; + const std::string storeResourcePath = "storeResource"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string ResourceService::ServicePath = "/resource/"; + +ResourceService::ResourceService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<ResourceService::DeleteResourceByTokenResult> +ResourceService::DeleteResourceByToken( + const client_library::DeleteResourceForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + deleteResourceByTokenPath, + req, + resp + ); +} + +std::future<ResourceService::StoreResourceResult> +ResourceService::StoreResource( + const client_library::StoreResourceForm* req, + client_library::StoreResourceFormResponse* resp +) { + return client_session_.Post( + ServicePath + storeResourcePath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/resource_service.hh b/cpp/src/vereign/service/gen/resource_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..bed33a2a6b06cc75bea3d81c771bcae4e2186c06 --- /dev/null +++ b/cpp/src/vereign/service/gen/resource_service.hh @@ -0,0 +1,57 @@ +#ifndef __VEREIGN_SERVICE_GEN_RESOURCE_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_RESOURCE_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class ResourceService { +public: + static const std::string ServicePath; + + explicit ResourceService(restapi::ClientSession& client_session); + + ResourceService(const ResourceService&) = delete; + ResourceService& operator=(const ResourceService&) = delete; + + using DeleteResourceByTokenResult = Result< + const client_library::DeleteResourceForm*, + client_library::EmptyResponse*>; + + std::future<DeleteResourceByTokenResult> DeleteResourceByToken( + const client_library::DeleteResourceForm* req, + client_library::EmptyResponse* resp + ); + + using StoreResourceResult = Result< + const client_library::StoreResourceForm*, + client_library::StoreResourceFormResponse*>; + + std::future<StoreResourceResult> StoreResource( + const client_library::StoreResourceForm* req, + client_library::StoreResourceFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_RESOURCE_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/sharing_service.cc b/cpp/src/vereign/service/gen/sharing_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..f30874b189390589bea73a887b3c1629e47391b2 --- /dev/null +++ b/cpp/src/vereign/service/gen/sharing_service.cc @@ -0,0 +1,97 @@ +#include <vereign/service/gen/sharing_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string acceptSharingRequestMovePassportPath = "acceptSharingRequestMovePassport"; + const std::string acceptSharingRequestPersistPassportPath = "acceptSharingRequestPersistPassport"; + const std::string listPendingSharingRequestsPath = "listPendingSharingRequests"; + const std::string listRejectedSharingRequestsPath = "listRejectedSharingRequests"; + const std::string rejectSharingRequestPath = "rejectSharingRequest"; + const std::string sendShareDocumentRequestPath = "sendShareDocumentRequest"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string SharingService::ServicePath = "/sharing/"; + +SharingService::SharingService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<SharingService::AcceptSharingRequestMovePassportResult> +SharingService::AcceptSharingRequestMovePassport( + const client_library::AcceptSharingRequestMovePassportForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + acceptSharingRequestMovePassportPath, + req, + resp + ); +} + +std::future<SharingService::AcceptSharingRequestPersistPassportResult> +SharingService::AcceptSharingRequestPersistPassport( + const client_library::AcceptSharingRequestPersistPassportForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + acceptSharingRequestPersistPassportPath, + req, + resp + ); +} + +std::future<SharingService::ListPendingSharingRequestsResult> +SharingService::ListPendingSharingRequests( + const client_library::ListPendingSharingRequestsForm* req, + client_library::ListPendingSharingRequestsFormResponse* resp +) { + return client_session_.Post( + ServicePath + listPendingSharingRequestsPath, + req, + resp + ); +} + +std::future<SharingService::ListRejectedSharingRequestsResult> +SharingService::ListRejectedSharingRequests( + const client_library::ListRejectedSharingRequestsForm* req, + client_library::ListRejectedSharingRequestsFormResponse* resp +) { + return client_session_.Post( + ServicePath + listRejectedSharingRequestsPath, + req, + resp + ); +} + +std::future<SharingService::RejectSharingRequestResult> +SharingService::RejectSharingRequest( + const client_library::RejectSharingRequestForm* req, + client_library::EmptyResponse* resp +) { + return client_session_.Post( + ServicePath + rejectSharingRequestPath, + req, + resp + ); +} + +std::future<SharingService::SendShareDocumentRequestResult> +SharingService::SendShareDocumentRequest( + const client_library::SendShareDocumentRequestForm* req, + client_library::SendShareDocumentRequestFormResponse* resp +) { + return client_session_.Post( + ServicePath + sendShareDocumentRequestPath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/sharing_service.hh b/cpp/src/vereign/service/gen/sharing_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..0edb2914e76b474f50584b02355e583e2a8caa10 --- /dev/null +++ b/cpp/src/vereign/service/gen/sharing_service.hh @@ -0,0 +1,93 @@ +#ifndef __VEREIGN_SERVICE_GEN_SHARING_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_SHARING_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class SharingService { +public: + static const std::string ServicePath; + + explicit SharingService(restapi::ClientSession& client_session); + + SharingService(const SharingService&) = delete; + SharingService& operator=(const SharingService&) = delete; + + using AcceptSharingRequestMovePassportResult = Result< + const client_library::AcceptSharingRequestMovePassportForm*, + client_library::EmptyResponse*>; + + std::future<AcceptSharingRequestMovePassportResult> AcceptSharingRequestMovePassport( + const client_library::AcceptSharingRequestMovePassportForm* req, + client_library::EmptyResponse* resp + ); + + using AcceptSharingRequestPersistPassportResult = Result< + const client_library::AcceptSharingRequestPersistPassportForm*, + client_library::EmptyResponse*>; + + std::future<AcceptSharingRequestPersistPassportResult> AcceptSharingRequestPersistPassport( + const client_library::AcceptSharingRequestPersistPassportForm* req, + client_library::EmptyResponse* resp + ); + + using ListPendingSharingRequestsResult = Result< + const client_library::ListPendingSharingRequestsForm*, + client_library::ListPendingSharingRequestsFormResponse*>; + + std::future<ListPendingSharingRequestsResult> ListPendingSharingRequests( + const client_library::ListPendingSharingRequestsForm* req, + client_library::ListPendingSharingRequestsFormResponse* resp + ); + + using ListRejectedSharingRequestsResult = Result< + const client_library::ListRejectedSharingRequestsForm*, + client_library::ListRejectedSharingRequestsFormResponse*>; + + std::future<ListRejectedSharingRequestsResult> ListRejectedSharingRequests( + const client_library::ListRejectedSharingRequestsForm* req, + client_library::ListRejectedSharingRequestsFormResponse* resp + ); + + using RejectSharingRequestResult = Result< + const client_library::RejectSharingRequestForm*, + client_library::EmptyResponse*>; + + std::future<RejectSharingRequestResult> RejectSharingRequest( + const client_library::RejectSharingRequestForm* req, + client_library::EmptyResponse* resp + ); + + using SendShareDocumentRequestResult = Result< + const client_library::SendShareDocumentRequestForm*, + client_library::SendShareDocumentRequestFormResponse*>; + + std::future<SendShareDocumentRequestResult> SendShareDocumentRequest( + const client_library::SendShareDocumentRequestForm* req, + client_library::SendShareDocumentRequestFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_SHARING_SERVICE_HH diff --git a/cpp/src/vereign/service/gen/sign_service.cc b/cpp/src/vereign/service/gen/sign_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..cb6a099da6d61fb98f250c0f1d31beba0199683f --- /dev/null +++ b/cpp/src/vereign/service/gen/sign_service.cc @@ -0,0 +1,97 @@ +#include <vereign/service/gen/sign_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { + const std::string generateCmsForChainPath = "generateCmsForChain"; + const std::string generateCmsForPassportPath = "generateCmsForPassport"; + const std::string resignEmailPath = "resignEmail"; + const std::string retrieveRootCertificatePath = "retrieveRootCertificate"; + const std::string signVCardForChainPath = "signVCardForChain"; + const std::string validateVMimePath = "validateVMime"; +} + +namespace vereign { +namespace service { +namespace gen { + +const std::string SignService::ServicePath = "/sign/"; + +SignService::SignService(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +std::future<SignService::GenerateCmsForChainResult> +SignService::GenerateCmsForChain( + const client_library::GenerateCmsForChainForm* req, + client_library::GenerateCmsForChainFormResponse* resp +) { + return client_session_.Post( + ServicePath + generateCmsForChainPath, + req, + resp + ); +} + +std::future<SignService::GenerateCmsForPassportResult> +SignService::GenerateCmsForPassport( + const client_library::GenerateCmsForPassportForm* req, + client_library::GenerateCmsForPassportFormResponse* resp +) { + return client_session_.Post( + ServicePath + generateCmsForPassportPath, + req, + resp + ); +} + +std::future<SignService::ResignEmailResult> +SignService::ResignEmail( + const client_library::ResignSMIMEForm* req, + client_library::ResignSMIMEFormResponse* resp +) { + return client_session_.Post( + ServicePath + resignEmailPath, + req, + resp + ); +} + +std::future<SignService::RetrieveRootCertificateResult> +SignService::RetrieveRootCertificate( + const client_library::RetrieveRootCertificateForm* req, + client_library::RetrieveRootCertificateFormResponse* resp +) { + return client_session_.Post( + ServicePath + retrieveRootCertificatePath, + req, + resp + ); +} + +std::future<SignService::SignVCardForChainResult> +SignService::SignVCardForChain( + const client_library::SignVCardForChainForm* req, + client_library::SignVCardForChainFormResponse* resp +) { + return client_session_.Post( + ServicePath + signVCardForChainPath, + req, + resp + ); +} + +std::future<SignService::ValidateVMimeResult> +SignService::ValidateVMime( + const client_library::ValidateVMimeForm* req, + client_library::ValidateVMimeFormResponse* resp +) { + return client_session_.Post( + ServicePath + validateVMimePath, + req, + resp + ); +} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/src/vereign/service/gen/sign_service.hh b/cpp/src/vereign/service/gen/sign_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..bb0f81ac5cc985fad54d4e3959ee2844965f7c96 --- /dev/null +++ b/cpp/src/vereign/service/gen/sign_service.hh @@ -0,0 +1,93 @@ +#ifndef __VEREIGN_SERVICE_GEN_SIGN_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_SIGN_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class SignService { +public: + static const std::string ServicePath; + + explicit SignService(restapi::ClientSession& client_session); + + SignService(const SignService&) = delete; + SignService& operator=(const SignService&) = delete; + + using GenerateCmsForChainResult = Result< + const client_library::GenerateCmsForChainForm*, + client_library::GenerateCmsForChainFormResponse*>; + + std::future<GenerateCmsForChainResult> GenerateCmsForChain( + const client_library::GenerateCmsForChainForm* req, + client_library::GenerateCmsForChainFormResponse* resp + ); + + using GenerateCmsForPassportResult = Result< + const client_library::GenerateCmsForPassportForm*, + client_library::GenerateCmsForPassportFormResponse*>; + + std::future<GenerateCmsForPassportResult> GenerateCmsForPassport( + const client_library::GenerateCmsForPassportForm* req, + client_library::GenerateCmsForPassportFormResponse* resp + ); + + using ResignEmailResult = Result< + const client_library::ResignSMIMEForm*, + client_library::ResignSMIMEFormResponse*>; + + std::future<ResignEmailResult> ResignEmail( + const client_library::ResignSMIMEForm* req, + client_library::ResignSMIMEFormResponse* resp + ); + + using RetrieveRootCertificateResult = Result< + const client_library::RetrieveRootCertificateForm*, + client_library::RetrieveRootCertificateFormResponse*>; + + std::future<RetrieveRootCertificateResult> RetrieveRootCertificate( + const client_library::RetrieveRootCertificateForm* req, + client_library::RetrieveRootCertificateFormResponse* resp + ); + + using SignVCardForChainResult = Result< + const client_library::SignVCardForChainForm*, + client_library::SignVCardForChainFormResponse*>; + + std::future<SignVCardForChainResult> SignVCardForChain( + const client_library::SignVCardForChainForm* req, + client_library::SignVCardForChainFormResponse* resp + ); + + using ValidateVMimeResult = Result< + const client_library::ValidateVMimeForm*, + client_library::ValidateVMimeFormResponse*>; + + std::future<ValidateVMimeResult> ValidateVMime( + const client_library::ValidateVMimeForm* req, + client_library::ValidateVMimeFormResponse* resp + ); + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_SIGN_SERVICE_HH diff --git a/cpp/src/vereign/service/identity_service.cc b/cpp/src/vereign/service/identity_service.cc new file mode 100644 index 0000000000000000000000000000000000000000..fe39c2be506f67faa36dff971006e9780f35a641 --- /dev/null +++ b/cpp/src/vereign/service/identity_service.cc @@ -0,0 +1,66 @@ +#include <vereign/service/identity_service.hh> + +#include <vereign/service/gen/identity_service.hh> +#include <vereign/client_library/common_types.pb.h> +#include <vereign/restapi/http_header.hh> +#include <vereign/restapi/client_session.hh> +#include <vereign/encoding/base64.hh> + +#include <memory> + +namespace { + const std::string loginWithPreviouslyAddedDevicePath = "loginWithPreviouslyAddedDevice"; + const std::string loginWithNewDevicePath = "loginWithNewDevice"; +} + +namespace vereign::service { + +IdentityService::IdentityService( + restapi::ClientSession& client_session, + identity::Provider& identity_provider +) + : gen::IdentityService{client_session}, + client_session_{client_session}, + identity_provider_{identity_provider} +{} + +void IdentityService::LoginWithExistingPubKey( + const client_library::LoginWithExistingPubKeyForm* req, + client_library::EmptyResponse* resp +) { + client_session_.Authenticate(req->pubkey(), resp); +} + +void IdentityService::LoginWithNewDevice( + const client_library::LoginFormNewDevice* req, + client_library::LoginFormNewDeviceResponse* resp +) { + auto public_key = identity_provider_.RecreateIdentity(req->pin()); + + auto result = client_session_.GetClient().Post( + client_session_.BasePath() + gen::IdentityService::ServicePath + loginWithNewDevicePath, + std::make_unique<client_library::EmptyRequest>(), + resp, + std::vector<vereign::restapi::HttpHeader>{ + {"publicKey", public_key}, + {"deviceHash", identity_provider_.GetDeviceHash()} + } + ); + + result.wait(); + + if (resp->code() == "200") { + client_session_.SetPubKey(public_key); + } +} + + +void IdentityService::LoginWithPreviouslyAddedDevice( + const client_library::LoginFormPreviousAddedDevice* req, + client_library::EmptyResponse* resp +) { + auto public_key = identity_provider_.LoadIdentity(req->pin()); + client_session_.Authenticate(public_key, resp); +} + +} // namespace vereign diff --git a/cpp/src/vereign/service/identity_service.hh b/cpp/src/vereign/service/identity_service.hh new file mode 100644 index 0000000000000000000000000000000000000000..11de3e0f5318535d3d7307d126aa19d590141ea6 --- /dev/null +++ b/cpp/src/vereign/service/identity_service.hh @@ -0,0 +1,107 @@ +#ifndef __VEREIGN_SERVICE_IDENITY_SERVICE_HH +#define __VEREIGN_SERVICE_IDENITY_SERVICE_HH + +#include <vereign/identity/provider.hh> +#include <vereign/client_library/common_types.pb.h> +#include <vereign/client_library/identity_types.pb.h> +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/restapi/post_result.hh> +#include <vereign/service/gen/identity_service.hh> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +class IdentityService : public gen::IdentityService { +public: + /** + * Creates IdentityService instance. + * + * @param client_session HTTP client used for communicating with the Vereign Restful API. + * @param identity_provider Local identity provider (manager). + */ + IdentityService( + restapi::ClientSession& client_session, + identity::Provider& identity_provider + ); + + // disable copying + IdentityService(const IdentityService&) = delete; + auto operator=(const IdentityService&) -> IdentityService& = delete; + + /** + * Login with existing identity public key. + * + * This API is for test purposes only. It is not exposed under the gRPC API, and thus is not + * accessible by the integrators. + * + * **WARN: do not use this in production code** + */ + void LoginWithExistingPubKey( + const client_library::LoginWithExistingPubKeyForm* req, + client_library::EmptyResponse* resp + ); + + /** + * Registers a new device. + * + * req.pin is required only under Linux. + * + * Under windows the system cypto storage is used. + * When the device is registered a master key is created and the user will be asked for his + * consent by showing a dialog window. + * + * @param req Login request. + * @param resp Operation response. + * + * @throws kvstore::InvalidPinCodeError Only under Linux. Thrown when the provided pin is invalid, + * currently that is when the pin is empty. + */ + void LoginWithNewDevice( + const client_library::LoginFormNewDevice* req, + client_library::LoginFormNewDeviceResponse* resp + ); + + /** + * Login with already registered device. + * + * req.pin is required only under Linux. + * + * Under windows the system cypto storage is used. + * When the device is registered a master key is created and the user will be asked for his + * consent by showing a dialog window. + * + * @param req Login request. + * @param resp Operation response. + * + * @throws kvstore::StorageNotInitializedError when the crypto storage is empty, meaning that + * the device is not registered. + * @throws kvstore::InvalidPinCodeError under Linux, when the provided pin is invalid, meaning + * that the pin does not match the pin used during the registration. + * @throws kvstore::InvalidIdentityError under windows, when for some reason the RSA master key + * has been changed. + */ + void LoginWithPreviouslyAddedDevice( + const client_library::LoginFormPreviousAddedDevice* req, + client_library::EmptyResponse* resp + ); + +private: + restapi::ClientSession& client_session_; + identity::Provider& identity_provider_; +}; + +} // namespace service +} // namespace vereign + + +#endif // __VEREIGN_SERVICE_IDENITY_SERVICE_HH diff --git a/cpp/src/vereign/sqlite/connection.cc b/cpp/src/vereign/sqlite/connection.cc new file mode 100644 index 0000000000000000000000000000000000000000..eefe6a7de2ff004c777f88deb81eb3cee64f9271 --- /dev/null +++ b/cpp/src/vereign/sqlite/connection.cc @@ -0,0 +1,75 @@ +#include <vereign/sqlite/connection.hh> + +#include <vereign/sqlite/errors.hh> +#include <vereign/core/scope_guard.hh> + +#include <fmt/format.h> +#include <sqlite3.h> +#include <iostream> + +namespace vereign::sqlite { + +Connection::Connection(const std::string& path) + : db_{nullptr} +{ + auto rc = sqlite3_open(path.data(), &db_); + if (rc != SQLITE_OK) { + throw Error{rc, fmt::format("open db failed, err: {}", sqlite3_errmsg(db_))}; + } +} + +Connection::~Connection() noexcept { + sqlite3_close(db_); +} + +void Connection::BeginExplicitTransaction() { + char* errMsg = nullptr; + auto freeErr = vereign::core::MakeScopeGuard([&errMsg]{ sqlite3_free(errMsg); }); + auto rc = sqlite3_exec(db_, "BEGIN EXCLUSIVE", nullptr, nullptr, &errMsg); + if (rc != SQLITE_OK) { + throw Error(rc, fmt::format("starting transaction failed, err: {}", errMsg)); + } +} + +void Connection::Commit() { + char* errMsg = nullptr; + auto freeErr = vereign::core::MakeScopeGuard([&errMsg]{ sqlite3_free(errMsg); }); + + auto rc = sqlite3_exec(db_, "COMMIT", nullptr, nullptr, &errMsg); + if (rc != SQLITE_OK) { + throw Error(rc, fmt::format("commit transaction failed, err: {}", errMsg)); + } +} + +void Connection::Rollback() { + char* errMsg = nullptr; + auto freeErr = vereign::core::MakeScopeGuard([&errMsg]{ sqlite3_free(errMsg); }); + + auto rc = sqlite3_exec(db_, "ROLLBACK", nullptr, nullptr, &errMsg); + if (rc != SQLITE_OK) { + throw Error(rc, fmt::format("rollback transaction failed, err: {}", errMsg)); + } +} + +void Connection::Execute(const std::string& sql) { + char* errMsg = nullptr; + auto freeErr = vereign::core::MakeScopeGuard([&errMsg]{ sqlite3_free(errMsg); }); + + auto rc = sqlite3_exec(db_, sql.data(), nullptr, nullptr, &errMsg); + if (rc != SQLITE_OK) { + throw Error(rc, fmt::format("query execution failed, err: {}", errMsg)); + } +} + +auto Connection::Prepare(const std::string& sql) -> Statement { + sqlite3_stmt *stmt = nullptr; + + auto rc = sqlite3_prepare_v2(db_, sql.data(), -1, &stmt, nullptr); + if (rc != SQLITE_OK) { + throw Error(rc, fmt::format("preparing statement failed, err: {}", sqlite3_errmsg(db_))); + } + + return Statement{db_, stmt}; +} + +} // namespace vereign::sqlite diff --git a/cpp/src/vereign/sqlite/connection.hh b/cpp/src/vereign/sqlite/connection.hh new file mode 100644 index 0000000000000000000000000000000000000000..d1134045dc4c2434ff20ad5b2841e58a51c5c253 --- /dev/null +++ b/cpp/src/vereign/sqlite/connection.hh @@ -0,0 +1,32 @@ +#ifndef __VEREIGN_SQLITE_CONNECTION_HH +#define __VEREIGN_SQLITE_CONNECTION_HH + +#include <vereign/sqlite/statement.hh> + +struct sqlite3; +struct sqlite3_stmt; + +namespace vereign::sqlite { + +class Connection { +public: + Connection(const std::string& path); + ~Connection() noexcept; + + Connection(const Connection&) = delete; + auto operator=(const Connection&) -> Connection& = delete; + + void BeginExplicitTransaction(); + void Commit(); + void Rollback(); + + void Execute(const std::string& sql); + auto Prepare(const std::string& sql) -> Statement; + +private: + sqlite3* db_; +}; + +} // namespace vereign::sqlite + +#endif // __VEREIGN_SQLITE_CONNECTION_HH diff --git a/cpp/src/vereign/sqlite/errors.hh b/cpp/src/vereign/sqlite/errors.hh new file mode 100644 index 0000000000000000000000000000000000000000..00622311b42921a41500d7d7b3cc1f5b0e54f9a2 --- /dev/null +++ b/cpp/src/vereign/sqlite/errors.hh @@ -0,0 +1,26 @@ +#ifndef __VEREIGN_SQLITE_ERROR_HH +#define __VEREIGN_SQLITE_ERROR_HH + +#include <stdexcept> + +namespace vereign::sqlite { + +class Error : public std::runtime_error { +public: + Error(int code, const std::string& msg) + : std::runtime_error(msg), + code_{code} + { + } + + auto code() const noexcept -> int { + return code_; + } + +private: + int code_; +}; + +} // namespace vereign::sqlite + +#endif // __VEREIGN_SQLITE_CONNECTION_HH diff --git a/cpp/src/vereign/sqlite/statement.cc b/cpp/src/vereign/sqlite/statement.cc new file mode 100644 index 0000000000000000000000000000000000000000..0a3d00795383e4498580c1a56265b1ce55d87918 --- /dev/null +++ b/cpp/src/vereign/sqlite/statement.cc @@ -0,0 +1,78 @@ +#include <vereign/sqlite/statement.hh> +#include <vereign/sqlite/errors.hh> + +#include <fmt/format.h> +#include <sqlite3.h> + +namespace vereign::sqlite { + +Statement::Statement(sqlite3* db, sqlite3_stmt* stmt) + : db_{db}, + stmt_{stmt} +{} + +void Statement::Finalize() { + sqlite3_finalize(stmt_); +} + +Statement::~Statement() { + sqlite3_finalize(stmt_); +} + +void Statement::BindBlob(int index, bytes::View blob) { + auto rc = sqlite3_bind_blob64(stmt_, index, blob.CharData(), blob.Size(), SQLITE_STATIC); + if (rc != SQLITE_OK) { + throw Error{rc, fmt::format("bind blob parameter failed, err: {}", sqlite3_errmsg(db_))}; + } +} + +void Statement::BindText(int index, const std::string& text) { + auto rc = sqlite3_bind_text(stmt_, index, text.data(), text.size(), SQLITE_STATIC); + if (rc != SQLITE_OK) { + throw Error{rc, fmt::format("bind text parameter failed, err: {}", sqlite3_errmsg(db_))}; + } +} + +auto Statement::Step() -> bool { + auto rc = sqlite3_step(stmt_); + switch (rc) { + case SQLITE_DONE: + return true; + case SQLITE_ROW: + return false; + default: + throw Error{rc, fmt::format("executing statement failed, err: {}", sqlite3_errmsg(db_))}; + } +} + +auto Statement::GetColumnBlob(int index) -> bytes::View { + auto size = sqlite3_column_bytes(stmt_, index); + auto blob = sqlite3_column_blob(stmt_, index); + + return bytes::View{blob, static_cast<size_t>(size)}; +} + +auto Statement::GetColumnText(int index) -> std::string_view { + std::size_t size = sqlite3_column_bytes(stmt_, index); + auto blob = sqlite3_column_text(stmt_, index); + + return std::string_view{reinterpret_cast<const char*>(blob), size}; +} + +void Statement::ResetAndClearBindings() { + auto rc = sqlite3_clear_bindings(stmt_); + if (rc != SQLITE_OK) { + throw Error{rc, fmt::format("statement reset bindings failed, err: {}", sqlite3_errmsg(db_))}; + } + + Reset(); +} + +void Statement::Reset() { + auto rc = sqlite3_reset(stmt_); + if (rc != SQLITE_OK) { + throw Error{rc, fmt::format("statement reset failed, err: {}", sqlite3_errmsg(db_))}; + } +} + +} // namespace vereign::sqlite diff --git a/cpp/src/vereign/sqlite/statement.hh b/cpp/src/vereign/sqlite/statement.hh new file mode 100644 index 0000000000000000000000000000000000000000..2b8c336d735a5ec33eb673dffa8df0ef87cce676 --- /dev/null +++ b/cpp/src/vereign/sqlite/statement.hh @@ -0,0 +1,42 @@ +#ifndef __VEREIGN_SQLITE_STATEMENT_HH +#define __VEREIGN_SQLITE_STATEMENT_HH + +#include <vereign/bytes/view.hh> +#include <vereign/bytes/bytes.hh> + +#include <string> + +struct sqlite3; +struct sqlite3_stmt; + +namespace vereign::sqlite { + +class Statement { +private: + friend class Connection; + + explicit Statement(sqlite3* db, sqlite3_stmt* stmt); + +public: + ~Statement(); + + void BindBlob(int index, bytes::View blob); + void BindText(int index, const std::string& text); + + auto Step() -> bool; + + auto GetColumnBlob(int index) -> bytes::View; + auto GetColumnText(int index) -> std::string_view; + + void Reset(); + void ResetAndClearBindings(); + void Finalize(); + +private: + sqlite3* db_; + sqlite3_stmt* stmt_; +}; + +} // namespace vereign::sqlite + +#endif // __VEREIGN_SQLITE_STATEMENT_HH diff --git a/cpp/src/vereign/sync/channel.hh b/cpp/src/vereign/sync/channel.hh new file mode 100644 index 0000000000000000000000000000000000000000..ff6ff439de10fa058ee1a80460cfc8feb1e69dd2 --- /dev/null +++ b/cpp/src/vereign/sync/channel.hh @@ -0,0 +1,354 @@ +#ifndef __VEREIGN_SYNC_CHANNEL_HH +#define __VEREIGN_SYNC_CHANNEL_HH + +#include <deque> +#include <condition_variable> +#include <boost/optional.hpp> +#include <iostream> + +namespace vereign { +namespace sync { + +/** + * ChannelAddResult is used as return value by Channel TryAdd methods. + * + * It provides information if the operation was successful, and what is the + * the current state of the channel - full, closed. + */ +class ChannelAddResult { +public: + /** + * Default constructor - the result is ok. + */ + ChannelAddResult(): closed_(false), full_(false) {} + /** + * Creates ChannelAddResult. + * + * @param closed The channel is closed. + * @param full The channel is full, and cannot accept more values. + */ + ChannelAddResult(bool closed, bool full) : closed_(closed), full_(full) {}; + + /** + * Checks if the add operation was successful. + * + * @returns true when the add operation was successful. + */ + bool IsOk() const noexcept { + return !closed_ && !full_; + } + + /** + * Returns the add operation result. + * + * @returns true when the add operation was successful. + */ + operator bool() const noexcept { + return IsOk(); + } + + /** + * Checks if the channel was closed. + * + * @returns true when the channel was closed. + */ + bool IsClosed() const noexcept { + return closed_; + } + + /** + * Checks if the channel was full. + * + * A full channel did not accept the value. + * + * @returns true when the channel was full. + */ + bool IsFull() const noexcept { + return full_; + } + +private: + bool closed_; + bool full_; +}; + +/** + * ChannelValue is the result returned by the Channel Get methods. + * + * It provides information if the Get operation was successful, and what is + * the current state of the channel - closed, empty. + * + * The ChannelValue wraps optional, so if for any reason retrieving a value + * was not successful, it won't actually contain a value, but only information + * about the channel state at the moment when the retrieval was attempted. + * + * @tparam T The channel value type. + */ +template <typename T> +class ChannelValue { +public: + using ValueType = T; + + ChannelValue(ValueType&& value, bool closed, bool empty) + : value_{std::move(value)}, + closed_{closed}, + empty_{empty} + {} + + ChannelValue(bool closed, bool empty) + : closed_{closed}, + empty_{empty} + {} + + // The Channel Value is only move constructible and move assignable. + ChannelValue(ChannelValue&&) = default; + ChannelValue& operator=(ChannelValue&&) = default; + ChannelValue(const ChannelValue&) = delete; + ChannelValue& operator=(const ChannelValue&) = delete; + + operator bool() const noexcept { + return HasValue(); + } + + bool HasValue() const noexcept { + return value_.has_value(); + } + + const ValueType& Value() const { + return value_.value(); + } + + ValueType& Value() { + return value_.value(); + } + + bool IsClosed() const noexcept { + return closed_; + } + + bool IsEmpty() const noexcept { + return empty_; + } + +private: + boost::optional<ValueType> value_; + bool closed_; + bool empty_; +}; + +/** + * Channel is a generic container for communication between threads. + * + * It provides multi producer, multi consumer semantics. + * With the blocking APIs the consumers block until there is something added + * to the channel, while the producers block if the channel is full (the channel + * size is greater or equal to the channel capacity). + * + * @tparam T Value type of the channel. + */ +template <typename T> +class Channel { +public: + using ValueType = T; + + static_assert( + std::is_nothrow_move_constructible<ValueType>::value, + "T type is required to be nothrow move constructible" + ); + + /** + * Creates a channel with a maximum allowed buffering. + * + * @param capacity + * The maximum allowed number of values that can be stored in the channel. + */ + explicit Channel(std::size_t capacity) + : closed_{false}, + capacity_{capacity} + { + } + + /** + * Moves the element value into the channel queue. + * + * If the channel is full up to its capacity, this call blocks until there is room, + * to push the value, or the channel is closed. + * + * @param value The value is moved into the new element. + * @returns false when the channel is closed, and the value could not be pushed. + */ + bool Add(ValueType&& value) { + std::unique_lock<std::mutex> lock(mu_); + writers_cv_.wait(lock, [this]() { + return queue_.size() < capacity_ || closed_; + }); + + if (closed_) { + return false; + } + + queue_.push_back(std::move(value)); + lock.unlock(); + + readers_cv_.notify_one(); + + return true; + } + + /** + * Adds a copy of the element value to the channel queue. + * + * If the channel is full up to its capacity, this call blocks until there is room, + * to push the value, or the channel is closed. + * + * @param value The value is copied and added to the channel. + * @returns false when the channel is closed, and the value could not be pushed. + */ + bool Add(const ValueType& value) { + std::unique_lock<std::mutex> lock(mu_); + writers_cv_.wait(lock, [this]() { + return queue_.size() < capacity_ || closed_; + }); + + if (closed_) { + return false; + } + + queue_.push_back(value); + lock.unlock(); + + readers_cv_.notify_one(); + + return true; + } + + /** + * Tries to move the value into the channel queue. + * + * If the channel is full up to its capacity or closed, this call returns + * without blocking, and the returned result's bool operator will evaluate to + * false. + * + * @param value The value is moved into the new element. + * @returns a add result, that can be used to check if the operation was + * successful, and what was the channel state - closed, full. + */ + ChannelAddResult TryAdd(ValueType&& value) { + ChannelAddResult result; + { + std::lock_guard<std::mutex> lock(mu_); + result = ChannelAddResult{closed_, queue_.size() >= capacity_}; + if (!result) { + return result; + } + + queue_.push_back(std::move(value)); + } + + readers_cv_.notify_one(); + + return result; + } + + /** + * Tries to add a copy of the value into the channel queue. + * + * If the channel is full up to its capacity or closed, this call returns + * without blocking, and the returned result's bool operator will evaluate to + * false. + * + * @param value The value is copied and added to the channel. + * @returns a add result, that can be used to check if the operation was + * successful, and what was the channel state - closed, full. + */ + ChannelAddResult TryAdd(const ValueType& value) { + ChannelAddResult result; + { + std::lock_guard<std::mutex> lock(mu_); + result = ChannelAddResult{closed_, queue_.size() >= capacity_}; + if (!result) { + return result; + } + + queue_.push_back(value); + } + + readers_cv_.notify_one(); + + return result; + } + + /** + * Get retrieves a value from the channel. + * If the channel is empty, this call blocks until there is something added + * into the channel or the channel is empty but closed. + * + * @returns the retrieved value. + * The retrieved value has optional semantics. + * One must check if the value exists before using it. + * See the ChannelValue class docs. + */ + ChannelValue<ValueType> Get() { + std::unique_lock<std::mutex> lock(mu_); + readers_cv_.wait(lock, [this]() { + return queue_.size() > 0 || closed_; + }); + + if (queue_.size() == 0) { + return ChannelValue<ValueType>{closed_, queue_.size() == 0}; + } + + auto result = ChannelValue<ValueType>{ + std::move(queue_.front()), + closed_, + queue_.size() == 0, + }; + queue_.pop_front(); + + lock.unlock(); + writers_cv_.notify_one(); + + return result; + } + + /** + * Closes the channel. + * + * All currently blocked readers will be unblocked. + */ + void Close() { + { + std::lock_guard<std::mutex> lock{mu_}; + closed_ = true; + } + + writers_cv_.notify_all(); + readers_cv_.notify_all(); + } + +private: + // mutex used to protect the fields that follow. + std::mutex mu_; + + // conditional variable for the writers. + std::condition_variable writers_cv_; + + // conditional variable for the readers. + std::condition_variable readers_cv_; + + // signify if the channel is closed. + bool closed_; + + // maximum number of elements buffered inside the channel. + std::size_t capacity_; + + // the internal queue used by the channel. + // TODO: replace the deque with circular buffer since the channel's capacity + // is fixed and known during the construction time. + std::deque<ValueType> queue_; +}; + +} +} + +#endif diff --git a/cpp/src/vereign/vereign.cc b/cpp/src/vereign/vereign.cc new file mode 100644 index 0000000000000000000000000000000000000000..6095a55db57e77a6c11feeae3ba8f08217d223f8 --- /dev/null +++ b/cpp/src/vereign/vereign.cc @@ -0,0 +1,72 @@ +#include <vereign/vereign.h> +#include <vereign/grpc/server.hh> + +struct vereign_error { + int code; + std::string msg; +}; + +void vereign_error_free(vereign_error* err) { + delete err; +} + +auto vereign_error_code(vereign_error* err) -> int { + return err->code; +} + +auto vereign_error_message(vereign_error* err) -> const char* { + return err->msg.data(); +} + +struct vereign_service { + std::unique_ptr<vereign::grpc::Server> impl; +}; + +// FIXME: generate SSL keys for gRPC communication. +auto vereign_service_start( + const char* listen_address, + const char* vereign_host, + const char* vereign_port, + const char* storage_path, + vereign_error** err +) -> vereign_service* { + if (err != nullptr) { + *err = nullptr; + } + + std::unique_ptr<vereign::grpc::Server> serviceImpl; + + try { + serviceImpl = std::make_unique<vereign::grpc::Server>( + listen_address, + vereign_host, + vereign_port, + storage_path != nullptr ? storage_path : "" + ); + + return new vereign_service{std::move(serviceImpl)}; + } catch (const vereign::grpc::BindError& e) { + if (err != nullptr) { + *err = new vereign_error{VEREIGN_ERR_GRPC_BIND_FAILED, e.what()}; + } + } catch (const std::exception& e) { + if (err != nullptr) { + *err = new vereign_error{VEREIGN_ERR_INTERNAL, e.what()}; + } + } + + return nullptr; +} + +auto vereign_service_selected_port(vereign_service* service) -> int { + return service->impl->SelectedPort(); +} + +void vereign_service_shutdown(vereign_service* service) { + if (service == nullptr) { + return; + } + + service->impl->Shutdown(); + delete service; +} diff --git a/cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl b/cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..28e01d5856d10afdb8c09a84a2ba027e3cfcf07c --- /dev/null +++ b/cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl @@ -0,0 +1,60 @@ +#ifndef __VEREIGN_GRPC_GEN_{{ upper .Name }}_API_HH +#define __VEREIGN_GRPC_GEN_{{ upper .Name }}_API_HH + +#include <vereign/client_library/{{ .Name }}_api.gen.grpc.pb.h> + +namespace vereign { +namespace grpc { +namespace gen { + +{{- $class := (print (title .Name) "API") }} + +template <class VereignService> +class {{ $class }} : public client_library::{{ $class }}::Service { +public: + static constexpr const char* Name = "{{ .Name }}"; + + using VereignServiceType = VereignService; + using VereignServicePtr = std::unique_ptr<VereignService>; + + {{ $class }}(VereignServicePtr&& service) + : service_{std::move(service)} + {} + + {{ $class }}(const {{ $class }}&) = delete; + {{ $class }}& operator=(const {{ $class }}&) = delete; + +{{- range .Apis }} + + ::grpc::Status {{ title .Name }}( + ::grpc::ServerContext*, + const client_library::{{ .RequestMessage }}* request, + client_library::{{ .ResponseMessage }}* response + ) override { + auto result_future = service_->{{ title .Name }}(request, response); + + try { + result_future.get(); + } catch (const std::exception& e) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error(e.what()); + } catch (...) { + response->set_code("500"); + response->set_status("Internal Service Error"); + response->set_error("Internal Service Error"); + } + + return ::grpc::Status::OK; + } +{{- end }} + +protected: + VereignServicePtr service_; +}; + +} // gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_{{ upper .Name }}_API_HH diff --git a/cpp/templates/vereign/grpc/gen/gen.cc.tmpl b/cpp/templates/vereign/grpc/gen/gen.cc.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..47604c78d088720203ca6c6096770c578f4b7967 --- /dev/null +++ b/cpp/templates/vereign/grpc/gen/gen.cc.tmpl @@ -0,0 +1,21 @@ +#include <vereign/grpc/gen/gen.hh> + +#include <vereign/service/gen/gen.hh> +#include <vereign/grpc/service_registry.hh> + +namespace vereign { +namespace grpc { +namespace gen { + +void RegisterAll( + restapi::ClientSession& client_session, + vereign::grpc::ServiceRegistry& service_registry +) { +{{- range .Services }} + service_registry.RegisterIfNotExist<{{ title .Name }}API<service::gen::{{ title .Name }}Service>>(client_session); +{{- end }} +} + +} +} +} diff --git a/cpp/templates/vereign/grpc/gen/gen.hh.tmpl b/cpp/templates/vereign/grpc/gen/gen.hh.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..eee804a79b0b7b9cebc88361ccbeccc3239c82b1 --- /dev/null +++ b/cpp/templates/vereign/grpc/gen/gen.hh.tmpl @@ -0,0 +1,25 @@ +#ifndef __VEREIGN_GRPC_GEN_GEN_HH +#define __VEREIGN_GRPC_GEN_GEN_HH + +{{ range .Services }} +#include <vereign/grpc/gen/{{ .Name }}_api.hh> +{{- end }} + +namespace vereign { +namespace restapi { +class ClientSession; +} + +namespace grpc { + +class ServiceRegistry; + +namespace gen { + +void RegisterAll(restapi::ClientSession& client_session, grpc::ServiceRegistry& service_registry); + +} // namespace gen +} // namespace grpc +} // namespace vereign + +#endif // __VEREIGN_GRPC_GEN_GEN_HH diff --git a/cpp/templates/vereign/service/gen/++service++_service.cc.tmpl b/cpp/templates/vereign/service/gen/++service++_service.cc.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..93c489c83aedff604a74d860d42ea46936ef5d22 --- /dev/null +++ b/cpp/templates/vereign/service/gen/++service++_service.cc.tmpl @@ -0,0 +1,39 @@ +#include <vereign/service/gen/{{ .Name }}_service.hh> +#include <vereign/restapi/client_session.hh> + +namespace { +{{- range .Apis }} + const std::string {{ .Name }}Path = "{{ .Name }}"; +{{- end }} +} + +namespace vereign { +namespace service { +namespace gen { + +{{- $class := (print (title .Name) "Service") }} + +const std::string {{ $class }}::ServicePath = "/{{ .Name }}/"; + +{{ $class }}::{{ $class }}(restapi::ClientSession& client_session) + : client_session_{client_session} +{} + +{{- range .Apis }} + +std::future<{{ $class }}::{{ title .Name }}Result> +{{ $class }}::{{ title .Name }}( + const client_library::{{ .RequestMessage }}* req, + client_library::{{ .ResponseMessage }}* resp +) { + return client_session_.Post( + ServicePath + {{ .Name }}Path, + req, + resp + ); +} +{{- end }} + +} // namespace gen +} // namespace service +} // namespace vereign diff --git a/cpp/templates/vereign/service/gen/++service++_service.hh.tmpl b/cpp/templates/vereign/service/gen/++service++_service.hh.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..698f1f33f1ed5441734ae977a7a3344e7f4e26b5 --- /dev/null +++ b/cpp/templates/vereign/service/gen/++service++_service.hh.tmpl @@ -0,0 +1,53 @@ +#ifndef __VEREIGN_SERVICE_GEN_{{ upper .Name }}_SERVICE_HH +#define __VEREIGN_SERVICE_GEN_{{ upper .Name }}_SERVICE_HH + +#include <vereign/restapi/client_session.hh> +#include <vereign/restapi/post_result.hh> +#include <vereign/client_library/types.gen.pb.h> + +#include <future> + +namespace vereign { + +namespace restapi { + class ClientSession; +} + +namespace service { +namespace gen { + +template <class Request, class Response> +using Result = restapi::PostResult<Request, Response>; + +{{- $class := (print (title .Name) "Service") }} + +class {{ $class }} { +public: + static const std::string ServicePath; + + explicit {{ $class }}(restapi::ClientSession& client_session); + + {{ $class }}(const {{ $class }}&) = delete; + {{ $class }}& operator=(const {{ $class }}&) = delete; + +{{- range .Apis }} + + using {{ title .Name }}Result = Result< + const client_library::{{ .RequestMessage }}*, + client_library::{{ .ResponseMessage }}*>; + + std::future<{{ title .Name }}Result> {{ title .Name }}( + const client_library::{{ .RequestMessage }}* req, + client_library::{{ .ResponseMessage }}* resp + ); +{{- end }} + +private: + restapi::ClientSession& client_session_; +}; + +} // namespace gen +} // namespace service +} // namespace vereign + +#endif // __VEREIGN_SERVICE_GEN_{{ upper .Name }}_SERVICE_HH diff --git a/cpp/templates/vereign/service/gen/gen.hh.tmpl b/cpp/templates/vereign/service/gen/gen.hh.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..9f6d6a8ca96d80b9f2ba9cbf26c790a4ac383e38 --- /dev/null +++ b/cpp/templates/vereign/service/gen/gen.hh.tmpl @@ -0,0 +1,8 @@ +#ifndef __VEREIGN_SERVICE_GEN_GEN_HH +#define __VEREIGN_SERVICE_GEN_GEN_HH + +{{ range .Services }} +#include <vereign/service/gen/{{ .Name }}_service.hh> +{{- end }} + +#endif // __VEREIGN_SERVICE_GEN_GEN_HH diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..62bd6f48b027be1b1605a1f083be7c52d0ecaf00 --- /dev/null +++ b/cpp/tests/CMakeLists.txt @@ -0,0 +1,9 @@ + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + "${VENDOR_INSTALL_DIR}/boost/include" +) + +add_subdirectory("protobuf") +add_subdirectory("vereign") +add_subdirectory("integration") diff --git a/cpp/tests/catch2/catch.hpp b/cpp/tests/catch2/catch.hpp new file mode 100644 index 0000000000000000000000000000000000000000..fc1f54d6dc7e9ee509defe9da2c41cdb1bf289e0 --- /dev/null +++ b/cpp/tests/catch2/catch.hpp @@ -0,0 +1,17703 @@ +/* + * Catch v2.12.1 + * Generated: 2020-04-21 19:29:20.964532 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly + * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +// start catch.hpp + + +#define CATCH_VERSION_MAJOR 2 +#define CATCH_VERSION_MINOR 12 +#define CATCH_VERSION_PATCH 1 + +#ifdef __clang__ +# pragma clang system_header +#elif defined __GNUC__ +# pragma GCC system_header +#endif + +// start catch_suppress_warnings.h + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(push) +# pragma warning(disable: 161 1682) +# else // __ICC +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wswitch-enum" +# pragma clang diagnostic ignored "-Wcovered-switch-default" +# endif +#elif defined __GNUC__ + // Because REQUIREs trigger GCC's -Wparentheses, and because still + // supported version of g++ have only buggy support for _Pragmas, + // Wparentheses have to be suppressed globally. +# pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Wpadded" +#endif +// end catch_suppress_warnings.h +#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) +# define CATCH_IMPL +# define CATCH_CONFIG_ALL_PARTS +#endif + +// In the impl file, we want to have access to all parts of the headers +// Can also be used to sanely support PCHs +#if defined(CATCH_CONFIG_ALL_PARTS) +# define CATCH_CONFIG_EXTERNAL_INTERFACES +# if defined(CATCH_CONFIG_DISABLE_MATCHERS) +# undef CATCH_CONFIG_DISABLE_MATCHERS +# endif +# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +# endif +#endif + +#if !defined(CATCH_CONFIG_IMPL_ONLY) +// start catch_platform.h + +#ifdef __APPLE__ +# include <TargetConditionals.h> +# if TARGET_OS_OSX == 1 +# define CATCH_PLATFORM_MAC +# elif TARGET_OS_IPHONE == 1 +# define CATCH_PLATFORM_IPHONE +# endif + +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define CATCH_PLATFORM_LINUX + +#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) +# define CATCH_PLATFORM_WINDOWS +#endif + +// end catch_platform.h + +#ifdef CATCH_IMPL +# ifndef CLARA_CONFIG_MAIN +# define CLARA_CONFIG_MAIN_NOT_DEFINED +# define CLARA_CONFIG_MAIN +# endif +#endif + +// start catch_user_interfaces.h + +namespace Catch { + unsigned int rngSeed(); +} + +// end catch_user_interfaces.h +// start catch_tag_alias_autoregistrar.h + +// start catch_common.h + +// start catch_compiler_capabilities.h + +// Detect a number of compiler features - by compiler +// The following features are defined: +// +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? +// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? +// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled? +// **************** +// Note to maintainers: if new toggles are added please document them +// in configuration.md, too +// **************** + +// In general each macro has a _NO_<feature name> form +// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +#ifdef __cplusplus + +# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) +# define CATCH_CPP14_OR_GREATER +# endif + +# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define CATCH_CPP17_OR_GREATER +# endif + +#endif + +#if defined(__cpp_lib_uncaught_exceptions) +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif + +// We have to avoid both ICC and Clang, because they try to mask themselves +// as gcc, and we want only GCC in this block +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) + +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) + +#endif + +#if defined(__clang__) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) + +// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug +// which results in calls to destructors being emitted for each temporary, +// without a matching initialization. In practice, this can result in something +// like `std::string::~string` being called on an uninitialized value. +// +// For example, this code will likely segfault under IBM XL: +// ``` +// REQUIRE(std::string("12") + "34" == "1234") +// ``` +// +// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. +# if !defined(__ibmxl__) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg) */ +# endif + +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ + _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) + +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// Assume that non-Windows platforms support posix signals by default +#if !defined(CATCH_PLATFORM_WINDOWS) + #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS +#endif + +//////////////////////////////////////////////////////////////////////////////// +// We know some environments not to support full POSIX signals +#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) + #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +#endif + +#ifdef __OS400__ +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# define CATCH_CONFIG_COLOUR_NONE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Android somehow still does not support std::to_string +#if defined(__ANDROID__) +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Not all Windows environments support SEH properly +#if defined(__MINGW32__) +# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH +#endif + +//////////////////////////////////////////////////////////////////////////////// +// PS4 +#if defined(__ORBIS__) +# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cygwin +#ifdef __CYGWIN__ + +// Required for some versions of Cygwin to declare gettimeofday +// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin +# define _BSD_SOURCE +// some versions of cygwin (most) do not support std::to_string. Use the libstd check. +// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 +# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ + && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) + +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING + +# endif +#endif // __CYGWIN__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#if defined(_MSC_VER) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) + +# if _MSC_VER >= 1900 // Visual Studio 2015 or newer +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +# endif + +// Universal Windows platform does not support SEH +// Or console colours (or console at all...) +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define CATCH_CONFIG_COLOUR_NONE +# else +# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH +# endif + +// MSVC traditional preprocessor needs some workaround for __VA_ARGS__ +// _MSVC_TRADITIONAL == 0 means new conformant preprocessor +// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor +# if !defined(__clang__) // Handle Clang masquerading for msvc +# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) +# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +# endif // MSVC_TRADITIONAL +# endif // __clang__ + +#endif // _MSC_VER + +#if defined(_REENTRANT) || defined(_MSC_VER) +// Enable async processing, as -pthread is specified or no additional linking is required +# define CATCH_INTERNAL_CONFIG_USE_ASYNC +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// +// Check if we are compiled with -fno-exceptions or equivalent +#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) +# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED +#endif + +//////////////////////////////////////////////////////////////////////////////// +// DJGPP +#ifdef __DJGPP__ +# define CATCH_INTERNAL_CONFIG_NO_WCHAR +#endif // __DJGPP__ + +//////////////////////////////////////////////////////////////////////////////// +// Embarcadero C++Build +#if defined(__BORLANDC__) + #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// Use of __COUNTER__ is suppressed during code analysis in +// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly +// handled by it. +// Otherwise all supported compilers support COUNTER macro, +// but user still might want to turn it off +#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) + #define CATCH_INTERNAL_CONFIG_COUNTER +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// RTX is a special version of Windows that is real time. +// This means that it is detected as Windows, but does not provide +// the same set of capabilities as real Windows does. +#if defined(UNDER_RTSS) || defined(RTX64_BUILD) + #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH + #define CATCH_INTERNAL_CONFIG_NO_ASYNC + #define CATCH_CONFIG_COLOUR_NONE +#endif + +#if !defined(_GLIBCXX_USE_C99_MATH_TR1) +#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Various stdlib support checks that require __has_include +#if defined(__has_include) + // Check if string_view is available and usable + #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW + #endif + + // Check if optional is available and usable + # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL + # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) + + // Check if byte is available and usable + # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) + + // Check if variant is available and usable + # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) + # if defined(__clang__) && (__clang_major__ < 8) + // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 + // fix should be in clang 8, workaround in libstdc++ 8.2 + # include <ciso646> + # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # define CATCH_CONFIG_NO_CPP17_VARIANT + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__clang__) && (__clang_major__ < 8) + # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) +#endif // defined(__has_include) + +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) +# define CATCH_CONFIG_COUNTER +#endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif +// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. +#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_CONFIG_POSIX_SIGNALS +#endif +// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. +#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) +# define CATCH_CONFIG_WCHAR +#endif + +#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) +# define CATCH_CONFIG_CPP11_TO_STRING +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) +# define CATCH_CONFIG_CPP17_OPTIONAL +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) +# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) +# define CATCH_CONFIG_CPP17_STRING_VIEW +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) +# define CATCH_CONFIG_CPP17_VARIANT +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) +# define CATCH_CONFIG_CPP17_BYTE +#endif + +#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) +# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) +# define CATCH_CONFIG_NEW_CAPTURE +#endif + +#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +# define CATCH_CONFIG_DISABLE_EXCEPTIONS +#endif + +#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) +# define CATCH_CONFIG_POLYFILL_ISNAN +#endif + +#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) +# define CATCH_CONFIG_USE_ASYNC +#endif + +#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) +# define CATCH_CONFIG_ANDROID_LOGWRITE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) +# define CATCH_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Even if we do not think the compiler has that warning, we still have +// to provide a macro that can be used by the code. +#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS +#endif + +// The goal of this macro is to avoid evaluation of the arguments, but +// still have the compiler warn on problems inside... +#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) +#endif + +#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#elif defined(__clang__) && (__clang_major__ < 5) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +#define CATCH_TRY if ((true)) +#define CATCH_CATCH_ALL if ((false)) +#define CATCH_CATCH_ANON(type) if ((false)) +#else +#define CATCH_TRY try +#define CATCH_CATCH_ALL catch (...) +#define CATCH_CATCH_ANON(type) catch (type) +#endif + +#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) +#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#endif + +// end catch_compiler_capabilities.h +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif + +#include <iosfwd> +#include <string> +#include <cstdint> + +// We need a dummy global operator<< so we can bring it into Catch namespace later +struct Catch_global_namespace_dummy {}; +std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); + +namespace Catch { + + struct CaseSensitive { enum Choice { + Yes, + No + }; }; + + class NonCopyable { + NonCopyable( NonCopyable const& ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable& operator = ( NonCopyable const& ) = delete; + NonCopyable& operator = ( NonCopyable && ) = delete; + + protected: + NonCopyable(); + virtual ~NonCopyable(); + }; + + struct SourceLineInfo { + + SourceLineInfo() = delete; + SourceLineInfo( char const* _file, std::size_t _line ) noexcept + : file( _file ), + line( _line ) + {} + + SourceLineInfo( SourceLineInfo const& other ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo( SourceLineInfo&& ) noexcept = default; + SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; + + bool empty() const noexcept { return file[0] == '\0'; } + bool operator == ( SourceLineInfo const& other ) const noexcept; + bool operator < ( SourceLineInfo const& other ) const noexcept; + + char const* file; + std::size_t line; + }; + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); + + // Bring in operator<< from global namespace into Catch namespace + // This is necessary because the overload of operator<< above makes + // lookup stop at namespace Catch + using ::operator<<; + + // Use this in variadic streaming macros to allow + // >> +StreamEndStop + // as well as + // >> stuff +StreamEndStop + struct StreamEndStop { + std::string operator+() const; + }; + template<typename T> + T const& operator + ( T const& value, StreamEndStop ) { + return value; + } +} + +#define CATCH_INTERNAL_LINEINFO \ + ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) ) + +// end catch_common.h +namespace Catch { + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +// end catch_tag_alias_autoregistrar.h +// start catch_test_registry.h + +// start catch_interfaces_testcase.h + +#include <vector> + +namespace Catch { + + class TestSpec; + + struct ITestInvoker { + virtual void invoke () const = 0; + virtual ~ITestInvoker(); + }; + + class TestCase; + struct IConfig; + + struct ITestCaseRegistry { + virtual ~ITestCaseRegistry(); + virtual std::vector<TestCase> const& getAllTests() const = 0; + virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0; + }; + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ); + +} + +// end catch_interfaces_testcase.h +// start catch_stringref.h + +#include <cstddef> +#include <string> +#include <iosfwd> +#include <cassert> + +namespace Catch { + + /// A non-owning string class (similar to the forthcoming std::string_view) + /// Note that, because a StringRef may be a substring of another string, + /// it may not be null terminated. + class StringRef { + public: + using size_type = std::size_t; + using const_iterator = const char*; + + private: + static constexpr char const* const s_empty = ""; + + char const* m_start = s_empty; + size_type m_size = 0; + + public: // construction + constexpr StringRef() noexcept = default; + + StringRef( char const* rawChars ) noexcept; + + constexpr StringRef( char const* rawChars, size_type size ) noexcept + : m_start( rawChars ), + m_size( size ) + {} + + StringRef( std::string const& stdString ) noexcept + : m_start( stdString.c_str() ), + m_size( stdString.size() ) + {} + + explicit operator std::string() const { + return std::string(m_start, m_size); + } + + public: // operators + auto operator == ( StringRef const& other ) const noexcept -> bool; + auto operator != (StringRef const& other) const noexcept -> bool { + return !(*this == other); + } + + auto operator[] ( size_type index ) const noexcept -> char { + assert(index < m_size); + return m_start[index]; + } + + public: // named queries + constexpr auto empty() const noexcept -> bool { + return m_size == 0; + } + constexpr auto size() const noexcept -> size_type { + return m_size; + } + + // Returns the current start pointer. If the StringRef is not + // null-terminated, throws std::domain_exception + auto c_str() const -> char const*; + + public: // substrings and searches + // Returns a substring of [start, start + length). + // If start + length > size(), then the substring is [start, size()). + // If start > size(), then the substring is empty. + auto substr( size_type start, size_type length ) const noexcept -> StringRef; + + // Returns the current start pointer. May not be null-terminated. + auto data() const noexcept -> char const*; + + constexpr auto isNullTerminated() const noexcept -> bool { + return m_start[m_size] == '\0'; + } + + public: // iterators + constexpr const_iterator begin() const { return m_start; } + constexpr const_iterator end() const { return m_start + m_size; } + }; + + auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; + auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; + + constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { + return StringRef( rawChars, size ); + } +} // namespace Catch + +constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { + return Catch::StringRef( rawChars, size ); +} + +// end catch_stringref.h +// start catch_preprocessor.hpp + + +#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ +#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) + +#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ +// MSVC needs more evaluations +#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) +#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) +#else +#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) +#endif + +#define CATCH_REC_END(...) +#define CATCH_REC_OUT + +#define CATCH_EMPTY() +#define CATCH_DEFER(id) id CATCH_EMPTY() + +#define CATCH_REC_GET_END2() 0, CATCH_REC_END +#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 +#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 +#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT +#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) +#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) + +#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) + +#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) + +// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results, +// and passes userdata as the first parameter to each invocation, +// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c) +#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) + +#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) + +#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) +#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ +#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ +#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF +#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__) +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__ +#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) +#else +// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF +#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__) +#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__ +#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) +#endif + +#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ +#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) + +#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) +#else +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) +#endif + +#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ + CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) + +#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) +#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) +#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) +#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) +#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) +#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) +#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6) +#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) +#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) +#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) +#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) + +#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N + +#define INTERNAL_CATCH_TYPE_GEN\ + template<typename...> struct TypeList {};\ + template<typename...Ts>\ + constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\ + template<template<typename...> class...> struct TemplateTypeList{};\ + template<template<typename...> class...Cs>\ + constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\ + template<typename...>\ + struct append;\ + template<typename...>\ + struct rewrap;\ + template<template<typename...> class, typename...>\ + struct create;\ + template<template<typename...> class, typename>\ + struct convert;\ + \ + template<typename T> \ + struct append<T> { using type = T; };\ + template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ + struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\ + template< template<typename...> class L1, typename...E1, typename...Rest>\ + struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\ + \ + template< template<typename...> class Container, template<typename...> class List, typename...elems>\ + struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\ + template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\ + struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\ + \ + template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ + struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\ + template<template <typename...> class Final, template <typename...> class List, typename...Ts>\ + struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; }; + +#define INTERNAL_CATCH_NTTP_1(signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \ + template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\ + template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\ + constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \ + \ + template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\ + template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\ + struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\ + template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\ + struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; }; + +#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName) +#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() +#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() + +#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName) +#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() +#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() + +#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\ + template<typename Type>\ + void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\ + } + +#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\ + } + +#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\ + template<typename Type>\ + void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\ + } + +#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\ + } + +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName) +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \ + void test();\ + } + +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \ + void test();\ + } + +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName) +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\ + template<typename TestType> \ + void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test() +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \ + void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_NTTP_0 +#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__),INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_0) +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__) +#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__) +#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__) +#else +#define INTERNAL_CATCH_NTTP_0(signature) +#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1,INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_0)( __VA_ARGS__)) +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__)) +#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)) +#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__)) +#endif + +// end catch_preprocessor.hpp +// start catch_meta.hpp + + +#include <type_traits> + +namespace Catch { + template<typename T> + struct always_false : std::false_type {}; + + template <typename> struct true_given : std::true_type {}; + struct is_callable_tester { + template <typename Fun, typename... Args> + true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int); + template <typename...> + std::false_type static test(...); + }; + + template <typename T> + struct is_callable; + + template <typename Fun, typename... Args> + struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {}; + +#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 + // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is + // replaced with std::invoke_result here. Also *_t format is preferred over + // typename *::type format. + template <typename Func, typename U> + using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>; +#else + template <typename Func, typename U> + using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type; +#endif + +} // namespace Catch + +namespace mpl_{ + struct na; +} + +// end catch_meta.hpp +namespace Catch { + +template<typename C> +class TestInvokerAsMethod : public ITestInvoker { + void (C::*m_testAsMethod)(); +public: + TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {} + + void invoke() const override { + C obj; + (obj.*m_testAsMethod)(); + } +}; + +auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*; + +template<typename C> +auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* { + return new(std::nothrow) TestInvokerAsMethod<C>( testAsMethod ); +} + +struct NameAndTags { + NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept; + StringRef name; + StringRef tags; +}; + +struct AutoReg : NonCopyable { + AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept; + ~AutoReg(); +}; + +} // end namespace Catch + +#if defined(CATCH_CONFIG_DISABLE) + #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ + namespace{ \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ + void test(); \ + }; \ + } \ + void TestName::test() + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature)) + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ + namespace{ \ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ + INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ + } \ + } \ + INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) + #endif + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) + #endif + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) + #endif + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) + #endif +#endif + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE( ... ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ + } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ + INTERNAL_CATCH_TYPE_GEN\ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + template<typename...Types> \ + struct TestName{\ + TestName(){\ + int index = 0; \ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ + using expander = int[];\ + (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\ + return 0;\ + }();\ + }\ + }\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature)) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> static void TestFuncName(); \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ + INTERNAL_CATCH_TYPE_GEN \ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature)) \ + template<typename... Types> \ + struct TestName { \ + void reg_tests() { \ + int index = 0; \ + using expander = int[]; \ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ + constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ + constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */\ + } \ + }; \ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ + using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \ + TestInit t; \ + t.reg_tests(); \ + return 0; \ + }(); \ + } \ + } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + static void TestFuncName() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T,__VA_ARGS__) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T, __VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> static void TestFunc(); \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ + INTERNAL_CATCH_TYPE_GEN\ + template<typename... Types> \ + struct TestName { \ + void reg_tests() { \ + int index = 0; \ + using expander = int[]; \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\ + } \ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ + using TestInit = typename convert<TestName, TmplList>::type; \ + TestInit t; \ + t.reg_tests(); \ + return 0; \ + }(); \ + }}\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + static void TestFunc() + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList ) + + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ + INTERNAL_CATCH_TYPE_GEN\ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ + INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + template<typename...Types> \ + struct TestNameClass{\ + TestNameClass(){\ + int index = 0; \ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ + using expander = int[];\ + (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\ + return 0;\ + }();\ + }\ + }\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ + void test();\ + };\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\ + INTERNAL_CATCH_TYPE_GEN \ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + template<typename...Types>\ + struct TestNameClass{\ + void reg_tests(){\ + int index = 0;\ + using expander = int[];\ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ + constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ + constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\ + TestInit t;\ + t.reg_tests();\ + return 0;\ + }(); \ + }\ + }\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + void TestName<TestType>::test() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ + void test();\ + };\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ + INTERNAL_CATCH_TYPE_GEN\ + template<typename...Types>\ + struct TestNameClass{\ + void reg_tests(){\ + int index = 0;\ + using expander = int[];\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + using TestInit = typename convert<TestNameClass, TmplList>::type;\ + TestInit t;\ + t.reg_tests();\ + return 0;\ + }(); \ + }}\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + void TestName<TestType>::test() + +#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList ) + +// end catch_test_registry.h +// start catch_capture.hpp + +// start catch_assertionhandler.h + +// start catch_assertioninfo.h + +// start catch_result_type.h + +namespace Catch { + + // ResultWas::OfType enum + struct ResultWas { enum OfType { + Unknown = -1, + Ok = 0, + Info = 1, + Warning = 2, + + FailureBit = 0x10, + + ExpressionFailed = FailureBit | 1, + ExplicitFailure = FailureBit | 2, + + Exception = 0x100 | FailureBit, + + ThrewException = Exception | 1, + DidntThrowException = Exception | 2, + + FatalErrorCondition = 0x200 | FailureBit + + }; }; + + bool isOk( ResultWas::OfType resultType ); + bool isJustInfo( int flags ); + + // ResultDisposition::Flags enum + struct ResultDisposition { enum Flags { + Normal = 0x01, + + ContinueOnFailure = 0x02, // Failures fail test, but execution continues + FalseTest = 0x04, // Prefix expression with ! + SuppressFail = 0x08 // Failures are reported but do not fail the test + }; }; + + ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ); + + bool shouldContinueOnFailure( int flags ); + inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } + bool shouldSuppressFailure( int flags ); + +} // end namespace Catch + +// end catch_result_type.h +namespace Catch { + + struct AssertionInfo + { + StringRef macroName; + SourceLineInfo lineInfo; + StringRef capturedExpression; + ResultDisposition::Flags resultDisposition; + + // We want to delete this constructor but a compiler bug in 4.8 means + // the struct is then treated as non-aggregate + //AssertionInfo() = delete; + }; + +} // end namespace Catch + +// end catch_assertioninfo.h +// start catch_decomposer.h + +// start catch_tostring.h + +#include <vector> +#include <cstddef> +#include <type_traits> +#include <string> +// start catch_stream.h + +#include <iosfwd> +#include <cstddef> +#include <ostream> + +namespace Catch { + + std::ostream& cout(); + std::ostream& cerr(); + std::ostream& clog(); + + class StringRef; + + struct IStream { + virtual ~IStream(); + virtual std::ostream& stream() const = 0; + }; + + auto makeStream( StringRef const &filename ) -> IStream const*; + + class ReusableStringStream : NonCopyable { + std::size_t m_index; + std::ostream* m_oss; + public: + ReusableStringStream(); + ~ReusableStringStream(); + + auto str() const -> std::string; + + template<typename T> + auto operator << ( T const& value ) -> ReusableStringStream& { + *m_oss << value; + return *this; + } + auto get() -> std::ostream& { return *m_oss; } + }; +} + +// end catch_stream.h +// start catch_interfaces_enum_values_registry.h + +#include <vector> + +namespace Catch { + + namespace Detail { + struct EnumInfo { + StringRef m_name; + std::vector<std::pair<int, StringRef>> m_values; + + ~EnumInfo(); + + StringRef lookup( int value ) const; + }; + } // namespace Detail + + struct IMutableEnumValuesRegistry { + virtual ~IMutableEnumValuesRegistry(); + + virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0; + + template<typename E> + Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) { + static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int"); + std::vector<int> intValues; + intValues.reserve( values.size() ); + for( auto enumValue : values ) + intValues.push_back( static_cast<int>( enumValue ) ); + return registerEnum( enumName, allEnums, intValues ); + } + }; + +} // Catch + +// end catch_interfaces_enum_values_registry.h + +#ifdef CATCH_CONFIG_CPP17_STRING_VIEW +#include <string_view> +#endif + +#ifdef __OBJC__ +// start catch_objc_arc.hpp + +#import <Foundation/Foundation.h> + +#ifdef __has_feature +#define CATCH_ARC_ENABLED __has_feature(objc_arc) +#else +#define CATCH_ARC_ENABLED 0 +#endif + +void arcSafeRelease( NSObject* obj ); +id performOptionalSelector( id obj, SEL sel ); + +#if !CATCH_ARC_ENABLED +inline void arcSafeRelease( NSObject* obj ) { + [obj release]; +} +inline id performOptionalSelector( id obj, SEL sel ) { + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; + return nil; +} +#define CATCH_UNSAFE_UNRETAINED +#define CATCH_ARC_STRONG +#else +inline void arcSafeRelease( NSObject* ){} +inline id performOptionalSelector( id obj, SEL sel ) { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#endif + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + return nil; +} +#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained +#define CATCH_ARC_STRONG __strong +#endif + +// end catch_objc_arc.hpp +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless +#endif + +namespace Catch { + namespace Detail { + + extern const std::string unprintableString; + + std::string rawMemoryToString( const void *object, std::size_t size ); + + template<typename T> + std::string rawMemoryToString( const T& object ) { + return rawMemoryToString( &object, sizeof(object) ); + } + + template<typename T> + class IsStreamInsertable { + template<typename Stream, typename U> + static auto test(int) + -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type()); + + template<typename, typename> + static auto test(...)->std::false_type; + + public: + static const bool value = decltype(test<std::ostream, const T&>(0))::value; + }; + + template<typename E> + std::string convertUnknownEnumToString( E e ); + + template<typename T> + typename std::enable_if< + !std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value, + std::string>::type convertUnstreamable( T const& ) { + return Detail::unprintableString; + } + template<typename T> + typename std::enable_if< + !std::is_enum<T>::value && std::is_base_of<std::exception, T>::value, + std::string>::type convertUnstreamable(T const& ex) { + return ex.what(); + } + + template<typename T> + typename std::enable_if< + std::is_enum<T>::value + , std::string>::type convertUnstreamable( T const& value ) { + return convertUnknownEnumToString( value ); + } + +#if defined(_MANAGED) + //! Convert a CLR string to a utf8 std::string + template<typename T> + std::string clrReferenceToString( T^ ref ) { + if (ref == nullptr) + return std::string("null"); + auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString()); + cli::pin_ptr<System::Byte> p = &bytes[0]; + return std::string(reinterpret_cast<char const *>(p), bytes->Length); + } +#endif + + } // namespace Detail + + // If we decide for C++14, change these to enable_if_ts + template <typename T, typename = void> + struct StringMaker { + template <typename Fake = T> + static + typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type + convert(const Fake& value) { + ReusableStringStream rss; + // NB: call using the function-like syntax to avoid ambiguity with + // user-defined templated operator<< under clang. + rss.operator<<(value); + return rss.str(); + } + + template <typename Fake = T> + static + typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type + convert( const Fake& value ) { +#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER) + return Detail::convertUnstreamable(value); +#else + return CATCH_CONFIG_FALLBACK_STRINGIFIER(value); +#endif + } + }; + + namespace Detail { + + // This function dispatches all stringification requests inside of Catch. + // Should be preferably called fully qualified, like ::Catch::Detail::stringify + template <typename T> + std::string stringify(const T& e) { + return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e); + } + + template<typename E> + std::string convertUnknownEnumToString( E e ) { + return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<E>::type>(e)); + } + +#if defined(_MANAGED) + template <typename T> + std::string stringify( T^ e ) { + return ::Catch::StringMaker<T^>::convert(e); + } +#endif + + } // namespace Detail + + // Some predefined specializations + + template<> + struct StringMaker<std::string> { + static std::string convert(const std::string& str); + }; + +#ifdef CATCH_CONFIG_CPP17_STRING_VIEW + template<> + struct StringMaker<std::string_view> { + static std::string convert(std::string_view str); + }; +#endif + + template<> + struct StringMaker<char const *> { + static std::string convert(char const * str); + }; + template<> + struct StringMaker<char *> { + static std::string convert(char * str); + }; + +#ifdef CATCH_CONFIG_WCHAR + template<> + struct StringMaker<std::wstring> { + static std::string convert(const std::wstring& wstr); + }; + +# ifdef CATCH_CONFIG_CPP17_STRING_VIEW + template<> + struct StringMaker<std::wstring_view> { + static std::string convert(std::wstring_view str); + }; +# endif + + template<> + struct StringMaker<wchar_t const *> { + static std::string convert(wchar_t const * str); + }; + template<> + struct StringMaker<wchar_t *> { + static std::string convert(wchar_t * str); + }; +#endif + + // TBD: Should we use `strnlen` to ensure that we don't go out of the buffer, + // while keeping string semantics? + template<int SZ> + struct StringMaker<char[SZ]> { + static std::string convert(char const* str) { + return ::Catch::Detail::stringify(std::string{ str }); + } + }; + template<int SZ> + struct StringMaker<signed char[SZ]> { + static std::string convert(signed char const* str) { + return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) }); + } + }; + template<int SZ> + struct StringMaker<unsigned char[SZ]> { + static std::string convert(unsigned char const* str) { + return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) }); + } + }; + +#if defined(CATCH_CONFIG_CPP17_BYTE) + template<> + struct StringMaker<std::byte> { + static std::string convert(std::byte value); + }; +#endif // defined(CATCH_CONFIG_CPP17_BYTE) + template<> + struct StringMaker<int> { + static std::string convert(int value); + }; + template<> + struct StringMaker<long> { + static std::string convert(long value); + }; + template<> + struct StringMaker<long long> { + static std::string convert(long long value); + }; + template<> + struct StringMaker<unsigned int> { + static std::string convert(unsigned int value); + }; + template<> + struct StringMaker<unsigned long> { + static std::string convert(unsigned long value); + }; + template<> + struct StringMaker<unsigned long long> { + static std::string convert(unsigned long long value); + }; + + template<> + struct StringMaker<bool> { + static std::string convert(bool b); + }; + + template<> + struct StringMaker<char> { + static std::string convert(char c); + }; + template<> + struct StringMaker<signed char> { + static std::string convert(signed char c); + }; + template<> + struct StringMaker<unsigned char> { + static std::string convert(unsigned char c); + }; + + template<> + struct StringMaker<std::nullptr_t> { + static std::string convert(std::nullptr_t); + }; + + template<> + struct StringMaker<float> { + static std::string convert(float value); + static int precision; + }; + + template<> + struct StringMaker<double> { + static std::string convert(double value); + static int precision; + }; + + template <typename T> + struct StringMaker<T*> { + template <typename U> + static std::string convert(U* p) { + if (p) { + return ::Catch::Detail::rawMemoryToString(p); + } else { + return "nullptr"; + } + } + }; + + template <typename R, typename C> + struct StringMaker<R C::*> { + static std::string convert(R C::* p) { + if (p) { + return ::Catch::Detail::rawMemoryToString(p); + } else { + return "nullptr"; + } + } + }; + +#if defined(_MANAGED) + template <typename T> + struct StringMaker<T^> { + static std::string convert( T^ ref ) { + return ::Catch::Detail::clrReferenceToString(ref); + } + }; +#endif + + namespace Detail { + template<typename InputIterator> + std::string rangeToString(InputIterator first, InputIterator last) { + ReusableStringStream rss; + rss << "{ "; + if (first != last) { + rss << ::Catch::Detail::stringify(*first); + for (++first; first != last; ++first) + rss << ", " << ::Catch::Detail::stringify(*first); + } + rss << " }"; + return rss.str(); + } + } + +#ifdef __OBJC__ + template<> + struct StringMaker<NSString*> { + static std::string convert(NSString * nsstring) { + if (!nsstring) + return "nil"; + return std::string("@") + [nsstring UTF8String]; + } + }; + template<> + struct StringMaker<NSObject*> { + static std::string convert(NSObject* nsObject) { + return ::Catch::Detail::stringify([nsObject description]); + } + + }; + namespace Detail { + inline std::string stringify( NSString* nsstring ) { + return StringMaker<NSString*>::convert( nsstring ); + } + + } // namespace Detail +#endif // __OBJC__ + +} // namespace Catch + +////////////////////////////////////////////////////// +// Separate std-lib types stringification, so it can be selectively enabled +// This means that we do not bring in + +#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS) +# define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER +# define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER +# define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER +# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +# define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER +#endif + +// Separate std::pair specialization +#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER) +#include <utility> +namespace Catch { + template<typename T1, typename T2> + struct StringMaker<std::pair<T1, T2> > { + static std::string convert(const std::pair<T1, T2>& pair) { + ReusableStringStream rss; + rss << "{ " + << ::Catch::Detail::stringify(pair.first) + << ", " + << ::Catch::Detail::stringify(pair.second) + << " }"; + return rss.str(); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER + +#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL) +#include <optional> +namespace Catch { + template<typename T> + struct StringMaker<std::optional<T> > { + static std::string convert(const std::optional<T>& optional) { + ReusableStringStream rss; + if (optional.has_value()) { + rss << ::Catch::Detail::stringify(*optional); + } else { + rss << "{ }"; + } + return rss.str(); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER + +// Separate std::tuple specialization +#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER) +#include <tuple> +namespace Catch { + namespace Detail { + template< + typename Tuple, + std::size_t N = 0, + bool = (N < std::tuple_size<Tuple>::value) + > + struct TupleElementPrinter { + static void print(const Tuple& tuple, std::ostream& os) { + os << (N ? ", " : " ") + << ::Catch::Detail::stringify(std::get<N>(tuple)); + TupleElementPrinter<Tuple, N + 1>::print(tuple, os); + } + }; + + template< + typename Tuple, + std::size_t N + > + struct TupleElementPrinter<Tuple, N, false> { + static void print(const Tuple&, std::ostream&) {} + }; + + } + + template<typename ...Types> + struct StringMaker<std::tuple<Types...>> { + static std::string convert(const std::tuple<Types...>& tuple) { + ReusableStringStream rss; + rss << '{'; + Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get()); + rss << " }"; + return rss.str(); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER + +#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT) +#include <variant> +namespace Catch { + template<> + struct StringMaker<std::monostate> { + static std::string convert(const std::monostate&) { + return "{ }"; + } + }; + + template<typename... Elements> + struct StringMaker<std::variant<Elements...>> { + static std::string convert(const std::variant<Elements...>& variant) { + if (variant.valueless_by_exception()) { + return "{valueless variant}"; + } else { + return std::visit( + [](const auto& value) { + return ::Catch::Detail::stringify(value); + }, + variant + ); + } + } + }; +} +#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER + +namespace Catch { + struct not_this_one {}; // Tag type for detecting which begin/ end are being selected + + // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace + using std::begin; + using std::end; + + not_this_one begin( ... ); + not_this_one end( ... ); + + template <typename T> + struct is_range { + static const bool value = + !std::is_same<decltype(begin(std::declval<T>())), not_this_one>::value && + !std::is_same<decltype(end(std::declval<T>())), not_this_one>::value; + }; + +#if defined(_MANAGED) // Managed types are never ranges + template <typename T> + struct is_range<T^> { + static const bool value = false; + }; +#endif + + template<typename Range> + std::string rangeToString( Range const& range ) { + return ::Catch::Detail::rangeToString( begin( range ), end( range ) ); + } + + // Handle vector<bool> specially + template<typename Allocator> + std::string rangeToString( std::vector<bool, Allocator> const& v ) { + ReusableStringStream rss; + rss << "{ "; + bool first = true; + for( bool b : v ) { + if( first ) + first = false; + else + rss << ", "; + rss << ::Catch::Detail::stringify( b ); + } + rss << " }"; + return rss.str(); + } + + template<typename R> + struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> { + static std::string convert( R const& range ) { + return rangeToString( range ); + } + }; + + template <typename T, int SZ> + struct StringMaker<T[SZ]> { + static std::string convert(T const(&arr)[SZ]) { + return rangeToString(arr); + } + }; + +} // namespace Catch + +// Separate std::chrono::duration specialization +#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +#include <ctime> +#include <ratio> +#include <chrono> + +namespace Catch { + +template <class Ratio> +struct ratio_string { + static std::string symbol(); +}; + +template <class Ratio> +std::string ratio_string<Ratio>::symbol() { + Catch::ReusableStringStream rss; + rss << '[' << Ratio::num << '/' + << Ratio::den << ']'; + return rss.str(); +} +template <> +struct ratio_string<std::atto> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::femto> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::pico> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::nano> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::micro> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::milli> { + static std::string symbol(); +}; + + //////////// + // std::chrono::duration specializations + template<typename Value, typename Ratio> + struct StringMaker<std::chrono::duration<Value, Ratio>> { + static std::string convert(std::chrono::duration<Value, Ratio> const& duration) { + ReusableStringStream rss; + rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's'; + return rss.str(); + } + }; + template<typename Value> + struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> { + static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) { + ReusableStringStream rss; + rss << duration.count() << " s"; + return rss.str(); + } + }; + template<typename Value> + struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> { + static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) { + ReusableStringStream rss; + rss << duration.count() << " m"; + return rss.str(); + } + }; + template<typename Value> + struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> { + static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) { + ReusableStringStream rss; + rss << duration.count() << " h"; + return rss.str(); + } + }; + + //////////// + // std::chrono::time_point specialization + // Generic time_point cannot be specialized, only std::chrono::time_point<system_clock> + template<typename Clock, typename Duration> + struct StringMaker<std::chrono::time_point<Clock, Duration>> { + static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) { + return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch"; + } + }; + // std::chrono::time_point<system_clock> specialization + template<typename Duration> + struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> { + static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) { + auto converted = std::chrono::system_clock::to_time_t(time_point); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &converted); +#else + std::tm* timeInfo = std::gmtime(&converted); +#endif + + auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER + +#define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \ +namespace Catch { \ + template<> struct StringMaker<enumName> { \ + static std::string convert( enumName value ) { \ + static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \ + return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \ + } \ + }; \ +} + +#define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ ) + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// end catch_tostring.h +#include <iosfwd> + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4389) // '==' : signed/unsigned mismatch +#pragma warning(disable:4018) // more "signed/unsigned mismatch" +#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) +#pragma warning(disable:4180) // qualifier applied to function type has no meaning +#pragma warning(disable:4800) // Forcing result to true or false +#endif + +namespace Catch { + + struct ITransientExpression { + auto isBinaryExpression() const -> bool { return m_isBinaryExpression; } + auto getResult() const -> bool { return m_result; } + virtual void streamReconstructedExpression( std::ostream &os ) const = 0; + + ITransientExpression( bool isBinaryExpression, bool result ) + : m_isBinaryExpression( isBinaryExpression ), + m_result( result ) + {} + + // We don't actually need a virtual destructor, but many static analysers + // complain if it's not here :-( + virtual ~ITransientExpression(); + + bool m_isBinaryExpression; + bool m_result; + + }; + + void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ); + + template<typename LhsT, typename RhsT> + class BinaryExpr : public ITransientExpression { + LhsT m_lhs; + StringRef m_op; + RhsT m_rhs; + + void streamReconstructedExpression( std::ostream &os ) const override { + formatReconstructedExpression + ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) ); + } + + public: + BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs ) + : ITransientExpression{ true, comparisonResult }, + m_lhs( lhs ), + m_op( op ), + m_rhs( rhs ) + {} + + template<typename T> + auto operator && ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator || ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator == ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator != ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator > ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator < ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator >= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator <= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + }; + + template<typename LhsT> + class UnaryExpr : public ITransientExpression { + LhsT m_lhs; + + void streamReconstructedExpression( std::ostream &os ) const override { + os << Catch::Detail::stringify( m_lhs ); + } + + public: + explicit UnaryExpr( LhsT lhs ) + : ITransientExpression{ false, static_cast<bool>(lhs) }, + m_lhs( lhs ) + {} + }; + + // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int) + template<typename LhsT, typename RhsT> + auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); } + template<typename T> + auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; } + template<typename T> + auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; } + + template<typename LhsT, typename RhsT> + auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); } + template<typename T> + auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; } + template<typename T> + auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; } + + template<typename LhsT> + class ExprLhs { + LhsT m_lhs; + public: + explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {} + + template<typename RhsT> + auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { compareEqual( m_lhs, rhs ), m_lhs, "==", rhs }; + } + auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const { + return { m_lhs == rhs, m_lhs, "==", rhs }; + } + + template<typename RhsT> + auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs }; + } + auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const { + return { m_lhs != rhs, m_lhs, "!=", rhs }; + } + + template<typename RhsT> + auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs > rhs), m_lhs, ">", rhs }; + } + template<typename RhsT> + auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs < rhs), m_lhs, "<", rhs }; + } + template<typename RhsT> + auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs >= rhs), m_lhs, ">=", rhs }; + } + template<typename RhsT> + auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs }; + } + template <typename RhsT> + auto operator | (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs }; + } + template <typename RhsT> + auto operator & (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs }; + } + template <typename RhsT> + auto operator ^ (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs }; + } + + template<typename RhsT> + auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<RhsT>::value, + "operator&& is not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename RhsT> + auto operator || ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<RhsT>::value, + "operator|| is not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + auto makeUnaryExpr() const -> UnaryExpr<LhsT> { + return UnaryExpr<LhsT>{ m_lhs }; + } + }; + + void handleExpression( ITransientExpression const& expr ); + + template<typename T> + void handleExpression( ExprLhs<T> const& expr ) { + handleExpression( expr.makeUnaryExpr() ); + } + + struct Decomposer { + template<typename T> + auto operator <= ( T const& lhs ) -> ExprLhs<T const&> { + return ExprLhs<T const&>{ lhs }; + } + + auto operator <=( bool value ) -> ExprLhs<bool> { + return ExprLhs<bool>{ value }; + } + }; + +} // end namespace Catch + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// end catch_decomposer.h +// start catch_interfaces_capture.h + +#include <string> +#include <chrono> + +namespace Catch { + + class AssertionResult; + struct AssertionInfo; + struct SectionInfo; + struct SectionEndInfo; + struct MessageInfo; + struct MessageBuilder; + struct Counts; + struct AssertionReaction; + struct SourceLineInfo; + + struct ITransientExpression; + struct IGeneratorTracker; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + struct BenchmarkInfo; + template <typename Duration = std::chrono::duration<double, std::nano>> + struct BenchmarkStats; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + struct IResultCapture { + + virtual ~IResultCapture(); + + virtual bool sectionStarted( SectionInfo const& sectionInfo, + Counts& assertions ) = 0; + virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; + + virtual auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + virtual void benchmarkPreparing( std::string const& name ) = 0; + virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0; + virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0; + virtual void benchmarkFailed( std::string const& error ) = 0; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + virtual void pushScopedMessage( MessageInfo const& message ) = 0; + virtual void popScopedMessage( MessageInfo const& message ) = 0; + + virtual void emplaceUnscopedMessage( MessageBuilder const& builder ) = 0; + + virtual void handleFatalErrorCondition( StringRef message ) = 0; + + virtual void handleExpr + ( AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction ) = 0; + virtual void handleMessage + ( AssertionInfo const& info, + ResultWas::OfType resultType, + StringRef const& message, + AssertionReaction& reaction ) = 0; + virtual void handleUnexpectedExceptionNotThrown + ( AssertionInfo const& info, + AssertionReaction& reaction ) = 0; + virtual void handleUnexpectedInflightException + ( AssertionInfo const& info, + std::string const& message, + AssertionReaction& reaction ) = 0; + virtual void handleIncomplete + ( AssertionInfo const& info ) = 0; + virtual void handleNonExpr + ( AssertionInfo const &info, + ResultWas::OfType resultType, + AssertionReaction &reaction ) = 0; + + virtual bool lastAssertionPassed() = 0; + virtual void assertionPassed() = 0; + + // Deprecated, do not use: + virtual std::string getCurrentTestName() const = 0; + virtual const AssertionResult* getLastResult() const = 0; + virtual void exceptionEarlyReported() = 0; + }; + + IResultCapture& getResultCapture(); +} + +// end catch_interfaces_capture.h +namespace Catch { + + struct TestFailureException{}; + struct AssertionResultData; + struct IResultCapture; + class RunContext; + + class LazyExpression { + friend class AssertionHandler; + friend struct AssertionStats; + friend class RunContext; + + ITransientExpression const* m_transientExpression = nullptr; + bool m_isNegated; + public: + LazyExpression( bool isNegated ); + LazyExpression( LazyExpression const& other ); + LazyExpression& operator = ( LazyExpression const& ) = delete; + + explicit operator bool() const; + + friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&; + }; + + struct AssertionReaction { + bool shouldDebugBreak = false; + bool shouldThrow = false; + }; + + class AssertionHandler { + AssertionInfo m_assertionInfo; + AssertionReaction m_reaction; + bool m_completed = false; + IResultCapture& m_resultCapture; + + public: + AssertionHandler + ( StringRef const& macroName, + SourceLineInfo const& lineInfo, + StringRef capturedExpression, + ResultDisposition::Flags resultDisposition ); + ~AssertionHandler() { + if ( !m_completed ) { + m_resultCapture.handleIncomplete( m_assertionInfo ); + } + } + + template<typename T> + void handleExpr( ExprLhs<T> const& expr ) { + handleExpr( expr.makeUnaryExpr() ); + } + void handleExpr( ITransientExpression const& expr ); + + void handleMessage(ResultWas::OfType resultType, StringRef const& message); + + void handleExceptionThrownAsExpected(); + void handleUnexpectedExceptionNotThrown(); + void handleExceptionNotThrownAsExpected(); + void handleThrowingCallSkipped(); + void handleUnexpectedInflightException(); + + void complete(); + void setCompleted(); + + // query + auto allowThrows() const -> bool; + }; + + void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString ); + +} // namespace Catch + +// end catch_assertionhandler.h +// start catch_message.h + +#include <string> +#include <vector> + +namespace Catch { + + struct MessageInfo { + MessageInfo( StringRef const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ); + + StringRef macroName; + std::string message; + SourceLineInfo lineInfo; + ResultWas::OfType type; + unsigned int sequence; + + bool operator == ( MessageInfo const& other ) const; + bool operator < ( MessageInfo const& other ) const; + private: + static unsigned int globalCount; + }; + + struct MessageStream { + + template<typename T> + MessageStream& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + ReusableStringStream m_stream; + }; + + struct MessageBuilder : MessageStream { + MessageBuilder( StringRef const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ); + + template<typename T> + MessageBuilder& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + MessageInfo m_info; + }; + + class ScopedMessage { + public: + explicit ScopedMessage( MessageBuilder const& builder ); + ScopedMessage( ScopedMessage& duplicate ) = delete; + ScopedMessage( ScopedMessage&& old ); + ~ScopedMessage(); + + MessageInfo m_info; + bool m_moved; + }; + + class Capturer { + std::vector<MessageInfo> m_messages; + IResultCapture& m_resultCapture = getResultCapture(); + size_t m_captured = 0; + public: + Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ); + ~Capturer(); + + void captureValue( size_t index, std::string const& value ); + + template<typename T> + void captureValues( size_t index, T const& value ) { + captureValue( index, Catch::Detail::stringify( value ) ); + } + + template<typename T, typename... Ts> + void captureValues( size_t index, T const& value, Ts const&... values ) { + captureValue( index, Catch::Detail::stringify(value) ); + captureValues( index+1, values... ); + } + }; + +} // end namespace Catch + +// end catch_message.h +#if !defined(CATCH_CONFIG_DISABLE) + +#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION) + #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__ +#else + #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" +#endif + +#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + +/////////////////////////////////////////////////////////////////////////////// +// Another way to speed-up compilation is to omit local try-catch for REQUIRE* +// macros. +#define INTERNAL_CATCH_TRY +#define INTERNAL_CATCH_CATCH( capturer ) + +#else // CATCH_CONFIG_FAST_COMPILE + +#define INTERNAL_CATCH_TRY try +#define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); } + +#endif + +#define INTERNAL_CATCH_REACT( handler ) handler.complete(); + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ + do { \ + CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ + INTERNAL_CATCH_TRY { \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ + if( Catch::getResultCapture().lastAssertionPassed() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ + if( !Catch::getResultCapture().lastAssertionPassed() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ + try { \ + static_cast<void>(__VA_ARGS__); \ + catchAssertionHandler.handleExceptionNotThrownAsExpected(); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleUnexpectedInflightException(); \ + } \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(__VA_ARGS__); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleExceptionThrownAsExpected(); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(expr); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( exceptionType const& ) { \ + catchAssertionHandler.handleExceptionThrownAsExpected(); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleUnexpectedInflightException(); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \ + catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \ + auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \ + varName.captureValues( 0, __VA_ARGS__ ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_INFO( macroName, log ) \ + Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ); + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \ + Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ) + +/////////////////////////////////////////////////////////////////////////////// +// Although this is matcher-based, it can be used with just a string +#define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(__VA_ARGS__); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( ... ) { \ + Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +#endif // CATCH_CONFIG_DISABLE + +// end catch_capture.hpp +// start catch_section.h + +// start catch_section_info.h + +// start catch_totals.h + +#include <cstddef> + +namespace Catch { + + struct Counts { + Counts operator - ( Counts const& other ) const; + Counts& operator += ( Counts const& other ); + + std::size_t total() const; + bool allPassed() const; + bool allOk() const; + + std::size_t passed = 0; + std::size_t failed = 0; + std::size_t failedButOk = 0; + }; + + struct Totals { + + Totals operator - ( Totals const& other ) const; + Totals& operator += ( Totals const& other ); + + Totals delta( Totals const& prevTotals ) const; + + int error = 0; + Counts assertions; + Counts testCases; + }; +} + +// end catch_totals.h +#include <string> + +namespace Catch { + + struct SectionInfo { + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name ); + + // Deprecated + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& ) : SectionInfo( _lineInfo, _name ) {} + + std::string name; + std::string description; // !Deprecated: this will always be empty + SourceLineInfo lineInfo; + }; + + struct SectionEndInfo { + SectionInfo sectionInfo; + Counts prevAssertions; + double durationInSeconds; + }; + +} // end namespace Catch + +// end catch_section_info.h +// start catch_timer.h + +#include <cstdint> + +namespace Catch { + + auto getCurrentNanosecondsSinceEpoch() -> uint64_t; + auto getEstimatedClockResolution() -> uint64_t; + + class Timer { + uint64_t m_nanoseconds = 0; + public: + void start(); + auto getElapsedNanoseconds() const -> uint64_t; + auto getElapsedMicroseconds() const -> uint64_t; + auto getElapsedMilliseconds() const -> unsigned int; + auto getElapsedSeconds() const -> double; + }; + +} // namespace Catch + +// end catch_timer.h +#include <string> + +namespace Catch { + + class Section : NonCopyable { + public: + Section( SectionInfo const& info ); + ~Section(); + + // This indicates whether the section should be executed or not + explicit operator bool() const; + + private: + SectionInfo m_info; + + std::string m_name; + Counts m_assertions; + bool m_sectionIncluded; + Timer m_timer; + }; + +} // end namespace Catch + +#define INTERNAL_CATCH_SECTION( ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +// end catch_section.h +// start catch_interfaces_exception.h + +// start catch_interfaces_registry_hub.h + +#include <string> +#include <memory> + +namespace Catch { + + class TestCase; + struct ITestCaseRegistry; + struct IExceptionTranslatorRegistry; + struct IExceptionTranslator; + struct IReporterRegistry; + struct IReporterFactory; + struct ITagAliasRegistry; + struct IMutableEnumValuesRegistry; + + class StartupExceptionRegistry; + + using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>; + + struct IRegistryHub { + virtual ~IRegistryHub(); + + virtual IReporterRegistry const& getReporterRegistry() const = 0; + virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; + virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; + virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0; + + virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0; + }; + + struct IMutableRegistryHub { + virtual ~IMutableRegistryHub(); + virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0; + virtual void registerListener( IReporterFactoryPtr const& factory ) = 0; + virtual void registerTest( TestCase const& testInfo ) = 0; + virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; + virtual void registerStartupException() noexcept = 0; + virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0; + }; + + IRegistryHub const& getRegistryHub(); + IMutableRegistryHub& getMutableRegistryHub(); + void cleanUp(); + std::string translateActiveException(); + +} + +// end catch_interfaces_registry_hub.h +#if defined(CATCH_CONFIG_DISABLE) + #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \ + static std::string translatorName( signature ) +#endif + +#include <exception> +#include <string> +#include <vector> + +namespace Catch { + using exceptionTranslateFunction = std::string(*)(); + + struct IExceptionTranslator; + using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>; + + struct IExceptionTranslator { + virtual ~IExceptionTranslator(); + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; + }; + + struct IExceptionTranslatorRegistry { + virtual ~IExceptionTranslatorRegistry(); + + virtual std::string translateActiveException() const = 0; + }; + + class ExceptionTranslatorRegistrar { + template<typename T> + class ExceptionTranslator : public IExceptionTranslator { + public: + + ExceptionTranslator( std::string(*translateFunction)( T& ) ) + : m_translateFunction( translateFunction ) + {} + + std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override { +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + return ""; +#else + try { + if( it == itEnd ) + std::rethrow_exception(std::current_exception()); + else + return (*it)->translate( it+1, itEnd ); + } + catch( T& ex ) { + return m_translateFunction( ex ); + } +#endif + } + + protected: + std::string(*m_translateFunction)( T& ); + }; + + public: + template<typename T> + ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { + getMutableRegistryHub().registerTranslator + ( new ExceptionTranslator<T>( translateFunction ) ); + } + }; +} + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) + +// end catch_interfaces_exception.h +// start catch_approx.h + +#include <type_traits> + +namespace Catch { +namespace Detail { + + class Approx { + private: + bool equalityComparisonImpl(double other) const; + // Validates the new margin (margin >= 0) + // out-of-line to avoid including stdexcept in the header + void setMargin(double margin); + // Validates the new epsilon (0 < epsilon < 1) + // out-of-line to avoid including stdexcept in the header + void setEpsilon(double epsilon); + + public: + explicit Approx ( double value ); + + static Approx custom(); + + Approx operator-() const; + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx operator()( T const& value ) { + Approx approx( static_cast<double>(value) ); + approx.m_epsilon = m_epsilon; + approx.m_margin = m_margin; + approx.m_scale = m_scale; + return approx; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + explicit Approx( T const& value ): Approx(static_cast<double>(value)) + {} + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator == ( const T& lhs, Approx const& rhs ) { + auto lhs_v = static_cast<double>(lhs); + return rhs.equalityComparisonImpl(lhs_v); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator == ( Approx const& lhs, const T& rhs ) { + return operator==( rhs, lhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator != ( T const& lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator != ( Approx const& lhs, T const& rhs ) { + return !operator==( rhs, lhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator <= ( T const& lhs, Approx const& rhs ) { + return static_cast<double>(lhs) < rhs.m_value || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator <= ( Approx const& lhs, T const& rhs ) { + return lhs.m_value < static_cast<double>(rhs) || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator >= ( T const& lhs, Approx const& rhs ) { + return static_cast<double>(lhs) > rhs.m_value || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator >= ( Approx const& lhs, T const& rhs ) { + return lhs.m_value > static_cast<double>(rhs) || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& epsilon( T const& newEpsilon ) { + double epsilonAsDouble = static_cast<double>(newEpsilon); + setEpsilon(epsilonAsDouble); + return *this; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& margin( T const& newMargin ) { + double marginAsDouble = static_cast<double>(newMargin); + setMargin(marginAsDouble); + return *this; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& scale( T const& newScale ) { + m_scale = static_cast<double>(newScale); + return *this; + } + + std::string toString() const; + + private: + double m_epsilon; + double m_margin; + double m_scale; + double m_value; + }; +} // end namespace Detail + +namespace literals { + Detail::Approx operator "" _a(long double val); + Detail::Approx operator "" _a(unsigned long long val); +} // end namespace literals + +template<> +struct StringMaker<Catch::Detail::Approx> { + static std::string convert(Catch::Detail::Approx const& value); +}; + +} // end namespace Catch + +// end catch_approx.h +// start catch_string_manip.h + +#include <string> +#include <iosfwd> +#include <vector> + +namespace Catch { + + bool startsWith( std::string const& s, std::string const& prefix ); + bool startsWith( std::string const& s, char prefix ); + bool endsWith( std::string const& s, std::string const& suffix ); + bool endsWith( std::string const& s, char suffix ); + bool contains( std::string const& s, std::string const& infix ); + void toLowerInPlace( std::string& s ); + std::string toLower( std::string const& s ); + //! Returns a new string without whitespace at the start/end + std::string trim( std::string const& str ); + //! Returns a substring of the original ref without whitespace. Beware lifetimes! + StringRef trim(StringRef ref); + + // !!! Be aware, returns refs into original string - make sure original string outlives them + std::vector<StringRef> splitStringRef( StringRef str, char delimiter ); + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); + + struct pluralise { + pluralise( std::size_t count, std::string const& label ); + + friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); + + std::size_t m_count; + std::string m_label; + }; +} + +// end catch_string_manip.h +#ifndef CATCH_CONFIG_DISABLE_MATCHERS +// start catch_capture_matchers.h + +// start catch_matchers.h + +#include <string> +#include <vector> + +namespace Catch { +namespace Matchers { + namespace Impl { + + template<typename ArgT> struct MatchAllOf; + template<typename ArgT> struct MatchAnyOf; + template<typename ArgT> struct MatchNotOf; + + class MatcherUntypedBase { + public: + MatcherUntypedBase() = default; + MatcherUntypedBase ( MatcherUntypedBase const& ) = default; + MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete; + std::string toString() const; + + protected: + virtual ~MatcherUntypedBase(); + virtual std::string describe() const = 0; + mutable std::string m_cachedToString; + }; + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wnon-virtual-dtor" +#endif + + template<typename ObjectT> + struct MatcherMethod { + virtual bool match( ObjectT const& arg ) const = 0; + }; + +#if defined(__OBJC__) + // Hack to fix Catch GH issue #1661. Could use id for generic Object support. + // use of const for Object pointers is very uncommon and under ARC it causes some kind of signature mismatch that breaks compilation + template<> + struct MatcherMethod<NSString*> { + virtual bool match( NSString* arg ) const = 0; + }; +#endif + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + + template<typename T> + struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> { + + MatchAllOf<T> operator && ( MatcherBase const& other ) const; + MatchAnyOf<T> operator || ( MatcherBase const& other ) const; + MatchNotOf<T> operator ! () const; + }; + + template<typename ArgT> + struct MatchAllOf : MatcherBase<ArgT> { + bool match( ArgT const& arg ) const override { + for( auto matcher : m_matchers ) { + if (!matcher->match(arg)) + return false; + } + return true; + } + std::string describe() const override { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + bool first = true; + for( auto matcher : m_matchers ) { + if( first ) + first = false; + else + description += " and "; + description += matcher->toString(); + } + description += " )"; + return description; + } + + MatchAllOf<ArgT> operator && ( MatcherBase<ArgT> const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; + } + + std::vector<MatcherBase<ArgT> const*> m_matchers; + }; + template<typename ArgT> + struct MatchAnyOf : MatcherBase<ArgT> { + + bool match( ArgT const& arg ) const override { + for( auto matcher : m_matchers ) { + if (matcher->match(arg)) + return true; + } + return false; + } + std::string describe() const override { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + bool first = true; + for( auto matcher : m_matchers ) { + if( first ) + first = false; + else + description += " or "; + description += matcher->toString(); + } + description += " )"; + return description; + } + + MatchAnyOf<ArgT> operator || ( MatcherBase<ArgT> const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; + } + + std::vector<MatcherBase<ArgT> const*> m_matchers; + }; + + template<typename ArgT> + struct MatchNotOf : MatcherBase<ArgT> { + + MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} + + bool match( ArgT const& arg ) const override { + return !m_underlyingMatcher.match( arg ); + } + + std::string describe() const override { + return "not " + m_underlyingMatcher.toString(); + } + MatcherBase<ArgT> const& m_underlyingMatcher; + }; + + template<typename T> + MatchAllOf<T> MatcherBase<T>::operator && ( MatcherBase const& other ) const { + return MatchAllOf<T>() && *this && other; + } + template<typename T> + MatchAnyOf<T> MatcherBase<T>::operator || ( MatcherBase const& other ) const { + return MatchAnyOf<T>() || *this || other; + } + template<typename T> + MatchNotOf<T> MatcherBase<T>::operator ! () const { + return MatchNotOf<T>( *this ); + } + + } // namespace Impl + +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch + +// end catch_matchers.h +// start catch_matchers_exception.hpp + +namespace Catch { +namespace Matchers { +namespace Exception { + +class ExceptionMessageMatcher : public MatcherBase<std::exception> { + std::string m_message; +public: + + ExceptionMessageMatcher(std::string const& message): + m_message(message) + {} + + bool match(std::exception const& ex) const override; + + std::string describe() const override; +}; + +} // namespace Exception + +Exception::ExceptionMessageMatcher Message(std::string const& message); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_exception.hpp +// start catch_matchers_floating.h + +namespace Catch { +namespace Matchers { + + namespace Floating { + + enum class FloatingPointKind : uint8_t; + + struct WithinAbsMatcher : MatcherBase<double> { + WithinAbsMatcher(double target, double margin); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_margin; + }; + + struct WithinUlpsMatcher : MatcherBase<double> { + WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + uint64_t m_ulps; + FloatingPointKind m_type; + }; + + // Given IEEE-754 format for floats and doubles, we can assume + // that float -> double promotion is lossless. Given this, we can + // assume that if we do the standard relative comparison of + // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get + // the same result if we do this for floats, as if we do this for + // doubles that were promoted from floats. + struct WithinRelMatcher : MatcherBase<double> { + WithinRelMatcher(double target, double epsilon); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_epsilon; + }; + + } // namespace Floating + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff); + Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff); + Floating::WithinAbsMatcher WithinAbs(double target, double margin); + Floating::WithinRelMatcher WithinRel(double target, double eps); + // defaults epsilon to 100*numeric_limits<double>::epsilon() + Floating::WithinRelMatcher WithinRel(double target); + Floating::WithinRelMatcher WithinRel(float target, float eps); + // defaults epsilon to 100*numeric_limits<float>::epsilon() + Floating::WithinRelMatcher WithinRel(float target); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_floating.h +// start catch_matchers_generic.hpp + +#include <functional> +#include <string> + +namespace Catch { +namespace Matchers { +namespace Generic { + +namespace Detail { + std::string finalizeDescription(const std::string& desc); +} + +template <typename T> +class PredicateMatcher : public MatcherBase<T> { + std::function<bool(T const&)> m_predicate; + std::string m_description; +public: + + PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr) + :m_predicate(std::move(elem)), + m_description(Detail::finalizeDescription(descr)) + {} + + bool match( T const& item ) const override { + return m_predicate(item); + } + + std::string describe() const override { + return m_description; + } +}; + +} // namespace Generic + + // The following functions create the actual matcher objects. + // The user has to explicitly specify type to the function, because + // inferring std::function<bool(T const&)> is hard (but possible) and + // requires a lot of TMP. + template<typename T> + Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") { + return Generic::PredicateMatcher<T>(predicate, description); + } + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_generic.hpp +// start catch_matchers_string.h + +#include <string> + +namespace Catch { +namespace Matchers { + + namespace StdString { + + struct CasedString + { + CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); + std::string adjustString( std::string const& str ) const; + std::string caseSensitivitySuffix() const; + + CaseSensitive::Choice m_caseSensitivity; + std::string m_str; + }; + + struct StringMatcherBase : MatcherBase<std::string> { + StringMatcherBase( std::string const& operation, CasedString const& comparator ); + std::string describe() const override; + + CasedString m_comparator; + std::string m_operation; + }; + + struct EqualsMatcher : StringMatcherBase { + EqualsMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct ContainsMatcher : StringMatcherBase { + ContainsMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct StartsWithMatcher : StringMatcherBase { + StartsWithMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct EndsWithMatcher : StringMatcherBase { + EndsWithMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + + struct RegexMatcher : MatcherBase<std::string> { + RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity ); + bool match( std::string const& matchee ) const override; + std::string describe() const override; + + private: + std::string m_regex; + CaseSensitive::Choice m_caseSensitivity; + }; + + } // namespace StdString + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_string.h +// start catch_matchers_vector.h + +#include <algorithm> + +namespace Catch { +namespace Matchers { + + namespace Vector { + template<typename T, typename Alloc> + struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> { + + ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} + + bool match(std::vector<T, Alloc> const &v) const override { + for (auto const& el : v) { + if (el == m_comparator) { + return true; + } + } + return false; + } + + std::string describe() const override { + return "Contains: " + ::Catch::Detail::stringify( m_comparator ); + } + + T const& m_comparator; + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + + ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T, AllocMatch> const &v) const override { + // !TBD: see note in EqualsMatcher + if (m_comparator.size() > v.size()) + return false; + for (auto const& comparator : m_comparator) { + auto present = false; + for (const auto& el : v) { + if (el == comparator) { + present = true; + break; + } + } + if (!present) { + return false; + } + } + return true; + } + std::string describe() const override { + return "Contains: " + ::Catch::Detail::stringify( m_comparator ); + } + + std::vector<T, AllocComp> const& m_comparator; + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + + EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T, AllocMatch> const &v) const override { + // !TBD: This currently works if all elements can be compared using != + // - a more general approach would be via a compare template that defaults + // to using !=. but could be specialised for, e.g. std::vector<T, Alloc> etc + // - then just call that directly + if (m_comparator.size() != v.size()) + return false; + for (std::size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != v[i]) + return false; + return true; + } + std::string describe() const override { + return "Equals: " + ::Catch::Detail::stringify( m_comparator ); + } + std::vector<T, AllocComp> const& m_comparator; + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> { + + ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T, AllocMatch> const &v) const override { + if (m_comparator.size() != v.size()) + return false; + for (std::size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != approx(v[i])) + return false; + return true; + } + std::string describe() const override { + return "is approx: " + ::Catch::Detail::stringify( m_comparator ); + } + template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + ApproxMatcher& epsilon( T const& newEpsilon ) { + approx.epsilon(newEpsilon); + return *this; + } + template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + ApproxMatcher& margin( T const& newMargin ) { + approx.margin(newMargin); + return *this; + } + template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + ApproxMatcher& scale( T const& newScale ) { + approx.scale(newScale); + return *this; + } + + std::vector<T, AllocComp> const& m_comparator; + mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom(); + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {} + bool match(std::vector<T, AllocMatch> const& vec) const override { + // Note: This is a reimplementation of std::is_permutation, + // because I don't want to include <algorithm> inside the common path + if (m_target.size() != vec.size()) { + return false; + } + return std::is_permutation(m_target.begin(), m_target.end(), vec.begin()); + } + + std::string describe() const override { + return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target); + } + private: + std::vector<T, AllocComp> const& m_target; + }; + + } // namespace Vector + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vector<T, AllocComp> const& comparator ) { + return Vector::ContainsMatcher<T, AllocComp, AllocMatch>( comparator ); + } + + template<typename T, typename Alloc = std::allocator<T>> + Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher<T, Alloc>( comparator ); + } + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<T, AllocComp> const& comparator ) { + return Vector::EqualsMatcher<T, AllocComp, AllocMatch>( comparator ); + } + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<T, AllocComp> const& comparator ) { + return Vector::ApproxMatcher<T, AllocComp, AllocMatch>( comparator ); + } + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEquals(std::vector<T, AllocComp> const& target) { + return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>( target ); + } + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_vector.h +namespace Catch { + + template<typename ArgT, typename MatcherT> + class MatchExpr : public ITransientExpression { + ArgT const& m_arg; + MatcherT m_matcher; + StringRef m_matcherString; + public: + MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString ) + : ITransientExpression{ true, matcher.match( arg ) }, + m_arg( arg ), + m_matcher( matcher ), + m_matcherString( matcherString ) + {} + + void streamReconstructedExpression( std::ostream &os ) const override { + auto matcherAsString = m_matcher.toString(); + os << Catch::Detail::stringify( m_arg ) << ' '; + if( matcherAsString == Detail::unprintableString ) + os << m_matcherString; + else + os << matcherAsString; + } + }; + + using StringMatcher = Matchers::Impl::MatcherBase<std::string>; + + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ); + + template<typename ArgT, typename MatcherT> + auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString ) -> MatchExpr<ArgT, MatcherT> { + return MatchExpr<ArgT, MatcherT>( arg, matcher, matcherString ); + } + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + INTERNAL_CATCH_TRY { \ + catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \ + } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(__VA_ARGS__ ); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( exceptionType const& ex ) { \ + catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleUnexpectedInflightException(); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +// end catch_capture_matchers.h +#endif +// start catch_generators.hpp + +// start catch_interfaces_generatortracker.h + + +#include <memory> + +namespace Catch { + + namespace Generators { + class GeneratorUntypedBase { + public: + GeneratorUntypedBase() = default; + virtual ~GeneratorUntypedBase(); + // Attempts to move the generator to the next element + // + // Returns true iff the move succeeded (and a valid element + // can be retrieved). + virtual bool next() = 0; + }; + using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>; + + } // namespace Generators + + struct IGeneratorTracker { + virtual ~IGeneratorTracker(); + virtual auto hasGenerator() const -> bool = 0; + virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0; + virtual void setGenerator( Generators::GeneratorBasePtr&& generator ) = 0; + }; + +} // namespace Catch + +// end catch_interfaces_generatortracker.h +// start catch_enforce.h + +#include <exception> + +namespace Catch { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + template <typename Ex> + [[noreturn]] + void throw_exception(Ex const& e) { + throw e; + } +#else // ^^ Exceptions are enabled // Exceptions are disabled vv + [[noreturn]] + void throw_exception(std::exception const& e); +#endif + + [[noreturn]] + void throw_logic_error(std::string const& msg); + [[noreturn]] + void throw_domain_error(std::string const& msg); + [[noreturn]] + void throw_runtime_error(std::string const& msg); + +} // namespace Catch; + +#define CATCH_MAKE_MSG(...) \ + (Catch::ReusableStringStream() << __VA_ARGS__).str() + +#define CATCH_INTERNAL_ERROR(...) \ + Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__)) + +#define CATCH_ERROR(...) \ + Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ )) + +#define CATCH_RUNTIME_ERROR(...) \ + Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ )) + +#define CATCH_ENFORCE( condition, ... ) \ + do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false) + +// end catch_enforce.h +#include <memory> +#include <vector> +#include <cassert> + +#include <utility> +#include <exception> + +namespace Catch { + +class GeneratorException : public std::exception { + const char* const m_msg = ""; + +public: + GeneratorException(const char* msg): + m_msg(msg) + {} + + const char* what() const noexcept override final; +}; + +namespace Generators { + + // !TBD move this into its own location? + namespace pf{ + template<typename T, typename... Args> + std::unique_ptr<T> make_unique( Args&&... args ) { + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); + } + } + + template<typename T> + struct IGenerator : GeneratorUntypedBase { + virtual ~IGenerator() = default; + + // Returns the current element of the generator + // + // \Precondition The generator is either freshly constructed, + // or the last call to `next()` returned true + virtual T const& get() const = 0; + using type = T; + }; + + template<typename T> + class SingleValueGenerator final : public IGenerator<T> { + T m_value; + public: + SingleValueGenerator(T&& value) : m_value(std::move(value)) {} + + T const& get() const override { + return m_value; + } + bool next() override { + return false; + } + }; + + template<typename T> + class FixedValuesGenerator final : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "FixedValuesGenerator does not support bools because of std::vector<bool>" + "specialization, use SingleValue Generator instead."); + std::vector<T> m_values; + size_t m_idx = 0; + public: + FixedValuesGenerator( std::initializer_list<T> values ) : m_values( values ) {} + + T const& get() const override { + return m_values[m_idx]; + } + bool next() override { + ++m_idx; + return m_idx < m_values.size(); + } + }; + + template <typename T> + class GeneratorWrapper final { + std::unique_ptr<IGenerator<T>> m_generator; + public: + GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator): + m_generator(std::move(generator)) + {} + T const& get() const { + return m_generator->get(); + } + bool next() { + return m_generator->next(); + } + }; + + template <typename T> + GeneratorWrapper<T> value(T&& value) { + return GeneratorWrapper<T>(pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value))); + } + template <typename T> + GeneratorWrapper<T> values(std::initializer_list<T> values) { + return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values)); + } + + template<typename T> + class Generators : public IGenerator<T> { + std::vector<GeneratorWrapper<T>> m_generators; + size_t m_current = 0; + + void populate(GeneratorWrapper<T>&& generator) { + m_generators.emplace_back(std::move(generator)); + } + void populate(T&& val) { + m_generators.emplace_back(value(std::forward<T>(val))); + } + template<typename U> + void populate(U&& val) { + populate(T(std::forward<U>(val))); + } + template<typename U, typename... Gs> + void populate(U&& valueOrGenerator, Gs &&... moreGenerators) { + populate(std::forward<U>(valueOrGenerator)); + populate(std::forward<Gs>(moreGenerators)...); + } + + public: + template <typename... Gs> + Generators(Gs &&... moreGenerators) { + m_generators.reserve(sizeof...(Gs)); + populate(std::forward<Gs>(moreGenerators)...); + } + + T const& get() const override { + return m_generators[m_current].get(); + } + + bool next() override { + if (m_current >= m_generators.size()) { + return false; + } + const bool current_status = m_generators[m_current].next(); + if (!current_status) { + ++m_current; + } + return m_current < m_generators.size(); + } + }; + + template<typename... Ts> + GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) { + return values<std::tuple<Ts...>>( tuples ); + } + + // Tag type to signal that a generator sequence should convert arguments to a specific type + template <typename T> + struct as {}; + + template<typename T, typename... Gs> + auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreGenerators ) -> Generators<T> { + return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...); + } + template<typename T> + auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators<T> { + return Generators<T>(std::move(generator)); + } + template<typename T, typename... Gs> + auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators<T> { + return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... ); + } + template<typename T, typename U, typename... Gs> + auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Generators<T> { + return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... ); + } + + auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; + + template<typename L> + // Note: The type after -> is weird, because VS2015 cannot parse + // the expression used in the typedef inside, when it is in + // return type. Yeah. + auto generate( SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) { + using UnderlyingType = typename decltype(generatorExpression())::type; + + IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo ); + if (!tracker.hasGenerator()) { + tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression())); + } + + auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() ); + return generator.get(); + } + +} // namespace Generators +} // namespace Catch + +#define GENERATE( ... ) \ + Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) +#define GENERATE_COPY( ... ) \ + Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) +#define GENERATE_REF( ... ) \ + Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) + +// end catch_generators.hpp +// start catch_generators_generic.hpp + +namespace Catch { +namespace Generators { + + template <typename T> + class TakeGenerator : public IGenerator<T> { + GeneratorWrapper<T> m_generator; + size_t m_returned = 0; + size_t m_target; + public: + TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): + m_generator(std::move(generator)), + m_target(target) + { + assert(target != 0 && "Empty generators are not allowed"); + } + T const& get() const override { + return m_generator.get(); + } + bool next() override { + ++m_returned; + if (m_returned >= m_target) { + return false; + } + + const auto success = m_generator.next(); + // If the underlying generator does not contain enough values + // then we cut short as well + if (!success) { + m_returned = m_target; + } + return success; + } + }; + + template <typename T> + GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<T>(pf::make_unique<TakeGenerator<T>>(target, std::move(generator))); + } + + template <typename T, typename Predicate> + class FilterGenerator : public IGenerator<T> { + GeneratorWrapper<T> m_generator; + Predicate m_predicate; + public: + template <typename P = Predicate> + FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator): + m_generator(std::move(generator)), + m_predicate(std::forward<P>(pred)) + { + if (!m_predicate(m_generator.get())) { + // It might happen that there are no values that pass the + // filter. In that case we throw an exception. + auto has_initial_value = next(); + if (!has_initial_value) { + Catch::throw_exception(GeneratorException("No valid value found in filtered generator")); + } + } + } + + T const& get() const override { + return m_generator.get(); + } + + bool next() override { + bool success = m_generator.next(); + if (!success) { + return false; + } + while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true); + return success; + } + }; + + template <typename T, typename Predicate> + GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator)))); + } + + template <typename T> + class RepeatGenerator : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "RepeatGenerator currently does not support bools" + "because of std::vector<bool> specialization"); + GeneratorWrapper<T> m_generator; + mutable std::vector<T> m_returned; + size_t m_target_repeats; + size_t m_current_repeat = 0; + size_t m_repeat_index = 0; + public: + RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator): + m_generator(std::move(generator)), + m_target_repeats(repeats) + { + assert(m_target_repeats > 0 && "Repeat generator must repeat at least once"); + } + + T const& get() const override { + if (m_current_repeat == 0) { + m_returned.push_back(m_generator.get()); + return m_returned.back(); + } + return m_returned[m_repeat_index]; + } + + bool next() override { + // There are 2 basic cases: + // 1) We are still reading the generator + // 2) We are reading our own cache + + // In the first case, we need to poke the underlying generator. + // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache + if (m_current_repeat == 0) { + const auto success = m_generator.next(); + if (!success) { + ++m_current_repeat; + } + return m_current_repeat < m_target_repeats; + } + + // In the second case, we need to move indices forward and check that we haven't run up against the end + ++m_repeat_index; + if (m_repeat_index == m_returned.size()) { + m_repeat_index = 0; + ++m_current_repeat; + } + return m_current_repeat < m_target_repeats; + } + }; + + template <typename T> + GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<T>(pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator))); + } + + template <typename T, typename U, typename Func> + class MapGenerator : public IGenerator<T> { + // TBD: provide static assert for mapping function, for friendly error message + GeneratorWrapper<U> m_generator; + Func m_function; + // To avoid returning dangling reference, we have to save the values + T m_cache; + public: + template <typename F2 = Func> + MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) : + m_generator(std::move(generator)), + m_function(std::forward<F2>(function)), + m_cache(m_function(m_generator.get())) + {} + + T const& get() const override { + return m_cache; + } + bool next() override { + const auto success = m_generator.next(); + if (success) { + m_cache = m_function(m_generator.get()); + } + return success; + } + }; + + template <typename Func, typename U, typename T = FunctionReturnType<Func, U>> + GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { + return GeneratorWrapper<T>( + pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) + ); + } + + template <typename T, typename U, typename Func> + GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { + return GeneratorWrapper<T>( + pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) + ); + } + + template <typename T> + class ChunkGenerator final : public IGenerator<std::vector<T>> { + std::vector<T> m_chunk; + size_t m_chunk_size; + GeneratorWrapper<T> m_generator; + bool m_used_up = false; + public: + ChunkGenerator(size_t size, GeneratorWrapper<T> generator) : + m_chunk_size(size), m_generator(std::move(generator)) + { + m_chunk.reserve(m_chunk_size); + if (m_chunk_size != 0) { + m_chunk.push_back(m_generator.get()); + for (size_t i = 1; i < m_chunk_size; ++i) { + if (!m_generator.next()) { + Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk")); + } + m_chunk.push_back(m_generator.get()); + } + } + } + std::vector<T> const& get() const override { + return m_chunk; + } + bool next() override { + m_chunk.clear(); + for (size_t idx = 0; idx < m_chunk_size; ++idx) { + if (!m_generator.next()) { + return false; + } + m_chunk.push_back(m_generator.get()); + } + return true; + } + }; + + template <typename T> + GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<std::vector<T>>( + pf::make_unique<ChunkGenerator<T>>(size, std::move(generator)) + ); + } + +} // namespace Generators +} // namespace Catch + +// end catch_generators_generic.hpp +// start catch_generators_specific.hpp + +// start catch_context.h + +#include <memory> + +namespace Catch { + + struct IResultCapture; + struct IRunner; + struct IConfig; + struct IMutableContext; + + using IConfigPtr = std::shared_ptr<IConfig const>; + + struct IContext + { + virtual ~IContext(); + + virtual IResultCapture* getResultCapture() = 0; + virtual IRunner* getRunner() = 0; + virtual IConfigPtr const& getConfig() const = 0; + }; + + struct IMutableContext : IContext + { + virtual ~IMutableContext(); + virtual void setResultCapture( IResultCapture* resultCapture ) = 0; + virtual void setRunner( IRunner* runner ) = 0; + virtual void setConfig( IConfigPtr const& config ) = 0; + + private: + static IMutableContext *currentContext; + friend IMutableContext& getCurrentMutableContext(); + friend void cleanUpContext(); + static void createContext(); + }; + + inline IMutableContext& getCurrentMutableContext() + { + if( !IMutableContext::currentContext ) + IMutableContext::createContext(); + // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn) + return *IMutableContext::currentContext; + } + + inline IContext& getCurrentContext() + { + return getCurrentMutableContext(); + } + + void cleanUpContext(); + + class SimplePcg32; + SimplePcg32& rng(); +} + +// end catch_context.h +// start catch_interfaces_config.h + +// start catch_option.hpp + +namespace Catch { + + // An optional type + template<typename T> + class Option { + public: + Option() : nullableValue( nullptr ) {} + Option( T const& _value ) + : nullableValue( new( storage ) T( _value ) ) + {} + Option( Option const& _other ) + : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) + {} + + ~Option() { + reset(); + } + + Option& operator= ( Option const& _other ) { + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } + return *this; + } + Option& operator = ( T const& _value ) { + reset(); + nullableValue = new( storage ) T( _value ); + return *this; + } + + void reset() { + if( nullableValue ) + nullableValue->~T(); + nullableValue = nullptr; + } + + T& operator*() { return *nullableValue; } + T const& operator*() const { return *nullableValue; } + T* operator->() { return nullableValue; } + const T* operator->() const { return nullableValue; } + + T valueOr( T const& defaultValue ) const { + return nullableValue ? *nullableValue : defaultValue; + } + + bool some() const { return nullableValue != nullptr; } + bool none() const { return nullableValue == nullptr; } + + bool operator !() const { return nullableValue == nullptr; } + explicit operator bool() const { + return some(); + } + + private: + T *nullableValue; + alignas(alignof(T)) char storage[sizeof(T)]; + }; + +} // end namespace Catch + +// end catch_option.hpp +#include <chrono> +#include <iosfwd> +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + enum class Verbosity { + Quiet = 0, + Normal, + High + }; + + struct WarnAbout { enum What { + Nothing = 0x00, + NoAssertions = 0x01, + NoTests = 0x02 + }; }; + + struct ShowDurations { enum OrNot { + DefaultForReporter, + Always, + Never + }; }; + struct RunTests { enum InWhatOrder { + InDeclarationOrder, + InLexicographicalOrder, + InRandomOrder + }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; + struct WaitForKeypress { enum When { + Never, + BeforeStart = 1, + BeforeExit = 2, + BeforeStartAndExit = BeforeStart | BeforeExit + }; }; + + class TestSpec; + + struct IConfig : NonCopyable { + + virtual ~IConfig(); + + virtual bool allowThrows() const = 0; + virtual std::ostream& stream() const = 0; + virtual std::string name() const = 0; + virtual bool includeSuccessfulResults() const = 0; + virtual bool shouldDebugBreak() const = 0; + virtual bool warnAboutMissingAssertions() const = 0; + virtual bool warnAboutNoTests() const = 0; + virtual int abortAfter() const = 0; + virtual bool showInvisibles() const = 0; + virtual ShowDurations::OrNot showDurations() const = 0; + virtual TestSpec const& testSpec() const = 0; + virtual bool hasTestFilters() const = 0; + virtual std::vector<std::string> const& getTestsOrTags() const = 0; + virtual RunTests::InWhatOrder runOrder() const = 0; + virtual unsigned int rngSeed() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; + virtual std::vector<std::string> const& getSectionsToRun() const = 0; + virtual Verbosity verbosity() const = 0; + + virtual bool benchmarkNoAnalysis() const = 0; + virtual int benchmarkSamples() const = 0; + virtual double benchmarkConfidenceInterval() const = 0; + virtual unsigned int benchmarkResamples() const = 0; + virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0; + }; + + using IConfigPtr = std::shared_ptr<IConfig const>; +} + +// end catch_interfaces_config.h +// start catch_random_number_generator.h + +#include <cstdint> + +namespace Catch { + + // This is a simple implementation of C++11 Uniform Random Number + // Generator. It does not provide all operators, because Catch2 + // does not use it, but it should behave as expected inside stdlib's + // distributions. + // The implementation is based on the PCG family (http://pcg-random.org) + class SimplePcg32 { + using state_type = std::uint64_t; + public: + using result_type = std::uint32_t; + static constexpr result_type (min)() { + return 0; + } + static constexpr result_type (max)() { + return static_cast<result_type>(-1); + } + + // Provide some default initial state for the default constructor + SimplePcg32():SimplePcg32(0xed743cc4U) {} + + explicit SimplePcg32(result_type seed_); + + void seed(result_type seed_); + void discard(uint64_t skip); + + result_type operator()(); + + private: + friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs); + friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs); + + // In theory we also need operator<< and operator>> + // In practice we do not use them, so we will skip them for now + + std::uint64_t m_state; + // This part of the state determines which "stream" of the numbers + // is chosen -- we take it as a constant for Catch2, so we only + // need to deal with seeding the main state. + // Picked by reading 8 bytes from `/dev/random` :-) + static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL; + }; + +} // end namespace Catch + +// end catch_random_number_generator.h +#include <random> + +namespace Catch { +namespace Generators { + +template <typename Float> +class RandomFloatingGenerator final : public IGenerator<Float> { + Catch::SimplePcg32& m_rng; + std::uniform_real_distribution<Float> m_dist; + Float m_current_number; +public: + + RandomFloatingGenerator(Float a, Float b): + m_rng(rng()), + m_dist(a, b) { + static_cast<void>(next()); + } + + Float const& get() const override { + return m_current_number; + } + bool next() override { + m_current_number = m_dist(m_rng); + return true; + } +}; + +template <typename Integer> +class RandomIntegerGenerator final : public IGenerator<Integer> { + Catch::SimplePcg32& m_rng; + std::uniform_int_distribution<Integer> m_dist; + Integer m_current_number; +public: + + RandomIntegerGenerator(Integer a, Integer b): + m_rng(rng()), + m_dist(a, b) { + static_cast<void>(next()); + } + + Integer const& get() const override { + return m_current_number; + } + bool next() override { + m_current_number = m_dist(m_rng); + return true; + } +}; + +// TODO: Ideally this would be also constrained against the various char types, +// but I don't expect users to run into that in practice. +template <typename T> +typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value, +GeneratorWrapper<T>>::type +random(T a, T b) { + return GeneratorWrapper<T>( + pf::make_unique<RandomIntegerGenerator<T>>(a, b) + ); +} + +template <typename T> +typename std::enable_if<std::is_floating_point<T>::value, +GeneratorWrapper<T>>::type +random(T a, T b) { + return GeneratorWrapper<T>( + pf::make_unique<RandomFloatingGenerator<T>>(a, b) + ); +} + +template <typename T> +class RangeGenerator final : public IGenerator<T> { + T m_current; + T m_end; + T m_step; + bool m_positive; + +public: + RangeGenerator(T const& start, T const& end, T const& step): + m_current(start), + m_end(end), + m_step(step), + m_positive(m_step > T(0)) + { + assert(m_current != m_end && "Range start and end cannot be equal"); + assert(m_step != T(0) && "Step size cannot be zero"); + assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && "Step moves away from end"); + } + + RangeGenerator(T const& start, T const& end): + RangeGenerator(start, end, (start < end) ? T(1) : T(-1)) + {} + + T const& get() const override { + return m_current; + } + + bool next() override { + m_current += m_step; + return (m_positive) ? (m_current < m_end) : (m_current > m_end); + } +}; + +template <typename T> +GeneratorWrapper<T> range(T const& start, T const& end, T const& step) { + static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric"); + return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step)); +} + +template <typename T> +GeneratorWrapper<T> range(T const& start, T const& end) { + static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer"); + return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end)); +} + +template <typename T> +class IteratorGenerator final : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "IteratorGenerator currently does not support bools" + "because of std::vector<bool> specialization"); + + std::vector<T> m_elems; + size_t m_current = 0; +public: + template <typename InputIterator, typename InputSentinel> + IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) { + if (m_elems.empty()) { + Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values")); + } + } + + T const& get() const override { + return m_elems[m_current]; + } + + bool next() override { + ++m_current; + return m_current != m_elems.size(); + } +}; + +template <typename InputIterator, + typename InputSentinel, + typename ResultType = typename std::iterator_traits<InputIterator>::value_type> +GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) { + return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to)); +} + +template <typename Container, + typename ResultType = typename Container::value_type> +GeneratorWrapper<ResultType> from_range(Container const& cnt) { + return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end())); +} + +} // namespace Generators +} // namespace Catch + +// end catch_generators_specific.hpp + +// These files are included here so the single_include script doesn't put them +// in the conditionally compiled sections +// start catch_test_case_info.h + +#include <string> +#include <vector> +#include <memory> + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + struct ITestInvoker; + + struct TestCaseInfo { + enum SpecialProperties{ + None = 0, + IsHidden = 1 << 1, + ShouldFail = 1 << 2, + MayFail = 1 << 3, + Throws = 1 << 4, + NonPortable = 1 << 5, + Benchmark = 1 << 6 + }; + + TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::vector<std::string> const& _tags, + SourceLineInfo const& _lineInfo ); + + friend void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ); + + bool isHidden() const; + bool throws() const; + bool okToFail() const; + bool expectedToFail() const; + + std::string tagsAsString() const; + + std::string name; + std::string className; + std::string description; + std::vector<std::string> tags; + std::vector<std::string> lcaseTags; + SourceLineInfo lineInfo; + SpecialProperties properties; + }; + + class TestCase : public TestCaseInfo { + public: + + TestCase( ITestInvoker* testCase, TestCaseInfo&& info ); + + TestCase withName( std::string const& _newName ) const; + + void invoke() const; + + TestCaseInfo const& getTestCaseInfo() const; + + bool operator == ( TestCase const& other ) const; + bool operator < ( TestCase const& other ) const; + + private: + std::shared_ptr<ITestInvoker> test; + }; + + TestCase makeTestCase( ITestInvoker* testCase, + std::string const& className, + NameAndTags const& nameAndTags, + SourceLineInfo const& lineInfo ); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_test_case_info.h +// start catch_interfaces_runner.h + +namespace Catch { + + struct IRunner { + virtual ~IRunner(); + virtual bool aborting() const = 0; + }; +} + +// end catch_interfaces_runner.h + +#ifdef __OBJC__ +// start catch_objc.hpp + +#import <objc/runtime.h> + +#include <string> + +// NB. Any general catch headers included here must be included +// in catch.hpp first to make sure they are included by the single +// header for non obj-usage + +/////////////////////////////////////////////////////////////////////////////// +// This protocol is really only here for (self) documenting purposes, since +// all its methods are optional. +@protocol OcFixture + +@optional + +-(void) setUp; +-(void) tearDown; + +@end + +namespace Catch { + + class OcMethod : public ITestInvoker { + + public: + OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} + + virtual void invoke() const { + id obj = [[m_cls alloc] init]; + + performOptionalSelector( obj, @selector(setUp) ); + performOptionalSelector( obj, m_sel ); + performOptionalSelector( obj, @selector(tearDown) ); + + arcSafeRelease( obj ); + } + private: + virtual ~OcMethod() {} + + Class m_cls; + SEL m_sel; + }; + + namespace Detail{ + + inline std::string getAnnotation( Class cls, + std::string const& annotationName, + std::string const& testCaseName ) { + NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; + SEL sel = NSSelectorFromString( selStr ); + arcSafeRelease( selStr ); + id value = performOptionalSelector( cls, sel ); + if( value ) + return [(NSString*)value UTF8String]; + return ""; + } + } + + inline std::size_t registerTestMethods() { + std::size_t noTestMethods = 0; + int noClasses = objc_getClassList( nullptr, 0 ); + + Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); + objc_getClassList( classes, noClasses ); + + for( int c = 0; c < noClasses; c++ ) { + Class cls = classes[c]; + { + u_int count; + Method* methods = class_copyMethodList( cls, &count ); + for( u_int m = 0; m < count ; m++ ) { + SEL selector = method_getName(methods[m]); + std::string methodName = sel_getName(selector); + if( startsWith( methodName, "Catch_TestCase_" ) ) { + std::string testCaseName = methodName.substr( 15 ); + std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); + std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); + const char* className = class_getName( cls ); + + getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo("",0) ) ); + noTestMethods++; + } + } + free(methods); + } + } + return noTestMethods; + } + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) + + namespace Matchers { + namespace Impl { + namespace NSStringMatchers { + + struct StringHolder : MatcherBase<NSString*>{ + StringHolder( NSString* substr ) : m_substr( [substr copy] ){} + StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} + StringHolder() { + arcSafeRelease( m_substr ); + } + + bool match( NSString* str ) const override { + return false; + } + + NSString* CATCH_ARC_STRONG m_substr; + }; + + struct Equals : StringHolder { + Equals( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str isEqualToString:m_substr]; + } + + std::string describe() const override { + return "equals string: " + Catch::Detail::stringify( m_substr ); + } + }; + + struct Contains : StringHolder { + Contains( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location != NSNotFound; + } + + std::string describe() const override { + return "contains string: " + Catch::Detail::stringify( m_substr ); + } + }; + + struct StartsWith : StringHolder { + StartsWith( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == 0; + } + + std::string describe() const override { + return "starts with: " + Catch::Detail::stringify( m_substr ); + } + }; + struct EndsWith : StringHolder { + EndsWith( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == [str length] - [m_substr length]; + } + + std::string describe() const override { + return "ends with: " + Catch::Detail::stringify( m_substr ); + } + }; + + } // namespace NSStringMatchers + } // namespace Impl + + inline Impl::NSStringMatchers::Equals + Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } + + inline Impl::NSStringMatchers::Contains + Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } + + inline Impl::NSStringMatchers::StartsWith + StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } + + inline Impl::NSStringMatchers::EndsWith + EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } + + } // namespace Matchers + + using namespace Matchers; + +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define OC_MAKE_UNIQUE_NAME( root, uniqueSuffix ) root##uniqueSuffix +#define OC_TEST_CASE2( name, desc, uniqueSuffix ) \ ++(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Name_test_, uniqueSuffix ) \ +{ \ +return @ name; \ +} \ ++(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Description_test_, uniqueSuffix ) \ +{ \ +return @ desc; \ +} \ +-(void) OC_MAKE_UNIQUE_NAME( Catch_TestCase_test_, uniqueSuffix ) + +#define OC_TEST_CASE( name, desc ) OC_TEST_CASE2( name, desc, __LINE__ ) + +// end catch_objc.hpp +#endif + +// Benchmarking needs the externally-facing parts of reporters to work +#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_external_interfaces.h + +// start catch_reporter_bases.hpp + +// start catch_interfaces_reporter.h + +// start catch_config.hpp + +// start catch_test_spec_parser.h + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// start catch_test_spec.h + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// start catch_wildcard_pattern.h + +namespace Catch +{ + class WildcardPattern { + enum WildcardPosition { + NoWildcard = 0, + WildcardAtStart = 1, + WildcardAtEnd = 2, + WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd + }; + + public: + + WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ); + virtual ~WildcardPattern() = default; + virtual bool matches( std::string const& str ) const; + + private: + std::string normaliseString( std::string const& str ) const; + CaseSensitive::Choice m_caseSensitivity; + WildcardPosition m_wildcard = NoWildcard; + std::string m_pattern; + }; +} + +// end catch_wildcard_pattern.h +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + struct IConfig; + + class TestSpec { + class Pattern { + public: + explicit Pattern( std::string const& name ); + virtual ~Pattern(); + virtual bool matches( TestCaseInfo const& testCase ) const = 0; + std::string const& name() const; + private: + std::string const m_name; + }; + using PatternPtr = std::shared_ptr<Pattern>; + + class NamePattern : public Pattern { + public: + explicit NamePattern( std::string const& name, std::string const& filterString ); + bool matches( TestCaseInfo const& testCase ) const override; + private: + WildcardPattern m_wildcardPattern; + }; + + class TagPattern : public Pattern { + public: + explicit TagPattern( std::string const& tag, std::string const& filterString ); + bool matches( TestCaseInfo const& testCase ) const override; + private: + std::string m_tag; + }; + + class ExcludedPattern : public Pattern { + public: + explicit ExcludedPattern( PatternPtr const& underlyingPattern ); + bool matches( TestCaseInfo const& testCase ) const override; + private: + PatternPtr m_underlyingPattern; + }; + + struct Filter { + std::vector<PatternPtr> m_patterns; + + bool matches( TestCaseInfo const& testCase ) const; + std::string name() const; + }; + + public: + struct FilterMatch { + std::string name; + std::vector<TestCase const*> tests; + }; + using Matches = std::vector<FilterMatch>; + using vectorStrings = std::vector<std::string>; + + bool hasFilters() const; + bool matches( TestCaseInfo const& testCase ) const; + Matches matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const; + const vectorStrings & getInvalidArgs() const; + + private: + std::vector<Filter> m_filters; + std::vector<std::string> m_invalidArgs; + friend class TestSpecParser; + }; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_test_spec.h +// start catch_interfaces_tag_alias_registry.h + +#include <string> + +namespace Catch { + + struct TagAlias; + + struct ITagAliasRegistry { + virtual ~ITagAliasRegistry(); + // Nullptr if not present + virtual TagAlias const* find( std::string const& alias ) const = 0; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; + + static ITagAliasRegistry const& get(); + }; + +} // end namespace Catch + +// end catch_interfaces_tag_alias_registry.h +namespace Catch { + + class TestSpecParser { + enum Mode{ None, Name, QuotedName, Tag, EscapedName }; + Mode m_mode = None; + Mode lastMode = None; + bool m_exclusion = false; + std::size_t m_pos = 0; + std::size_t m_realPatternPos = 0; + std::string m_arg; + std::string m_substring; + std::string m_patternName; + std::vector<std::size_t> m_escapeChars; + TestSpec::Filter m_currentFilter; + TestSpec m_testSpec; + ITagAliasRegistry const* m_tagAliases = nullptr; + + public: + TestSpecParser( ITagAliasRegistry const& tagAliases ); + + TestSpecParser& parse( std::string const& arg ); + TestSpec testSpec(); + + private: + bool visitChar( char c ); + void startNewMode( Mode mode ); + bool processNoneChar( char c ); + void processNameChar( char c ); + bool processOtherChar( char c ); + void endMode(); + void escape(); + bool isControlChar( char c ) const; + void saveLastMode(); + void revertBackToLastMode(); + void addFilter(); + bool separate(); + + // Handles common preprocessing of the pattern for name/tag patterns + std::string preprocessPattern(); + // Adds the current pattern as a test name + void addNamePattern(); + // Adds the current pattern as a tag + void addTagPattern(); + + inline void addCharToPattern(char c) { + m_substring += c; + m_patternName += c; + m_realPatternPos++; + } + + }; + TestSpec parseTestSpec( std::string const& arg ); + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_test_spec_parser.h +// Libstdc++ doesn't like incomplete classes for unique_ptr + +#include <memory> +#include <vector> +#include <string> + +#ifndef CATCH_CONFIG_CONSOLE_WIDTH +#define CATCH_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { + + struct IStream; + + struct ConfigData { + bool listTests = false; + bool listTags = false; + bool listReporters = false; + bool listTestNamesOnly = false; + + bool showSuccessfulTests = false; + bool shouldDebugBreak = false; + bool noThrow = false; + bool showHelp = false; + bool showInvisibles = false; + bool filenamesAsTags = false; + bool libIdentify = false; + + int abortAfter = -1; + unsigned int rngSeed = 0; + + bool benchmarkNoAnalysis = false; + unsigned int benchmarkSamples = 100; + double benchmarkConfidenceInterval = 0.95; + unsigned int benchmarkResamples = 100000; + std::chrono::milliseconds::rep benchmarkWarmupTime = 100; + + Verbosity verbosity = Verbosity::Normal; + WarnAbout::What warnings = WarnAbout::Nothing; + ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter; + RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder; + UseColour::YesOrNo useColour = UseColour::Auto; + WaitForKeypress::When waitForKeypress = WaitForKeypress::Never; + + std::string outputFilename; + std::string name; + std::string processName; +#ifndef CATCH_CONFIG_DEFAULT_REPORTER +#define CATCH_CONFIG_DEFAULT_REPORTER "console" +#endif + std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER; +#undef CATCH_CONFIG_DEFAULT_REPORTER + + std::vector<std::string> testsOrTags; + std::vector<std::string> sectionsToRun; + }; + + class Config : public IConfig { + public: + + Config() = default; + Config( ConfigData const& data ); + virtual ~Config() = default; + + std::string const& getFilename() const; + + bool listTests() const; + bool listTestNamesOnly() const; + bool listTags() const; + bool listReporters() const; + + std::string getProcessName() const; + std::string const& getReporterName() const; + + std::vector<std::string> const& getTestsOrTags() const override; + std::vector<std::string> const& getSectionsToRun() const override; + + TestSpec const& testSpec() const override; + bool hasTestFilters() const override; + + bool showHelp() const; + + // IConfig interface + bool allowThrows() const override; + std::ostream& stream() const override; + std::string name() const override; + bool includeSuccessfulResults() const override; + bool warnAboutMissingAssertions() const override; + bool warnAboutNoTests() const override; + ShowDurations::OrNot showDurations() const override; + RunTests::InWhatOrder runOrder() const override; + unsigned int rngSeed() const override; + UseColour::YesOrNo useColour() const override; + bool shouldDebugBreak() const override; + int abortAfter() const override; + bool showInvisibles() const override; + Verbosity verbosity() const override; + bool benchmarkNoAnalysis() const override; + int benchmarkSamples() const override; + double benchmarkConfidenceInterval() const override; + unsigned int benchmarkResamples() const override; + std::chrono::milliseconds benchmarkWarmupTime() const override; + + private: + + IStream const* openStream(); + ConfigData m_data; + + std::unique_ptr<IStream const> m_stream; + TestSpec m_testSpec; + bool m_hasTestFilters = false; + }; + +} // end namespace Catch + +// end catch_config.hpp +// start catch_assertionresult.h + +#include <string> + +namespace Catch { + + struct AssertionResultData + { + AssertionResultData() = delete; + + AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression ); + + std::string message; + mutable std::string reconstructedExpression; + LazyExpression lazyExpression; + ResultWas::OfType resultType; + + std::string reconstructExpression() const; + }; + + class AssertionResult { + public: + AssertionResult() = delete; + AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); + + bool isOk() const; + bool succeeded() const; + ResultWas::OfType getResultType() const; + bool hasExpression() const; + bool hasMessage() const; + std::string getExpression() const; + std::string getExpressionInMacro() const; + bool hasExpandedExpression() const; + std::string getExpandedExpression() const; + std::string getMessage() const; + SourceLineInfo getSourceInfo() const; + StringRef getTestMacroName() const; + + //protected: + AssertionInfo m_info; + AssertionResultData m_resultData; + }; + +} // end namespace Catch + +// end catch_assertionresult.h +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_estimate.hpp + + // Statistics estimates + + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct Estimate { + Duration point; + Duration lower_bound; + Duration upper_bound; + double confidence_interval; + + template <typename Duration2> + operator Estimate<Duration2>() const { + return { point, lower_bound, upper_bound, confidence_interval }; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_estimate.hpp +// start catch_outlier_classification.hpp + +// Outlier information + +namespace Catch { + namespace Benchmark { + struct OutlierClassification { + int samples_seen = 0; + int low_severe = 0; // more than 3 times IQR below Q1 + int low_mild = 0; // 1.5 to 3 times IQR below Q1 + int high_mild = 0; // 1.5 to 3 times IQR above Q3 + int high_severe = 0; // more than 3 times IQR above Q3 + + int total() const { + return low_severe + low_mild + high_mild + high_severe; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_outlier_classification.hpp +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +#include <string> +#include <iosfwd> +#include <map> +#include <set> +#include <memory> +#include <algorithm> + +namespace Catch { + + struct ReporterConfig { + explicit ReporterConfig( IConfigPtr const& _fullConfig ); + + ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ); + + std::ostream& stream() const; + IConfigPtr fullConfig() const; + + private: + std::ostream* m_stream; + IConfigPtr m_fullConfig; + }; + + struct ReporterPreferences { + bool shouldRedirectStdOut = false; + bool shouldReportAllAssertions = false; + }; + + template<typename T> + struct LazyStat : Option<T> { + LazyStat& operator=( T const& _value ) { + Option<T>::operator=( _value ); + used = false; + return *this; + } + void reset() { + Option<T>::reset(); + used = false; + } + bool used = false; + }; + + struct TestRunInfo { + TestRunInfo( std::string const& _name ); + std::string name; + }; + struct GroupInfo { + GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ); + + std::string name; + std::size_t groupIndex; + std::size_t groupsCounts; + }; + + struct AssertionStats { + AssertionStats( AssertionResult const& _assertionResult, + std::vector<MessageInfo> const& _infoMessages, + Totals const& _totals ); + + AssertionStats( AssertionStats const& ) = default; + AssertionStats( AssertionStats && ) = default; + AssertionStats& operator = ( AssertionStats const& ) = delete; + AssertionStats& operator = ( AssertionStats && ) = delete; + virtual ~AssertionStats(); + + AssertionResult assertionResult; + std::vector<MessageInfo> infoMessages; + Totals totals; + }; + + struct SectionStats { + SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ); + SectionStats( SectionStats const& ) = default; + SectionStats( SectionStats && ) = default; + SectionStats& operator = ( SectionStats const& ) = default; + SectionStats& operator = ( SectionStats && ) = default; + virtual ~SectionStats(); + + SectionInfo sectionInfo; + Counts assertions; + double durationInSeconds; + bool missingAssertions; + }; + + struct TestCaseStats { + TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ); + + TestCaseStats( TestCaseStats const& ) = default; + TestCaseStats( TestCaseStats && ) = default; + TestCaseStats& operator = ( TestCaseStats const& ) = default; + TestCaseStats& operator = ( TestCaseStats && ) = default; + virtual ~TestCaseStats(); + + TestCaseInfo testInfo; + Totals totals; + std::string stdOut; + std::string stdErr; + bool aborting; + }; + + struct TestGroupStats { + TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ); + TestGroupStats( GroupInfo const& _groupInfo ); + + TestGroupStats( TestGroupStats const& ) = default; + TestGroupStats( TestGroupStats && ) = default; + TestGroupStats& operator = ( TestGroupStats const& ) = default; + TestGroupStats& operator = ( TestGroupStats && ) = default; + virtual ~TestGroupStats(); + + GroupInfo groupInfo; + Totals totals; + bool aborting; + }; + + struct TestRunStats { + TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ); + + TestRunStats( TestRunStats const& ) = default; + TestRunStats( TestRunStats && ) = default; + TestRunStats& operator = ( TestRunStats const& ) = default; + TestRunStats& operator = ( TestRunStats && ) = default; + virtual ~TestRunStats(); + + TestRunInfo runInfo; + Totals totals; + bool aborting; + }; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + struct BenchmarkInfo { + std::string name; + double estimatedDuration; + int iterations; + int samples; + unsigned int resamples; + double clockResolution; + double clockCost; + }; + + template <class Duration> + struct BenchmarkStats { + BenchmarkInfo info; + + std::vector<Duration> samples; + Benchmark::Estimate<Duration> mean; + Benchmark::Estimate<Duration> standardDeviation; + Benchmark::OutlierClassification outliers; + double outlierVariance; + + template <typename Duration2> + operator BenchmarkStats<Duration2>() const { + std::vector<Duration2> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); }); + return { + info, + std::move(samples2), + mean, + standardDeviation, + outliers, + outlierVariance, + }; + } + }; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + struct IStreamingReporter { + virtual ~IStreamingReporter() = default; + + // Implementing class must also provide the following static methods: + // static std::string getDescription(); + // static std::set<Verbosity> getSupportedVerbosities() + + virtual ReporterPreferences getPreferences() const = 0; + + virtual void noMatchingTestCases( std::string const& spec ) = 0; + + virtual void reportInvalidArguments(std::string const&) {} + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; + virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; + virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + virtual void benchmarkPreparing( std::string const& ) {} + virtual void benchmarkStarting( BenchmarkInfo const& ) {} + virtual void benchmarkEnded( BenchmarkStats<> const& ) {} + virtual void benchmarkFailed( std::string const& ) {} +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + + virtual void sectionEnded( SectionStats const& sectionStats ) = 0; + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; + virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; + + virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + // Default empty implementation provided + virtual void fatalErrorEncountered( StringRef name ); + + virtual bool isMulti() const; + }; + using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>; + + struct IReporterFactory { + virtual ~IReporterFactory(); + virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0; + virtual std::string getDescription() const = 0; + }; + using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>; + + struct IReporterRegistry { + using FactoryMap = std::map<std::string, IReporterFactoryPtr>; + using Listeners = std::vector<IReporterFactoryPtr>; + + virtual ~IReporterRegistry(); + virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0; + virtual FactoryMap const& getFactories() const = 0; + virtual Listeners const& getListeners() const = 0; + }; + +} // end namespace Catch + +// end catch_interfaces_reporter.h +#include <algorithm> +#include <cstring> +#include <cfloat> +#include <cstdio> +#include <cassert> +#include <memory> +#include <ostream> + +namespace Catch { + void prepareExpandedExpression(AssertionResult& result); + + // Returns double formatted as %.3f (format expected on output) + std::string getFormattedDuration( double duration ); + + std::string serializeFilters( std::vector<std::string> const& container ); + + template<typename DerivedT> + struct StreamingReporterBase : IStreamingReporter { + + StreamingReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) + CATCH_ERROR( "Verbosity level not supported by this reporter" ); + } + + ReporterPreferences getPreferences() const override { + return m_reporterPrefs; + } + + static std::set<Verbosity> getSupportedVerbosities() { + return { Verbosity::Normal }; + } + + ~StreamingReporterBase() override = default; + + void noMatchingTestCases(std::string const&) override {} + + void reportInvalidArguments(std::string const&) override {} + + void testRunStarting(TestRunInfo const& _testRunInfo) override { + currentTestRunInfo = _testRunInfo; + } + + void testGroupStarting(GroupInfo const& _groupInfo) override { + currentGroupInfo = _groupInfo; + } + + void testCaseStarting(TestCaseInfo const& _testInfo) override { + currentTestCaseInfo = _testInfo; + } + void sectionStarting(SectionInfo const& _sectionInfo) override { + m_sectionStack.push_back(_sectionInfo); + } + + void sectionEnded(SectionStats const& /* _sectionStats */) override { + m_sectionStack.pop_back(); + } + void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override { + currentTestCaseInfo.reset(); + } + void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override { + currentGroupInfo.reset(); + } + void testRunEnded(TestRunStats const& /* _testRunStats */) override { + currentTestCaseInfo.reset(); + currentGroupInfo.reset(); + currentTestRunInfo.reset(); + } + + void skipTest(TestCaseInfo const&) override { + // Don't do anything with this by default. + // It can optionally be overridden in the derived class. + } + + IConfigPtr m_config; + std::ostream& stream; + + LazyStat<TestRunInfo> currentTestRunInfo; + LazyStat<GroupInfo> currentGroupInfo; + LazyStat<TestCaseInfo> currentTestCaseInfo; + + std::vector<SectionInfo> m_sectionStack; + ReporterPreferences m_reporterPrefs; + }; + + template<typename DerivedT> + struct CumulativeReporterBase : IStreamingReporter { + template<typename T, typename ChildNodeT> + struct Node { + explicit Node( T const& _value ) : value( _value ) {} + virtual ~Node() {} + + using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>; + T value; + ChildNodes children; + }; + struct SectionNode { + explicit SectionNode(SectionStats const& _stats) : stats(_stats) {} + virtual ~SectionNode() = default; + + bool operator == (SectionNode const& other) const { + return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; + } + bool operator == (std::shared_ptr<SectionNode> const& other) const { + return operator==(*other); + } + + SectionStats stats; + using ChildSections = std::vector<std::shared_ptr<SectionNode>>; + using Assertions = std::vector<AssertionStats>; + ChildSections childSections; + Assertions assertions; + std::string stdOut; + std::string stdErr; + }; + + struct BySectionInfo { + BySectionInfo( SectionInfo const& other ) : m_other( other ) {} + BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} + bool operator() (std::shared_ptr<SectionNode> const& node) const { + return ((node->stats.sectionInfo.name == m_other.name) && + (node->stats.sectionInfo.lineInfo == m_other.lineInfo)); + } + void operator=(BySectionInfo const&) = delete; + + private: + SectionInfo const& m_other; + }; + + using TestCaseNode = Node<TestCaseStats, SectionNode>; + using TestGroupNode = Node<TestGroupStats, TestCaseNode>; + using TestRunNode = Node<TestRunStats, TestGroupNode>; + + CumulativeReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) + CATCH_ERROR( "Verbosity level not supported by this reporter" ); + } + ~CumulativeReporterBase() override = default; + + ReporterPreferences getPreferences() const override { + return m_reporterPrefs; + } + + static std::set<Verbosity> getSupportedVerbosities() { + return { Verbosity::Normal }; + } + + void testRunStarting( TestRunInfo const& ) override {} + void testGroupStarting( GroupInfo const& ) override {} + + void testCaseStarting( TestCaseInfo const& ) override {} + + void sectionStarting( SectionInfo const& sectionInfo ) override { + SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); + std::shared_ptr<SectionNode> node; + if( m_sectionStack.empty() ) { + if( !m_rootSection ) + m_rootSection = std::make_shared<SectionNode>( incompleteStats ); + node = m_rootSection; + } + else { + SectionNode& parentNode = *m_sectionStack.back(); + auto it = + std::find_if( parentNode.childSections.begin(), + parentNode.childSections.end(), + BySectionInfo( sectionInfo ) ); + if( it == parentNode.childSections.end() ) { + node = std::make_shared<SectionNode>( incompleteStats ); + parentNode.childSections.push_back( node ); + } + else + node = *it; + } + m_sectionStack.push_back( node ); + m_deepestSection = std::move(node); + } + + void assertionStarting(AssertionInfo const&) override {} + + bool assertionEnded(AssertionStats const& assertionStats) override { + assert(!m_sectionStack.empty()); + // AssertionResult holds a pointer to a temporary DecomposedExpression, + // which getExpandedExpression() calls to build the expression string. + // Our section stack copy of the assertionResult will likely outlive the + // temporary, so it must be expanded or discarded now to avoid calling + // a destroyed object later. + prepareExpandedExpression(const_cast<AssertionResult&>( assertionStats.assertionResult ) ); + SectionNode& sectionNode = *m_sectionStack.back(); + sectionNode.assertions.push_back(assertionStats); + return true; + } + void sectionEnded(SectionStats const& sectionStats) override { + assert(!m_sectionStack.empty()); + SectionNode& node = *m_sectionStack.back(); + node.stats = sectionStats; + m_sectionStack.pop_back(); + } + void testCaseEnded(TestCaseStats const& testCaseStats) override { + auto node = std::make_shared<TestCaseNode>(testCaseStats); + assert(m_sectionStack.size() == 0); + node->children.push_back(m_rootSection); + m_testCases.push_back(node); + m_rootSection.reset(); + + assert(m_deepestSection); + m_deepestSection->stdOut = testCaseStats.stdOut; + m_deepestSection->stdErr = testCaseStats.stdErr; + } + void testGroupEnded(TestGroupStats const& testGroupStats) override { + auto node = std::make_shared<TestGroupNode>(testGroupStats); + node->children.swap(m_testCases); + m_testGroups.push_back(node); + } + void testRunEnded(TestRunStats const& testRunStats) override { + auto node = std::make_shared<TestRunNode>(testRunStats); + node->children.swap(m_testGroups); + m_testRuns.push_back(node); + testRunEndedCumulative(); + } + virtual void testRunEndedCumulative() = 0; + + void skipTest(TestCaseInfo const&) override {} + + IConfigPtr m_config; + std::ostream& stream; + std::vector<AssertionStats> m_assertions; + std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections; + std::vector<std::shared_ptr<TestCaseNode>> m_testCases; + std::vector<std::shared_ptr<TestGroupNode>> m_testGroups; + + std::vector<std::shared_ptr<TestRunNode>> m_testRuns; + + std::shared_ptr<SectionNode> m_rootSection; + std::shared_ptr<SectionNode> m_deepestSection; + std::vector<std::shared_ptr<SectionNode>> m_sectionStack; + ReporterPreferences m_reporterPrefs; + }; + + template<char C> + char const* getLineOfChars() { + static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; + if( !*line ) { + std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); + line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; + } + return line; + } + + struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> { + TestEventListenerBase( ReporterConfig const& _config ); + + static std::set<Verbosity> getSupportedVerbosities(); + + void assertionStarting(AssertionInfo const&) override; + bool assertionEnded(AssertionStats const&) override; + }; + +} // end namespace Catch + +// end catch_reporter_bases.hpp +// start catch_console_colour.h + +namespace Catch { + + struct Colour { + enum Code { + None = 0, + + White, + Red, + Green, + Blue, + Cyan, + Yellow, + Grey, + + Bright = 0x10, + + BrightRed = Bright | Red, + BrightGreen = Bright | Green, + LightGrey = Bright | Grey, + BrightWhite = Bright | White, + BrightYellow = Bright | Yellow, + + // By intention + FileName = LightGrey, + Warning = BrightYellow, + ResultError = BrightRed, + ResultSuccess = BrightGreen, + ResultExpectedFailure = Warning, + + Error = BrightRed, + Success = Green, + + OriginalExpression = Cyan, + ReconstructedExpression = BrightYellow, + + SecondaryText = LightGrey, + Headers = White + }; + + // Use constructed object for RAII guard + Colour( Code _colourCode ); + Colour( Colour&& other ) noexcept; + Colour& operator=( Colour&& other ) noexcept; + ~Colour(); + + // Use static method for one-shot changes + static void use( Code _colourCode ); + + private: + bool m_moved = false; + }; + + std::ostream& operator << ( std::ostream& os, Colour const& ); + +} // end namespace Catch + +// end catch_console_colour.h +// start catch_reporter_registrars.hpp + + +namespace Catch { + + template<typename T> + class ReporterRegistrar { + + class ReporterFactory : public IReporterFactory { + + IStreamingReporterPtr create( ReporterConfig const& config ) const override { + return std::unique_ptr<T>( new T( config ) ); + } + + std::string getDescription() const override { + return T::getDescription(); + } + }; + + public: + + explicit ReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, std::make_shared<ReporterFactory>() ); + } + }; + + template<typename T> + class ListenerRegistrar { + + class ListenerFactory : public IReporterFactory { + + IStreamingReporterPtr create( ReporterConfig const& config ) const override { + return std::unique_ptr<T>( new T( config ) ); + } + std::string getDescription() const override { + return std::string(); + } + }; + + public: + + ListenerRegistrar() { + getMutableRegistryHub().registerListener( std::make_shared<ListenerFactory>() ); + } + }; +} + +#if !defined(CATCH_CONFIG_DISABLE) + +#define CATCH_REGISTER_REPORTER( name, reporterType ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +#define CATCH_REGISTER_LISTENER( listenerType ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#else // CATCH_CONFIG_DISABLE + +#define CATCH_REGISTER_REPORTER(name, reporterType) +#define CATCH_REGISTER_LISTENER(listenerType) + +#endif // CATCH_CONFIG_DISABLE + +// end catch_reporter_registrars.hpp +// Allow users to base their work off existing reporters +// start catch_reporter_compact.h + +namespace Catch { + + struct CompactReporter : StreamingReporterBase<CompactReporter> { + + using StreamingReporterBase::StreamingReporterBase; + + ~CompactReporter() override; + + static std::string getDescription(); + + ReporterPreferences getPreferences() const override; + + void noMatchingTestCases(std::string const& spec) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& _assertionStats) override; + + void sectionEnded(SectionStats const& _sectionStats) override; + + void testRunEnded(TestRunStats const& _testRunStats) override; + + }; + +} // end namespace Catch + +// end catch_reporter_compact.h +// start catch_reporter_console.h + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch + // Note that 4062 (not all labels are handled + // and default is missing) is enabled +#endif + +namespace Catch { + // Fwd decls + struct SummaryColumn; + class TablePrinter; + + struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> { + std::unique_ptr<TablePrinter> m_tablePrinter; + + ConsoleReporter(ReporterConfig const& config); + ~ConsoleReporter() override; + static std::string getDescription(); + + void noMatchingTestCases(std::string const& spec) override; + + void reportInvalidArguments(std::string const&arg) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& _assertionStats) override; + + void sectionStarting(SectionInfo const& _sectionInfo) override; + void sectionEnded(SectionStats const& _sectionStats) override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting(BenchmarkInfo const& info) override; + void benchmarkEnded(BenchmarkStats<> const& stats) override; + void benchmarkFailed(std::string const& error) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void testCaseEnded(TestCaseStats const& _testCaseStats) override; + void testGroupEnded(TestGroupStats const& _testGroupStats) override; + void testRunEnded(TestRunStats const& _testRunStats) override; + void testRunStarting(TestRunInfo const& _testRunInfo) override; + private: + + void lazyPrint(); + + void lazyPrintWithoutClosingBenchmarkTable(); + void lazyPrintRunInfo(); + void lazyPrintGroupInfo(); + void printTestCaseAndSectionHeader(); + + void printClosedHeader(std::string const& _name); + void printOpenHeader(std::string const& _name); + + // if string has a : in first line will set indent to follow it on + // subsequent lines + void printHeaderString(std::string const& _string, std::size_t indent = 0); + + void printTotals(Totals const& totals); + void printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row); + + void printTotalsDivider(Totals const& totals); + void printSummaryDivider(); + void printTestFilters(); + + private: + bool m_headerPrinted = false; + }; + +} // end namespace Catch + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +// end catch_reporter_console.h +// start catch_reporter_junit.h + +// start catch_xmlwriter.h + +#include <vector> + +namespace Catch { + enum class XmlFormatting { + None = 0x00, + Indent = 0x01, + Newline = 0x02, + }; + + XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs); + XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs); + + class XmlEncode { + public: + enum ForWhat { ForTextNodes, ForAttributes }; + + XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ); + + void encodeTo( std::ostream& os ) const; + + friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ); + + private: + std::string m_str; + ForWhat m_forWhat; + }; + + class XmlWriter { + public: + + class ScopedElement { + public: + ScopedElement( XmlWriter* writer, XmlFormatting fmt ); + + ScopedElement( ScopedElement&& other ) noexcept; + ScopedElement& operator=( ScopedElement&& other ) noexcept; + + ~ScopedElement(); + + ScopedElement& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent ); + + template<typename T> + ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { + m_writer->writeAttribute( name, attribute ); + return *this; + } + + private: + mutable XmlWriter* m_writer = nullptr; + XmlFormatting m_fmt; + }; + + XmlWriter( std::ostream& os = Catch::cout() ); + ~XmlWriter(); + + XmlWriter( XmlWriter const& ) = delete; + XmlWriter& operator=( XmlWriter const& ) = delete; + + XmlWriter& startElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + ScopedElement scopedElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ); + + XmlWriter& writeAttribute( std::string const& name, bool attribute ); + + template<typename T> + XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { + ReusableStringStream rss; + rss << attribute; + return writeAttribute( name, rss.str() ); + } + + XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + void writeStylesheetRef( std::string const& url ); + + XmlWriter& writeBlankLine(); + + void ensureTagClosed(); + + private: + + void applyFormatting(XmlFormatting fmt); + + void writeDeclaration(); + + void newlineIfNecessary(); + + bool m_tagIsOpen = false; + bool m_needsNewline = false; + std::vector<std::string> m_tags; + std::string m_indent; + std::ostream& m_os; + }; + +} + +// end catch_xmlwriter.h +namespace Catch { + + class JunitReporter : public CumulativeReporterBase<JunitReporter> { + public: + JunitReporter(ReporterConfig const& _config); + + ~JunitReporter() override; + + static std::string getDescription(); + + void noMatchingTestCases(std::string const& /*spec*/) override; + + void testRunStarting(TestRunInfo const& runInfo) override; + + void testGroupStarting(GroupInfo const& groupInfo) override; + + void testCaseStarting(TestCaseInfo const& testCaseInfo) override; + bool assertionEnded(AssertionStats const& assertionStats) override; + + void testCaseEnded(TestCaseStats const& testCaseStats) override; + + void testGroupEnded(TestGroupStats const& testGroupStats) override; + + void testRunEndedCumulative() override; + + void writeGroup(TestGroupNode const& groupNode, double suiteTime); + + void writeTestCase(TestCaseNode const& testCaseNode); + + void writeSection(std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode); + + void writeAssertions(SectionNode const& sectionNode); + void writeAssertion(AssertionStats const& stats); + + XmlWriter xml; + Timer suiteTimer; + std::string stdOutForSuite; + std::string stdErrForSuite; + unsigned int unexpectedExceptions = 0; + bool m_okToFail = false; + }; + +} // end namespace Catch + +// end catch_reporter_junit.h +// start catch_reporter_xml.h + +namespace Catch { + class XmlReporter : public StreamingReporterBase<XmlReporter> { + public: + XmlReporter(ReporterConfig const& _config); + + ~XmlReporter() override; + + static std::string getDescription(); + + virtual std::string getStylesheetRef() const; + + void writeSourceInfo(SourceLineInfo const& sourceInfo); + + public: // StreamingReporterBase + + void noMatchingTestCases(std::string const& s) override; + + void testRunStarting(TestRunInfo const& testInfo) override; + + void testGroupStarting(GroupInfo const& groupInfo) override; + + void testCaseStarting(TestCaseInfo const& testInfo) override; + + void sectionStarting(SectionInfo const& sectionInfo) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& assertionStats) override; + + void sectionEnded(SectionStats const& sectionStats) override; + + void testCaseEnded(TestCaseStats const& testCaseStats) override; + + void testGroupEnded(TestGroupStats const& testGroupStats) override; + + void testRunEnded(TestRunStats const& testRunStats) override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting(BenchmarkInfo const&) override; + void benchmarkEnded(BenchmarkStats<> const&) override; + void benchmarkFailed(std::string const&) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + private: + Timer m_testCaseTimer; + XmlWriter m_xml; + int m_sectionDepth = 0; + }; + +} // end namespace Catch + +// end catch_reporter_xml.h + +// end catch_external_interfaces.h +#endif + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_benchmarking_all.hpp + +// A proxy header that includes all of the benchmarking headers to allow +// concise include of the benchmarking features. You should prefer the +// individual includes in standard use. + +// start catch_benchmark.hpp + + // Benchmark + +// start catch_chronometer.hpp + +// User-facing chronometer + + +// start catch_clock.hpp + +// Clocks + + +#include <chrono> +#include <ratio> + +namespace Catch { + namespace Benchmark { + template <typename Clock> + using ClockDuration = typename Clock::duration; + template <typename Clock> + using FloatDuration = std::chrono::duration<double, typename Clock::period>; + + template <typename Clock> + using TimePoint = typename Clock::time_point; + + using default_clock = std::chrono::steady_clock; + + template <typename Clock> + struct now { + TimePoint<Clock> operator()() const { + return Clock::now(); + } + }; + + using fp_seconds = std::chrono::duration<double, std::ratio<1>>; + } // namespace Benchmark +} // namespace Catch + +// end catch_clock.hpp +// start catch_optimizer.hpp + + // Hinting the optimizer + + +#if defined(_MSC_VER) +# include <atomic> // atomic_thread_fence +#endif + +namespace Catch { + namespace Benchmark { +#if defined(__GNUC__) || defined(__clang__) + template <typename T> + inline void keep_memory(T* p) { + asm volatile("" : : "g"(p) : "memory"); + } + inline void keep_memory() { + asm volatile("" : : : "memory"); + } + + namespace Detail { + inline void optimizer_barrier() { keep_memory(); } + } // namespace Detail +#elif defined(_MSC_VER) + +#pragma optimize("", off) + template <typename T> + inline void keep_memory(T* p) { + // thanks @milleniumbug + *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p); + } + // TODO equivalent keep_memory() +#pragma optimize("", on) + + namespace Detail { + inline void optimizer_barrier() { + std::atomic_thread_fence(std::memory_order_seq_cst); + } + } // namespace Detail + +#endif + + template <typename T> + inline void deoptimize_value(T&& x) { + keep_memory(&x); + } + + template <typename Fn, typename... Args> + inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type { + deoptimize_value(std::forward<Fn>(fn) (std::forward<Args...>(args...))); + } + + template <typename Fn, typename... Args> + inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type { + std::forward<Fn>(fn) (std::forward<Args...>(args...)); + } + } // namespace Benchmark +} // namespace Catch + +// end catch_optimizer.hpp +// start catch_complete_invoke.hpp + +// Invoke with a special case for void + + +#include <type_traits> +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T> + struct CompleteType { using type = T; }; + template <> + struct CompleteType<void> { struct type {}; }; + + template <typename T> + using CompleteType_t = typename CompleteType<T>::type; + + template <typename Result> + struct CompleteInvoker { + template <typename Fun, typename... Args> + static Result invoke(Fun&& fun, Args&&... args) { + return std::forward<Fun>(fun)(std::forward<Args>(args)...); + } + }; + template <> + struct CompleteInvoker<void> { + template <typename Fun, typename... Args> + static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) { + std::forward<Fun>(fun)(std::forward<Args>(args)...); + return {}; + } + }; + template <typename Sig> + using ResultOf_t = typename std::result_of<Sig>::type; + + // invoke and not return void :( + template <typename Fun, typename... Args> + CompleteType_t<ResultOf_t<Fun(Args...)>> complete_invoke(Fun&& fun, Args&&... args) { + return CompleteInvoker<ResultOf_t<Fun(Args...)>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...); + } + + const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; + } // namespace Detail + + template <typename Fun> + Detail::CompleteType_t<Detail::ResultOf_t<Fun()>> user_code(Fun&& fun) { + CATCH_TRY{ + return Detail::complete_invoke(std::forward<Fun>(fun)); + } CATCH_CATCH_ALL{ + getResultCapture().benchmarkFailed(translateActiveException()); + CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg); + } + } + } // namespace Benchmark +} // namespace Catch + +// end catch_complete_invoke.hpp +namespace Catch { + namespace Benchmark { + namespace Detail { + struct ChronometerConcept { + virtual void start() = 0; + virtual void finish() = 0; + virtual ~ChronometerConcept() = default; + }; + template <typename Clock> + struct ChronometerModel final : public ChronometerConcept { + void start() override { started = Clock::now(); } + void finish() override { finished = Clock::now(); } + + ClockDuration<Clock> elapsed() const { return finished - started; } + + TimePoint<Clock> started; + TimePoint<Clock> finished; + }; + } // namespace Detail + + struct Chronometer { + public: + template <typename Fun> + void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); } + + int runs() const { return k; } + + Chronometer(Detail::ChronometerConcept& meter, int k) + : impl(&meter) + , k(k) {} + + private: + template <typename Fun> + void measure(Fun&& fun, std::false_type) { + measure([&fun](int) { return fun(); }, std::true_type()); + } + + template <typename Fun> + void measure(Fun&& fun, std::true_type) { + Detail::optimizer_barrier(); + impl->start(); + for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i); + impl->finish(); + Detail::optimizer_barrier(); + } + + Detail::ChronometerConcept* impl; + int k; + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_chronometer.hpp +// start catch_environment.hpp + +// Environment information + + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct EnvironmentEstimate { + Duration mean; + OutlierClassification outliers; + + template <typename Duration2> + operator EnvironmentEstimate<Duration2>() const { + return { mean, outliers }; + } + }; + template <typename Clock> + struct Environment { + using clock_type = Clock; + EnvironmentEstimate<FloatDuration<Clock>> clock_resolution; + EnvironmentEstimate<FloatDuration<Clock>> clock_cost; + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_environment.hpp +// start catch_execution_plan.hpp + + // Execution plan + + +// start catch_benchmark_function.hpp + + // Dumb std::function implementation for consistent call overhead + + +#include <cassert> +#include <type_traits> +#include <utility> +#include <memory> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T> + using Decay = typename std::decay<T>::type; + template <typename T, typename U> + struct is_related + : std::is_same<Decay<T>, Decay<U>> {}; + + /// We need to reinvent std::function because every piece of code that might add overhead + /// in a measurement context needs to have consistent performance characteristics so that we + /// can account for it in the measurement. + /// Implementations of std::function with optimizations that aren't always applicable, like + /// small buffer optimizations, are not uncommon. + /// This is effectively an implementation of std::function without any such optimizations; + /// it may be slow, but it is consistently slow. + struct BenchmarkFunction { + private: + struct callable { + virtual void call(Chronometer meter) const = 0; + virtual callable* clone() const = 0; + virtual ~callable() = default; + }; + template <typename Fun> + struct model : public callable { + model(Fun&& fun) : fun(std::move(fun)) {} + model(Fun const& fun) : fun(fun) {} + + model<Fun>* clone() const override { return new model<Fun>(*this); } + + void call(Chronometer meter) const override { + call(meter, is_callable<Fun(Chronometer)>()); + } + void call(Chronometer meter, std::true_type) const { + fun(meter); + } + void call(Chronometer meter, std::false_type) const { + meter.measure(fun); + } + + Fun fun; + }; + + struct do_nothing { void operator()() const {} }; + + template <typename T> + BenchmarkFunction(model<T>* c) : f(c) {} + + public: + BenchmarkFunction() + : f(new model<do_nothing>{ {} }) {} + + template <typename Fun, + typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value, int>::type = 0> + BenchmarkFunction(Fun&& fun) + : f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {} + + BenchmarkFunction(BenchmarkFunction&& that) + : f(std::move(that.f)) {} + + BenchmarkFunction(BenchmarkFunction const& that) + : f(that.f->clone()) {} + + BenchmarkFunction& operator=(BenchmarkFunction&& that) { + f = std::move(that.f); + return *this; + } + + BenchmarkFunction& operator=(BenchmarkFunction const& that) { + f.reset(that.f->clone()); + return *this; + } + + void operator()(Chronometer meter) const { f->call(meter); } + + private: + std::unique_ptr<callable> f; + }; + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_benchmark_function.hpp +// start catch_repeat.hpp + +// repeat algorithm + + +#include <type_traits> +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Fun> + struct repeater { + void operator()(int k) const { + for (int i = 0; i < k; ++i) { + fun(); + } + } + Fun fun; + }; + template <typename Fun> + repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) { + return { std::forward<Fun>(fun) }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_repeat.hpp +// start catch_run_for_at_least.hpp + +// Run a function for a minimum amount of time + + +// start catch_measure.hpp + +// Measure + + +// start catch_timing.hpp + +// Timing + + +#include <tuple> +#include <type_traits> + +namespace Catch { + namespace Benchmark { + template <typename Duration, typename Result> + struct Timing { + Duration elapsed; + Result result; + int iterations; + }; + template <typename Clock, typename Sig> + using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<Detail::ResultOf_t<Sig>>>; + } // namespace Benchmark +} // namespace Catch + +// end catch_timing.hpp +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock, typename Fun, typename... Args> + TimingOf<Clock, Fun(Args...)> measure(Fun&& fun, Args&&... args) { + auto start = Clock::now(); + auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...); + auto end = Clock::now(); + auto delta = end - start; + return { delta, std::forward<decltype(r)>(r), 1 }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_measure.hpp +#include <utility> +#include <type_traits> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock, typename Fun> + TimingOf<Clock, Fun(int)> measure_one(Fun&& fun, int iters, std::false_type) { + return Detail::measure<Clock>(fun, iters); + } + template <typename Clock, typename Fun> + TimingOf<Clock, Fun(Chronometer)> measure_one(Fun&& fun, int iters, std::true_type) { + Detail::ChronometerModel<Clock> meter; + auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters)); + + return { meter.elapsed(), std::move(result), iters }; + } + + template <typename Clock, typename Fun> + using run_for_at_least_argument_t = typename std::conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type; + + struct optimized_away_error : std::exception { + const char* what() const noexcept override { + return "could not measure benchmark, maybe it was optimized away"; + } + }; + + template <typename Clock, typename Fun> + TimingOf<Clock, Fun(run_for_at_least_argument_t<Clock, Fun>)> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) { + auto iters = seed; + while (iters < (1 << 30)) { + auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>()); + + if (Timing.elapsed >= how_long) { + return { Timing.elapsed, std::move(Timing.result), iters }; + } + iters *= 2; + } + throw optimized_away_error{}; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_run_for_at_least.hpp +#include <algorithm> + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct ExecutionPlan { + int iterations_per_sample; + Duration estimated_duration; + Detail::BenchmarkFunction benchmark; + Duration warmup_time; + int warmup_iterations; + + template <typename Duration2> + operator ExecutionPlan<Duration2>() const { + return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations }; + } + + template <typename Clock> + std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const { + // warmup a bit + Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{})); + + std::vector<FloatDuration<Clock>> times; + times.reserve(cfg.benchmarkSamples()); + std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] { + Detail::ChronometerModel<Clock> model; + this->benchmark(Chronometer(model, iterations_per_sample)); + auto sample_time = model.elapsed() - env.clock_cost.mean; + if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero(); + return sample_time / iterations_per_sample; + }); + return times; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_execution_plan.hpp +// start catch_estimate_clock.hpp + + // Environment measurement + + +// start catch_stats.hpp + +// Statistical analysis tools + + +#include <algorithm> +#include <functional> +#include <vector> +#include <iterator> +#include <numeric> +#include <tuple> +#include <cmath> +#include <utility> +#include <cstddef> +#include <random> + +namespace Catch { + namespace Benchmark { + namespace Detail { + using sample = std::vector<double>; + + double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last); + + template <typename Iterator> + OutlierClassification classify_outliers(Iterator first, Iterator last) { + std::vector<double> copy(first, last); + + auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end()); + auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end()); + auto iqr = q3 - q1; + auto los = q1 - (iqr * 3.); + auto lom = q1 - (iqr * 1.5); + auto him = q3 + (iqr * 1.5); + auto his = q3 + (iqr * 3.); + + OutlierClassification o; + for (; first != last; ++first) { + auto&& t = *first; + if (t < los) ++o.low_severe; + else if (t < lom) ++o.low_mild; + else if (t > his) ++o.high_severe; + else if (t > him) ++o.high_mild; + ++o.samples_seen; + } + return o; + } + + template <typename Iterator> + double mean(Iterator first, Iterator last) { + auto count = last - first; + double sum = std::accumulate(first, last, 0.); + return sum / count; + } + + template <typename URng, typename Iterator, typename Estimator> + sample resample(URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) { + auto n = last - first; + std::uniform_int_distribution<decltype(n)> dist(0, n - 1); + + sample out; + out.reserve(resamples); + std::generate_n(std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] { + std::vector<double> resampled; + resampled.reserve(n); + std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] { return first[dist(rng)]; }); + return estimator(resampled.begin(), resampled.end()); + }); + std::sort(out.begin(), out.end()); + return out; + } + + template <typename Estimator, typename Iterator> + sample jackknife(Estimator&& estimator, Iterator first, Iterator last) { + auto n = last - first; + auto second = std::next(first); + sample results; + results.reserve(n); + + for (auto it = first; it != last; ++it) { + std::iter_swap(it, first); + results.push_back(estimator(second, last)); + } + + return results; + } + + inline double normal_cdf(double x) { + return std::erfc(-x / std::sqrt(2.0)) / 2.0; + } + + double erfc_inv(double x); + + double normal_quantile(double p); + + template <typename Iterator, typename Estimator> + Estimate<double> bootstrap(double confidence_level, Iterator first, Iterator last, sample const& resample, Estimator&& estimator) { + auto n_samples = last - first; + + double point = estimator(first, last); + // Degenerate case with a single sample + if (n_samples == 1) return { point, point, point, confidence_level }; + + sample jack = jackknife(estimator, first, last); + double jack_mean = mean(jack.begin(), jack.end()); + double sum_squares, sum_cubes; + std::tie(sum_squares, sum_cubes) = std::accumulate(jack.begin(), jack.end(), std::make_pair(0., 0.), [jack_mean](std::pair<double, double> sqcb, double x) -> std::pair<double, double> { + auto d = jack_mean - x; + auto d2 = d * d; + auto d3 = d2 * d; + return { sqcb.first + d2, sqcb.second + d3 }; + }); + + double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5)); + int n = static_cast<int>(resample.size()); + double prob_n = std::count_if(resample.begin(), resample.end(), [point](double x) { return x < point; }) / (double)n; + // degenerate case with uniform samples + if (prob_n == 0) return { point, point, point, confidence_level }; + + double bias = normal_quantile(prob_n); + double z1 = normal_quantile((1. - confidence_level) / 2.); + + auto cumn = [n](double x) -> int { + return std::lround(normal_cdf(x) * n); }; + auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); }; + double b1 = bias + z1; + double b2 = bias - z1; + double a1 = a(b1); + double a2 = a(b2); + auto lo = std::max(cumn(a1), 0); + auto hi = std::min(cumn(a2), n - 1); + + return { point, resample[lo], resample[hi], confidence_level }; + } + + double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n); + + struct bootstrap_analysis { + Estimate<double> mean; + Estimate<double> standard_deviation; + double outlier_variance; + }; + + bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last); + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_stats.hpp +#include <algorithm> +#include <iterator> +#include <tuple> +#include <vector> +#include <cmath> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock> + std::vector<double> resolution(int k) { + std::vector<TimePoint<Clock>> times; + times.reserve(k + 1); + std::generate_n(std::back_inserter(times), k + 1, now<Clock>{}); + + std::vector<double> deltas; + deltas.reserve(k); + std::transform(std::next(times.begin()), times.end(), times.begin(), + std::back_inserter(deltas), + [](TimePoint<Clock> a, TimePoint<Clock> b) { return static_cast<double>((a - b).count()); }); + + return deltas; + } + + const auto warmup_iterations = 10000; + const auto warmup_time = std::chrono::milliseconds(100); + const auto minimum_ticks = 1000; + const auto warmup_seed = 10000; + const auto clock_resolution_estimation_time = std::chrono::milliseconds(500); + const auto clock_cost_estimation_time_limit = std::chrono::seconds(1); + const auto clock_cost_estimation_tick_limit = 100000; + const auto clock_cost_estimation_time = std::chrono::milliseconds(10); + const auto clock_cost_estimation_iterations = 10000; + + template <typename Clock> + int warmup() { + return run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_seed, &resolution<Clock>) + .iterations; + } + template <typename Clock> + EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) { + auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_resolution_estimation_time), iterations, &resolution<Clock>) + .result; + return { + FloatDuration<Clock>(mean(r.begin(), r.end())), + classify_outliers(r.begin(), r.end()), + }; + } + template <typename Clock> + EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(FloatDuration<Clock> resolution) { + auto time_limit = std::min(resolution * clock_cost_estimation_tick_limit, FloatDuration<Clock>(clock_cost_estimation_time_limit)); + auto time_clock = [](int k) { + return Detail::measure<Clock>([k] { + for (int i = 0; i < k; ++i) { + volatile auto ignored = Clock::now(); + (void)ignored; + } + }).elapsed; + }; + time_clock(1); + int iters = clock_cost_estimation_iterations; + auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time), iters, time_clock); + std::vector<double> times; + int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed)); + times.reserve(nsamples); + std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] { + return static_cast<double>((time_clock(r.iterations) / r.iterations).count()); + }); + return { + FloatDuration<Clock>(mean(times.begin(), times.end())), + classify_outliers(times.begin(), times.end()), + }; + } + + template <typename Clock> + Environment<FloatDuration<Clock>> measure_environment() { + static Environment<FloatDuration<Clock>>* env = nullptr; + if (env) { + return *env; + } + + auto iters = Detail::warmup<Clock>(); + auto resolution = Detail::estimate_clock_resolution<Clock>(iters); + auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean); + + env = new Environment<FloatDuration<Clock>>{ resolution, cost }; + return *env; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_estimate_clock.hpp +// start catch_analyse.hpp + + // Run and analyse one benchmark + + +// start catch_sample_analysis.hpp + +// Benchmark results + + +#include <algorithm> +#include <vector> +#include <string> +#include <iterator> + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct SampleAnalysis { + std::vector<Duration> samples; + Estimate<Duration> mean; + Estimate<Duration> standard_deviation; + OutlierClassification outliers; + double outlier_variance; + + template <typename Duration2> + operator SampleAnalysis<Duration2>() const { + std::vector<Duration2> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); }); + return { + std::move(samples2), + mean, + standard_deviation, + outliers, + outlier_variance, + }; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_sample_analysis.hpp +#include <algorithm> +#include <iterator> +#include <vector> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Duration, typename Iterator> + SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<Duration>, Iterator first, Iterator last) { + if (!cfg.benchmarkNoAnalysis()) { + std::vector<double> samples; + samples.reserve(last - first); + std::transform(first, last, std::back_inserter(samples), [](Duration d) { return d.count(); }); + + auto analysis = Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(), cfg.benchmarkResamples(), samples.begin(), samples.end()); + auto outliers = Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end()); + + auto wrap_estimate = [](Estimate<double> e) { + return Estimate<Duration> { + Duration(e.point), + Duration(e.lower_bound), + Duration(e.upper_bound), + e.confidence_interval, + }; + }; + std::vector<Duration> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](double d) { return Duration(d); }); + return { + std::move(samples2), + wrap_estimate(analysis.mean), + wrap_estimate(analysis.standard_deviation), + outliers, + analysis.outlier_variance, + }; + } else { + std::vector<Duration> samples; + samples.reserve(last - first); + + Duration mean = Duration(0); + int i = 0; + for (auto it = first; it < last; ++it, ++i) { + samples.push_back(Duration(*it)); + mean += Duration(*it); + } + mean /= i; + + return { + std::move(samples), + Estimate<Duration>{mean, mean, mean, 0.0}, + Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0}, + OutlierClassification{}, + 0.0 + }; + } + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_analyse.hpp +#include <algorithm> +#include <functional> +#include <string> +#include <vector> +#include <cmath> + +namespace Catch { + namespace Benchmark { + struct Benchmark { + Benchmark(std::string &&name) + : name(std::move(name)) {} + + template <class FUN> + Benchmark(std::string &&name, FUN &&func) + : fun(std::move(func)), name(std::move(name)) {} + + template <typename Clock> + ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const { + auto min_time = env.clock_resolution.mean * Detail::minimum_ticks; + auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime())); + auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun); + int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed)); + return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations }; + } + + template <typename Clock = default_clock> + void run() { + IConfigPtr cfg = getCurrentContext().getConfig(); + + auto env = Detail::measure_environment<Clock>(); + + getResultCapture().benchmarkPreparing(name); + CATCH_TRY{ + auto plan = user_code([&] { + return prepare<Clock>(*cfg, env); + }); + + BenchmarkInfo info { + name, + plan.estimated_duration.count(), + plan.iterations_per_sample, + cfg->benchmarkSamples(), + cfg->benchmarkResamples(), + env.clock_resolution.mean.count(), + env.clock_cost.mean.count() + }; + + getResultCapture().benchmarkStarting(info); + + auto samples = user_code([&] { + return plan.template run<Clock>(*cfg, env); + }); + + auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end()); + BenchmarkStats<FloatDuration<Clock>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance }; + getResultCapture().benchmarkEnded(stats); + + } CATCH_CATCH_ALL{ + if (translateActiveException() != Detail::benchmarkErrorMsg) // benchmark errors have been reported, otherwise rethrow. + std::rethrow_exception(std::current_exception()); + } + } + + // sets lambda to be used in fun *and* executes benchmark! + template <typename Fun, + typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0> + Benchmark & operator=(Fun func) { + fun = Detail::BenchmarkFunction(func); + run(); + return *this; + } + + explicit operator bool() { + return true; + } + + private: + Detail::BenchmarkFunction fun; + std::string name; + }; + } +} // namespace Catch + +#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1 +#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2 + +#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\ + if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \ + BenchmarkName = [&](int benchmarkIndex) + +#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\ + if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \ + BenchmarkName = [&] + +// end catch_benchmark.hpp +// start catch_constructor.hpp + +// Constructor and destructor helpers + + +#include <type_traits> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T, bool Destruct> + struct ObjectStorage + { + using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type; + + ObjectStorage() : data() {} + + ObjectStorage(const ObjectStorage& other) + { + new(&data) T(other.stored_object()); + } + + ObjectStorage(ObjectStorage&& other) + { + new(&data) T(std::move(other.stored_object())); + } + + ~ObjectStorage() { destruct_on_exit<T>(); } + + template <typename... Args> + void construct(Args&&... args) + { + new (&data) T(std::forward<Args>(args)...); + } + + template <bool AllowManualDestruction = !Destruct> + typename std::enable_if<AllowManualDestruction>::type destruct() + { + stored_object().~T(); + } + + private: + // If this is a constructor benchmark, destruct the underlying object + template <typename U> + void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); } + // Otherwise, don't + template <typename U> + void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { } + + T& stored_object() { + return *static_cast<T*>(static_cast<void*>(&data)); + } + + T const& stored_object() const { + return *static_cast<T*>(static_cast<void*>(&data)); + } + + TStorage data; + }; + } + + template <typename T> + using storage_for = Detail::ObjectStorage<T, true>; + + template <typename T> + using destructable_object = Detail::ObjectStorage<T, false>; + } +} + +// end catch_constructor.hpp +// end catch_benchmarking_all.hpp +#endif + +#endif // ! CATCH_CONFIG_IMPL_ONLY + +#ifdef CATCH_IMPL +// start catch_impl.hpp + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#endif + +// Keep these here for external reporters +// start catch_test_case_tracker.h + +#include <string> +#include <vector> +#include <memory> + +namespace Catch { +namespace TestCaseTracking { + + struct NameAndLocation { + std::string name; + SourceLineInfo location; + + NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); + }; + + struct ITracker; + + using ITrackerPtr = std::shared_ptr<ITracker>; + + struct ITracker { + virtual ~ITracker(); + + // static queries + virtual NameAndLocation const& nameAndLocation() const = 0; + + // dynamic queries + virtual bool isComplete() const = 0; // Successfully completed or failed + virtual bool isSuccessfullyCompleted() const = 0; + virtual bool isOpen() const = 0; // Started but not complete + virtual bool hasChildren() const = 0; + + virtual ITracker& parent() = 0; + + // actions + virtual void close() = 0; // Successfully complete + virtual void fail() = 0; + virtual void markAsNeedingAnotherRun() = 0; + + virtual void addChild( ITrackerPtr const& child ) = 0; + virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0; + virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isGeneratorTracker() const = 0; + }; + + class TrackerContext { + + enum RunState { + NotStarted, + Executing, + CompletedCycle + }; + + ITrackerPtr m_rootTracker; + ITracker* m_currentTracker = nullptr; + RunState m_runState = NotStarted; + + public: + + ITracker& startRun(); + void endRun(); + + void startCycle(); + void completeCycle(); + + bool completedCycle() const; + ITracker& currentTracker(); + void setCurrentTracker( ITracker* tracker ); + }; + + class TrackerBase : public ITracker { + protected: + enum CycleState { + NotStarted, + Executing, + ExecutingChildren, + NeedsAnotherRun, + CompletedSuccessfully, + Failed + }; + + using Children = std::vector<ITrackerPtr>; + NameAndLocation m_nameAndLocation; + TrackerContext& m_ctx; + ITracker* m_parent; + Children m_children; + CycleState m_runState = NotStarted; + + public: + TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + + NameAndLocation const& nameAndLocation() const override; + bool isComplete() const override; + bool isSuccessfullyCompleted() const override; + bool isOpen() const override; + bool hasChildren() const override; + + void addChild( ITrackerPtr const& child ) override; + + ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override; + ITracker& parent() override; + + void openChild() override; + + bool isSectionTracker() const override; + bool isGeneratorTracker() const override; + + void open(); + + void close() override; + void fail() override; + void markAsNeedingAnotherRun() override; + + private: + void moveToParent(); + void moveToThis(); + }; + + class SectionTracker : public TrackerBase { + std::vector<std::string> m_filters; + std::string m_trimmed_name; + public: + SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + + bool isSectionTracker() const override; + + bool isComplete() const override; + + static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ); + + void tryOpen(); + + void addInitialFilters( std::vector<std::string> const& filters ); + void addNextFilters( std::vector<std::string> const& filters ); + }; + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; + +} // namespace Catch + +// end catch_test_case_tracker.h + +// start catch_leak_detector.h + +namespace Catch { + + struct LeakDetector { + LeakDetector(); + ~LeakDetector(); + }; + +} +// end catch_leak_detector.h +// Cpp files will be included in the single-header file here +// start catch_stats.cpp + +// Statistical analysis tools + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + +#include <cassert> +#include <random> + +#if defined(CATCH_CONFIG_USE_ASYNC) +#include <future> +#endif + +namespace { + double erf_inv(double x) { + // Code accompanying the article "Approximating the erfinv function" in GPU Computing Gems, Volume 2 + double w, p; + + w = -log((1.0 - x) * (1.0 + x)); + + if (w < 6.250000) { + w = w - 3.125000; + p = -3.6444120640178196996e-21; + p = -1.685059138182016589e-19 + p * w; + p = 1.2858480715256400167e-18 + p * w; + p = 1.115787767802518096e-17 + p * w; + p = -1.333171662854620906e-16 + p * w; + p = 2.0972767875968561637e-17 + p * w; + p = 6.6376381343583238325e-15 + p * w; + p = -4.0545662729752068639e-14 + p * w; + p = -8.1519341976054721522e-14 + p * w; + p = 2.6335093153082322977e-12 + p * w; + p = -1.2975133253453532498e-11 + p * w; + p = -5.4154120542946279317e-11 + p * w; + p = 1.051212273321532285e-09 + p * w; + p = -4.1126339803469836976e-09 + p * w; + p = -2.9070369957882005086e-08 + p * w; + p = 4.2347877827932403518e-07 + p * w; + p = -1.3654692000834678645e-06 + p * w; + p = -1.3882523362786468719e-05 + p * w; + p = 0.0001867342080340571352 + p * w; + p = -0.00074070253416626697512 + p * w; + p = -0.0060336708714301490533 + p * w; + p = 0.24015818242558961693 + p * w; + p = 1.6536545626831027356 + p * w; + } else if (w < 16.000000) { + w = sqrt(w) - 3.250000; + p = 2.2137376921775787049e-09; + p = 9.0756561938885390979e-08 + p * w; + p = -2.7517406297064545428e-07 + p * w; + p = 1.8239629214389227755e-08 + p * w; + p = 1.5027403968909827627e-06 + p * w; + p = -4.013867526981545969e-06 + p * w; + p = 2.9234449089955446044e-06 + p * w; + p = 1.2475304481671778723e-05 + p * w; + p = -4.7318229009055733981e-05 + p * w; + p = 6.8284851459573175448e-05 + p * w; + p = 2.4031110387097893999e-05 + p * w; + p = -0.0003550375203628474796 + p * w; + p = 0.00095328937973738049703 + p * w; + p = -0.0016882755560235047313 + p * w; + p = 0.0024914420961078508066 + p * w; + p = -0.0037512085075692412107 + p * w; + p = 0.005370914553590063617 + p * w; + p = 1.0052589676941592334 + p * w; + p = 3.0838856104922207635 + p * w; + } else { + w = sqrt(w) - 5.000000; + p = -2.7109920616438573243e-11; + p = -2.5556418169965252055e-10 + p * w; + p = 1.5076572693500548083e-09 + p * w; + p = -3.7894654401267369937e-09 + p * w; + p = 7.6157012080783393804e-09 + p * w; + p = -1.4960026627149240478e-08 + p * w; + p = 2.9147953450901080826e-08 + p * w; + p = -6.7711997758452339498e-08 + p * w; + p = 2.2900482228026654717e-07 + p * w; + p = -9.9298272942317002539e-07 + p * w; + p = 4.5260625972231537039e-06 + p * w; + p = -1.9681778105531670567e-05 + p * w; + p = 7.5995277030017761139e-05 + p * w; + p = -0.00021503011930044477347 + p * w; + p = -0.00013871931833623122026 + p * w; + p = 1.0103004648645343977 + p * w; + p = 4.8499064014085844221 + p * w; + } + return p * x; + } + + double standard_deviation(std::vector<double>::iterator first, std::vector<double>::iterator last) { + auto m = Catch::Benchmark::Detail::mean(first, last); + double variance = std::accumulate(first, last, 0., [m](double a, double b) { + double diff = b - m; + return a + diff * diff; + }) / (last - first); + return std::sqrt(variance); + } + +} + +namespace Catch { + namespace Benchmark { + namespace Detail { + + double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last) { + auto count = last - first; + double idx = (count - 1) * k / static_cast<double>(q); + int j = static_cast<int>(idx); + double g = idx - j; + std::nth_element(first, first + j, last); + auto xj = first[j]; + if (g == 0) return xj; + + auto xj1 = *std::min_element(first + (j + 1), last); + return xj + g * (xj1 - xj); + } + + double erfc_inv(double x) { + return erf_inv(1.0 - x); + } + + double normal_quantile(double p) { + static const double ROOT_TWO = std::sqrt(2.0); + + double result = 0.0; + assert(p >= 0 && p <= 1); + if (p < 0 || p > 1) { + return result; + } + + result = -erfc_inv(2.0 * p); + // result *= normal distribution standard deviation (1.0) * sqrt(2) + result *= /*sd * */ ROOT_TWO; + // result += normal disttribution mean (0) + return result; + } + + double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) { + double sb = stddev.point; + double mn = mean.point / n; + double mg_min = mn / 2.; + double sg = std::min(mg_min / 4., sb / std::sqrt(n)); + double sg2 = sg * sg; + double sb2 = sb * sb; + + auto c_max = [n, mn, sb2, sg2](double x) -> double { + double k = mn - x; + double d = k * k; + double nd = n * d; + double k0 = -n * nd; + double k1 = sb2 - n * sg2 + nd; + double det = k1 * k1 - 4 * sg2 * k0; + return (int)(-2. * k0 / (k1 + std::sqrt(det))); + }; + + auto var_out = [n, sb2, sg2](double c) { + double nc = n - c; + return (nc / n) * (sb2 - nc * sg2); + }; + + return std::min(var_out(1), var_out(std::min(c_max(0.), c_max(mg_min)))) / sb2; + } + + bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) { + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS + static std::random_device entropy; + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++ + + auto mean = &Detail::mean<std::vector<double>::iterator>; + auto stddev = &standard_deviation; + +#if defined(CATCH_CONFIG_USE_ASYNC) + auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) { + auto seed = entropy(); + return std::async(std::launch::async, [=] { + std::mt19937 rng(seed); + auto resampled = resample(rng, n_resamples, first, last, f); + return bootstrap(confidence_level, first, last, resampled, f); + }); + }; + + auto mean_future = Estimate(mean); + auto stddev_future = Estimate(stddev); + + auto mean_estimate = mean_future.get(); + auto stddev_estimate = stddev_future.get(); +#else + auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) { + auto seed = entropy(); + std::mt19937 rng(seed); + auto resampled = resample(rng, n_resamples, first, last, f); + return bootstrap(confidence_level, first, last, resampled, f); + }; + + auto mean_estimate = Estimate(mean); + auto stddev_estimate = Estimate(stddev); +#endif // CATCH_USE_ASYNC + + double outlier_variance = Detail::outlier_variance(mean_estimate, stddev_estimate, n); + + return { mean_estimate, stddev_estimate, outlier_variance }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING +// end catch_stats.cpp +// start catch_approx.cpp + +#include <cmath> +#include <limits> + +namespace { + +// Performs equivalent check of std::fabs(lhs - rhs) <= margin +// But without the subtraction to allow for INFINITY in comparison +bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); +} + +} + +namespace Catch { +namespace Detail { + + Approx::Approx ( double value ) + : m_epsilon( std::numeric_limits<float>::epsilon()*100 ), + m_margin( 0.0 ), + m_scale( 0.0 ), + m_value( value ) + {} + + Approx Approx::custom() { + return Approx( 0 ); + } + + Approx Approx::operator-() const { + auto temp(*this); + temp.m_value = -temp.m_value; + return temp; + } + + std::string Approx::toString() const { + ReusableStringStream rss; + rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; + return rss.str(); + } + + bool Approx::equalityComparisonImpl(const double other) const { + // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value + // Thanks to Richard Harris for his help refining the scaled margin value + return marginComparison(m_value, other, m_margin) + || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value))); + } + + void Approx::setMargin(double newMargin) { + CATCH_ENFORCE(newMargin >= 0, + "Invalid Approx::margin: " << newMargin << '.' + << " Approx::Margin has to be non-negative."); + m_margin = newMargin; + } + + void Approx::setEpsilon(double newEpsilon) { + CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0, + "Invalid Approx::epsilon: " << newEpsilon << '.' + << " Approx::epsilon has to be in [0, 1]"); + m_epsilon = newEpsilon; + } + +} // end namespace Detail + +namespace literals { + Detail::Approx operator "" _a(long double val) { + return Detail::Approx(val); + } + Detail::Approx operator "" _a(unsigned long long val) { + return Detail::Approx(val); + } +} // end namespace literals + +std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) { + return value.toString(); +} + +} // end namespace Catch +// end catch_approx.cpp +// start catch_assertionhandler.cpp + +// start catch_debugger.h + +namespace Catch { + bool isDebuggerActive(); +} + +#ifdef CATCH_PLATFORM_MAC + + #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ + +#elif defined(CATCH_PLATFORM_IPHONE) + + // use inline assembler + #if defined(__i386__) || defined(__x86_64__) + #define CATCH_TRAP() __asm__("int $3") + #elif defined(__aarch64__) + #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #elif defined(__arm__) && !defined(__thumb__) + #define CATCH_TRAP() __asm__(".inst 0xe7f001f0") + #elif defined(__arm__) && defined(__thumb__) + #define CATCH_TRAP() __asm__(".inst 0xde01") + #endif + +#elif defined(CATCH_PLATFORM_LINUX) + // If we can use inline assembler, do it because this allows us to break + // directly at the location of the failing check instead of breaking inside + // raise() called from it, i.e. one stack frame below. + #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) + #define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */ + #else // Fall back to the generic way. + #include <signal.h> + + #define CATCH_TRAP() raise(SIGTRAP) + #endif +#elif defined(_MSC_VER) + #define CATCH_TRAP() __debugbreak() +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) void __stdcall DebugBreak(); + #define CATCH_TRAP() DebugBreak() +#endif + +#ifndef CATCH_BREAK_INTO_DEBUGGER + #ifdef CATCH_TRAP + #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() + #else + #define CATCH_BREAK_INTO_DEBUGGER() []{}() + #endif +#endif + +// end catch_debugger.h +// start catch_run_context.h + +// start catch_fatal_condition.h + +// start catch_windows_h_proxy.h + + +#if defined(CATCH_PLATFORM_WINDOWS) + +#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) +# define CATCH_DEFINED_NOMINMAX +# define NOMINMAX +#endif +#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) +# define CATCH_DEFINED_WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#ifdef __AFXDLL +#include <AfxWin.h> +#else +#include <windows.h> +#endif + +#ifdef CATCH_DEFINED_NOMINMAX +# undef NOMINMAX +#endif +#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN +# undef WIN32_LEAN_AND_MEAN +#endif + +#endif // defined(CATCH_PLATFORM_WINDOWS) + +// end catch_windows_h_proxy.h +#if defined( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + + struct FatalConditionHandler { + + static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo); + FatalConditionHandler(); + static void reset(); + ~FatalConditionHandler(); + + private: + static bool isSet; + static ULONG guaranteeSize; + static PVOID exceptionHandlerHandle; + }; + +} // namespace Catch + +#elif defined ( CATCH_CONFIG_POSIX_SIGNALS ) + +#include <signal.h> + +namespace Catch { + + struct FatalConditionHandler { + + static bool isSet; + static struct sigaction oldSigActions[]; + static stack_t oldSigStack; + static char altStackMem[]; + + static void handleSignal( int sig ); + + FatalConditionHandler(); + ~FatalConditionHandler(); + static void reset(); + }; + +} // namespace Catch + +#else + +namespace Catch { + struct FatalConditionHandler { + void reset(); + }; +} + +#endif + +// end catch_fatal_condition.h +#include <string> + +namespace Catch { + + struct IMutableContext; + + /////////////////////////////////////////////////////////////////////////// + + class RunContext : public IResultCapture, public IRunner { + + public: + RunContext( RunContext const& ) = delete; + RunContext& operator =( RunContext const& ) = delete; + + explicit RunContext( IConfigPtr const& _config, IStreamingReporterPtr&& reporter ); + + ~RunContext() override; + + void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ); + void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ); + + Totals runTest(TestCase const& testCase); + + IConfigPtr config() const; + IStreamingReporter& reporter() const; + + public: // IResultCapture + + // Assertion handlers + void handleExpr + ( AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction ) override; + void handleMessage + ( AssertionInfo const& info, + ResultWas::OfType resultType, + StringRef const& message, + AssertionReaction& reaction ) override; + void handleUnexpectedExceptionNotThrown + ( AssertionInfo const& info, + AssertionReaction& reaction ) override; + void handleUnexpectedInflightException + ( AssertionInfo const& info, + std::string const& message, + AssertionReaction& reaction ) override; + void handleIncomplete + ( AssertionInfo const& info ) override; + void handleNonExpr + ( AssertionInfo const &info, + ResultWas::OfType resultType, + AssertionReaction &reaction ) override; + + bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) override; + + void sectionEnded( SectionEndInfo const& endInfo ) override; + void sectionEndedEarly( SectionEndInfo const& endInfo ) override; + + auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing( std::string const& name ) override; + void benchmarkStarting( BenchmarkInfo const& info ) override; + void benchmarkEnded( BenchmarkStats<> const& stats ) override; + void benchmarkFailed( std::string const& error ) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void pushScopedMessage( MessageInfo const& message ) override; + void popScopedMessage( MessageInfo const& message ) override; + + void emplaceUnscopedMessage( MessageBuilder const& builder ) override; + + std::string getCurrentTestName() const override; + + const AssertionResult* getLastResult() const override; + + void exceptionEarlyReported() override; + + void handleFatalErrorCondition( StringRef message ) override; + + bool lastAssertionPassed() override; + + void assertionPassed() override; + + public: + // !TBD We need to do this another way! + bool aborting() const final; + + private: + + void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ); + void invokeActiveTestCase(); + + void resetAssertionInfo(); + bool testForMissingAssertions( Counts& assertions ); + + void assertionEnded( AssertionResult const& result ); + void reportExpr + ( AssertionInfo const &info, + ResultWas::OfType resultType, + ITransientExpression const *expr, + bool negated ); + + void populateReaction( AssertionReaction& reaction ); + + private: + + void handleUnfinishedSections(); + + TestRunInfo m_runInfo; + IMutableContext& m_context; + TestCase const* m_activeTestCase = nullptr; + ITracker* m_testCaseTracker = nullptr; + Option<AssertionResult> m_lastResult; + + IConfigPtr m_config; + Totals m_totals; + IStreamingReporterPtr m_reporter; + std::vector<MessageInfo> m_messages; + std::vector<ScopedMessage> m_messageScopes; /* Keeps owners of so-called unscoped messages. */ + AssertionInfo m_lastAssertionInfo; + std::vector<SectionEndInfo> m_unfinishedSections; + std::vector<ITracker*> m_activeSections; + TrackerContext m_trackerContext; + bool m_lastAssertionPassed = false; + bool m_shouldReportUnexpected = true; + bool m_includeSuccessfulResults; + }; + + void seedRng(IConfig const& config); + unsigned int rngSeed(); +} // end namespace Catch + +// end catch_run_context.h +namespace Catch { + + namespace { + auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& { + expr.streamReconstructedExpression( os ); + return os; + } + } + + LazyExpression::LazyExpression( bool isNegated ) + : m_isNegated( isNegated ) + {} + + LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {} + + LazyExpression::operator bool() const { + return m_transientExpression != nullptr; + } + + auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& { + if( lazyExpr.m_isNegated ) + os << "!"; + + if( lazyExpr ) { + if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() ) + os << "(" << *lazyExpr.m_transientExpression << ")"; + else + os << *lazyExpr.m_transientExpression; + } + else { + os << "{** error - unchecked empty expression requested **}"; + } + return os; + } + + AssertionHandler::AssertionHandler + ( StringRef const& macroName, + SourceLineInfo const& lineInfo, + StringRef capturedExpression, + ResultDisposition::Flags resultDisposition ) + : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition }, + m_resultCapture( getResultCapture() ) + {} + + void AssertionHandler::handleExpr( ITransientExpression const& expr ) { + m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction ); + } + void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) { + m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction ); + } + + auto AssertionHandler::allowThrows() const -> bool { + return getCurrentContext().getConfig()->allowThrows(); + } + + void AssertionHandler::complete() { + setCompleted(); + if( m_reaction.shouldDebugBreak ) { + + // If you find your debugger stopping you here then go one level up on the + // call-stack for the code that caused it (typically a failed assertion) + + // (To go back to the test and change execution, jump over the throw, next) + CATCH_BREAK_INTO_DEBUGGER(); + } + if (m_reaction.shouldThrow) { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + throw Catch::TestFailureException(); +#else + CATCH_ERROR( "Test failure requires aborting test!" ); +#endif + } + } + void AssertionHandler::setCompleted() { + m_completed = true; + } + + void AssertionHandler::handleUnexpectedInflightException() { + m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction ); + } + + void AssertionHandler::handleExceptionThrownAsExpected() { + m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); + } + void AssertionHandler::handleExceptionNotThrownAsExpected() { + m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); + } + + void AssertionHandler::handleUnexpectedExceptionNotThrown() { + m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction ); + } + + void AssertionHandler::handleThrowingCallSkipped() { + m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); + } + + // This is the overload that takes a string and infers the Equals matcher from it + // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp + void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString ) { + handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString ); + } + +} // namespace Catch +// end catch_assertionhandler.cpp +// start catch_assertionresult.cpp + +namespace Catch { + AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression): + lazyExpression(_lazyExpression), + resultType(_resultType) {} + + std::string AssertionResultData::reconstructExpression() const { + + if( reconstructedExpression.empty() ) { + if( lazyExpression ) { + ReusableStringStream rss; + rss << lazyExpression; + reconstructedExpression = rss.str(); + } + } + return reconstructedExpression; + } + + AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) + : m_info( info ), + m_resultData( data ) + {} + + // Result was a success + bool AssertionResult::succeeded() const { + return Catch::isOk( m_resultData.resultType ); + } + + // Result was a success, or failure is suppressed + bool AssertionResult::isOk() const { + return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); + } + + ResultWas::OfType AssertionResult::getResultType() const { + return m_resultData.resultType; + } + + bool AssertionResult::hasExpression() const { + return !m_info.capturedExpression.empty(); + } + + bool AssertionResult::hasMessage() const { + return !m_resultData.message.empty(); + } + + std::string AssertionResult::getExpression() const { + // Possibly overallocating by 3 characters should be basically free + std::string expr; expr.reserve(m_info.capturedExpression.size() + 3); + if (isFalseTest(m_info.resultDisposition)) { + expr += "!("; + } + expr += m_info.capturedExpression; + if (isFalseTest(m_info.resultDisposition)) { + expr += ')'; + } + return expr; + } + + std::string AssertionResult::getExpressionInMacro() const { + std::string expr; + if( m_info.macroName.empty() ) + expr = static_cast<std::string>(m_info.capturedExpression); + else { + expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 ); + expr += m_info.macroName; + expr += "( "; + expr += m_info.capturedExpression; + expr += " )"; + } + return expr; + } + + bool AssertionResult::hasExpandedExpression() const { + return hasExpression() && getExpandedExpression() != getExpression(); + } + + std::string AssertionResult::getExpandedExpression() const { + std::string expr = m_resultData.reconstructExpression(); + return expr.empty() + ? getExpression() + : expr; + } + + std::string AssertionResult::getMessage() const { + return m_resultData.message; + } + SourceLineInfo AssertionResult::getSourceInfo() const { + return m_info.lineInfo; + } + + StringRef AssertionResult::getTestMacroName() const { + return m_info.macroName; + } + +} // end namespace Catch +// end catch_assertionresult.cpp +// start catch_capture_matchers.cpp + +namespace Catch { + + using StringMatcher = Matchers::Impl::MatcherBase<std::string>; + + // This is the general overload that takes a any string matcher + // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers + // the Equals matcher (so the header does not mention matchers) + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ) { + std::string exceptionMessage = Catch::translateActiveException(); + MatchExpr<std::string, StringMatcher const&> expr( exceptionMessage, matcher, matcherString ); + handler.handleExpr( expr ); + } + +} // namespace Catch +// end catch_capture_matchers.cpp +// start catch_commandline.cpp + +// start catch_commandline.h + +// start catch_clara.h + +// Use Catch's value for console width (store Clara's off to the side, if present) +#ifdef CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#endif +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH-1 + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#pragma clang diagnostic ignored "-Wexit-time-destructors" +#pragma clang diagnostic ignored "-Wshadow" +#endif + +// start clara.hpp +// Copyright 2017 Two Blue Cubes Ltd. All rights reserved. +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// See https://github.com/philsquared/Clara for more details + +// Clara v1.1.5 + + +#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80 +#endif + +#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +#ifndef CLARA_CONFIG_OPTIONAL_TYPE +#ifdef __has_include +#if __has_include(<optional>) && __cplusplus >= 201703L +#include <optional> +#define CLARA_CONFIG_OPTIONAL_TYPE std::optional +#endif +#endif +#endif + +// ----------- #included from clara_textflow.hpp ----------- + +// TextFlowCpp +// +// A single-header library for wrapping and laying out basic text, by Phil Nash +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// This project is hosted at https://github.com/philsquared/textflowcpp + + +#include <cassert> +#include <ostream> +#include <sstream> +#include <vector> + +#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { +namespace clara { +namespace TextFlow { + +inline auto isWhitespace(char c) -> bool { + static std::string chars = " \t\n\r"; + return chars.find(c) != std::string::npos; +} +inline auto isBreakableBefore(char c) -> bool { + static std::string chars = "[({<|"; + return chars.find(c) != std::string::npos; +} +inline auto isBreakableAfter(char c) -> bool { + static std::string chars = "])}>.,:;*+-=&/\\"; + return chars.find(c) != std::string::npos; +} + +class Columns; + +class Column { + std::vector<std::string> m_strings; + size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH; + size_t m_indent = 0; + size_t m_initialIndent = std::string::npos; + +public: + class iterator { + friend Column; + + Column const& m_column; + size_t m_stringIndex = 0; + size_t m_pos = 0; + + size_t m_len = 0; + size_t m_end = 0; + bool m_suffix = false; + + iterator(Column const& column, size_t stringIndex) + : m_column(column), + m_stringIndex(stringIndex) {} + + auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; } + + auto isBoundary(size_t at) const -> bool { + assert(at > 0); + assert(at <= line().size()); + + return at == line().size() || + (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) || + isBreakableBefore(line()[at]) || + isBreakableAfter(line()[at - 1]); + } + + void calcLength() { + assert(m_stringIndex < m_column.m_strings.size()); + + m_suffix = false; + auto width = m_column.m_width - indent(); + m_end = m_pos; + if (line()[m_pos] == '\n') { + ++m_end; + } + while (m_end < line().size() && line()[m_end] != '\n') + ++m_end; + + if (m_end < m_pos + width) { + m_len = m_end - m_pos; + } else { + size_t len = width; + while (len > 0 && !isBoundary(m_pos + len)) + --len; + while (len > 0 && isWhitespace(line()[m_pos + len - 1])) + --len; + + if (len > 0) { + m_len = len; + } else { + m_suffix = true; + m_len = width - 1; + } + } + } + + auto indent() const -> size_t { + auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos; + return initial == std::string::npos ? m_column.m_indent : initial; + } + + auto addIndentAndSuffix(std::string const &plain) const -> std::string { + return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain); + } + + public: + using difference_type = std::ptrdiff_t; + using value_type = std::string; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::forward_iterator_tag; + + explicit iterator(Column const& column) : m_column(column) { + assert(m_column.m_width > m_column.m_indent); + assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent); + calcLength(); + if (m_len == 0) + m_stringIndex++; // Empty string + } + + auto operator *() const -> std::string { + assert(m_stringIndex < m_column.m_strings.size()); + assert(m_pos <= m_end); + return addIndentAndSuffix(line().substr(m_pos, m_len)); + } + + auto operator ++() -> iterator& { + m_pos += m_len; + if (m_pos < line().size() && line()[m_pos] == '\n') + m_pos += 1; + else + while (m_pos < line().size() && isWhitespace(line()[m_pos])) + ++m_pos; + + if (m_pos == line().size()) { + m_pos = 0; + ++m_stringIndex; + } + if (m_stringIndex < m_column.m_strings.size()) + calcLength(); + return *this; + } + auto operator ++(int) -> iterator { + iterator prev(*this); + operator++(); + return prev; + } + + auto operator ==(iterator const& other) const -> bool { + return + m_pos == other.m_pos && + m_stringIndex == other.m_stringIndex && + &m_column == &other.m_column; + } + auto operator !=(iterator const& other) const -> bool { + return !operator==(other); + } + }; + using const_iterator = iterator; + + explicit Column(std::string const& text) { m_strings.push_back(text); } + + auto width(size_t newWidth) -> Column& { + assert(newWidth > 0); + m_width = newWidth; + return *this; + } + auto indent(size_t newIndent) -> Column& { + m_indent = newIndent; + return *this; + } + auto initialIndent(size_t newIndent) -> Column& { + m_initialIndent = newIndent; + return *this; + } + + auto width() const -> size_t { return m_width; } + auto begin() const -> iterator { return iterator(*this); } + auto end() const -> iterator { return { *this, m_strings.size() }; } + + inline friend std::ostream& operator << (std::ostream& os, Column const& col) { + bool first = true; + for (auto line : col) { + if (first) + first = false; + else + os << "\n"; + os << line; + } + return os; + } + + auto operator + (Column const& other)->Columns; + + auto toString() const -> std::string { + std::ostringstream oss; + oss << *this; + return oss.str(); + } +}; + +class Spacer : public Column { + +public: + explicit Spacer(size_t spaceWidth) : Column("") { + width(spaceWidth); + } +}; + +class Columns { + std::vector<Column> m_columns; + +public: + + class iterator { + friend Columns; + struct EndTag {}; + + std::vector<Column> const& m_columns; + std::vector<Column::iterator> m_iterators; + size_t m_activeIterators; + + iterator(Columns const& columns, EndTag) + : m_columns(columns.m_columns), + m_activeIterators(0) { + m_iterators.reserve(m_columns.size()); + + for (auto const& col : m_columns) + m_iterators.push_back(col.end()); + } + + public: + using difference_type = std::ptrdiff_t; + using value_type = std::string; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::forward_iterator_tag; + + explicit iterator(Columns const& columns) + : m_columns(columns.m_columns), + m_activeIterators(m_columns.size()) { + m_iterators.reserve(m_columns.size()); + + for (auto const& col : m_columns) + m_iterators.push_back(col.begin()); + } + + auto operator ==(iterator const& other) const -> bool { + return m_iterators == other.m_iterators; + } + auto operator !=(iterator const& other) const -> bool { + return m_iterators != other.m_iterators; + } + auto operator *() const -> std::string { + std::string row, padding; + + for (size_t i = 0; i < m_columns.size(); ++i) { + auto width = m_columns[i].width(); + if (m_iterators[i] != m_columns[i].end()) { + std::string col = *m_iterators[i]; + row += padding + col; + if (col.size() < width) + padding = std::string(width - col.size(), ' '); + else + padding = ""; + } else { + padding += std::string(width, ' '); + } + } + return row; + } + auto operator ++() -> iterator& { + for (size_t i = 0; i < m_columns.size(); ++i) { + if (m_iterators[i] != m_columns[i].end()) + ++m_iterators[i]; + } + return *this; + } + auto operator ++(int) -> iterator { + iterator prev(*this); + operator++(); + return prev; + } + }; + using const_iterator = iterator; + + auto begin() const -> iterator { return iterator(*this); } + auto end() const -> iterator { return { *this, iterator::EndTag() }; } + + auto operator += (Column const& col) -> Columns& { + m_columns.push_back(col); + return *this; + } + auto operator + (Column const& col) -> Columns { + Columns combined = *this; + combined += col; + return combined; + } + + inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) { + + bool first = true; + for (auto line : cols) { + if (first) + first = false; + else + os << "\n"; + os << line; + } + return os; + } + + auto toString() const -> std::string { + std::ostringstream oss; + oss << *this; + return oss.str(); + } +}; + +inline auto Column::operator + (Column const& other) -> Columns { + Columns cols; + cols += *this; + cols += other; + return cols; +} +} + +} +} + +// ----------- end of #include from clara_textflow.hpp ----------- +// ........... back in clara.hpp + +#include <cctype> +#include <string> +#include <memory> +#include <set> +#include <algorithm> + +#if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ) +#define CATCH_PLATFORM_WINDOWS +#endif + +namespace Catch { namespace clara { +namespace detail { + + // Traits for extracting arg and return type of lambdas (for single argument lambdas) + template<typename L> + struct UnaryLambdaTraits : UnaryLambdaTraits<decltype( &L::operator() )> {}; + + template<typename ClassT, typename ReturnT, typename... Args> + struct UnaryLambdaTraits<ReturnT( ClassT::* )( Args... ) const> { + static const bool isValid = false; + }; + + template<typename ClassT, typename ReturnT, typename ArgT> + struct UnaryLambdaTraits<ReturnT( ClassT::* )( ArgT ) const> { + static const bool isValid = true; + using ArgType = typename std::remove_const<typename std::remove_reference<ArgT>::type>::type; + using ReturnType = ReturnT; + }; + + class TokenStream; + + // Transport for raw args (copied from main args, or supplied via init list for testing) + class Args { + friend TokenStream; + std::string m_exeName; + std::vector<std::string> m_args; + + public: + Args( int argc, char const* const* argv ) + : m_exeName(argv[0]), + m_args(argv + 1, argv + argc) {} + + Args( std::initializer_list<std::string> args ) + : m_exeName( *args.begin() ), + m_args( args.begin()+1, args.end() ) + {} + + auto exeName() const -> std::string { + return m_exeName; + } + }; + + // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string + // may encode an option + its argument if the : or = form is used + enum class TokenType { + Option, Argument + }; + struct Token { + TokenType type; + std::string token; + }; + + inline auto isOptPrefix( char c ) -> bool { + return c == '-' +#ifdef CATCH_PLATFORM_WINDOWS + || c == '/' +#endif + ; + } + + // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled + class TokenStream { + using Iterator = std::vector<std::string>::const_iterator; + Iterator it; + Iterator itEnd; + std::vector<Token> m_tokenBuffer; + + void loadBuffer() { + m_tokenBuffer.resize( 0 ); + + // Skip any empty strings + while( it != itEnd && it->empty() ) + ++it; + + if( it != itEnd ) { + auto const &next = *it; + if( isOptPrefix( next[0] ) ) { + auto delimiterPos = next.find_first_of( " :=" ); + if( delimiterPos != std::string::npos ) { + m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); + m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } ); + } else { + if( next[1] != '-' && next.size() > 2 ) { + std::string opt = "- "; + for( size_t i = 1; i < next.size(); ++i ) { + opt[1] = next[i]; + m_tokenBuffer.push_back( { TokenType::Option, opt } ); + } + } else { + m_tokenBuffer.push_back( { TokenType::Option, next } ); + } + } + } else { + m_tokenBuffer.push_back( { TokenType::Argument, next } ); + } + } + } + + public: + explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {} + + TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) { + loadBuffer(); + } + + explicit operator bool() const { + return !m_tokenBuffer.empty() || it != itEnd; + } + + auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); } + + auto operator*() const -> Token { + assert( !m_tokenBuffer.empty() ); + return m_tokenBuffer.front(); + } + + auto operator->() const -> Token const * { + assert( !m_tokenBuffer.empty() ); + return &m_tokenBuffer.front(); + } + + auto operator++() -> TokenStream & { + if( m_tokenBuffer.size() >= 2 ) { + m_tokenBuffer.erase( m_tokenBuffer.begin() ); + } else { + if( it != itEnd ) + ++it; + loadBuffer(); + } + return *this; + } + }; + + class ResultBase { + public: + enum Type { + Ok, LogicError, RuntimeError + }; + + protected: + ResultBase( Type type ) : m_type( type ) {} + virtual ~ResultBase() = default; + + virtual void enforceOk() const = 0; + + Type m_type; + }; + + template<typename T> + class ResultValueBase : public ResultBase { + public: + auto value() const -> T const & { + enforceOk(); + return m_value; + } + + protected: + ResultValueBase( Type type ) : ResultBase( type ) {} + + ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) { + if( m_type == ResultBase::Ok ) + new( &m_value ) T( other.m_value ); + } + + ResultValueBase( Type, T const &value ) : ResultBase( Ok ) { + new( &m_value ) T( value ); + } + + auto operator=( ResultValueBase const &other ) -> ResultValueBase & { + if( m_type == ResultBase::Ok ) + m_value.~T(); + ResultBase::operator=(other); + if( m_type == ResultBase::Ok ) + new( &m_value ) T( other.m_value ); + return *this; + } + + ~ResultValueBase() override { + if( m_type == Ok ) + m_value.~T(); + } + + union { + T m_value; + }; + }; + + template<> + class ResultValueBase<void> : public ResultBase { + protected: + using ResultBase::ResultBase; + }; + + template<typename T = void> + class BasicResult : public ResultValueBase<T> { + public: + template<typename U> + explicit BasicResult( BasicResult<U> const &other ) + : ResultValueBase<T>( other.type() ), + m_errorMessage( other.errorMessage() ) + { + assert( type() != ResultBase::Ok ); + } + + template<typename U> + static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; } + static auto ok() -> BasicResult { return { ResultBase::Ok }; } + static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; } + static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; } + + explicit operator bool() const { return m_type == ResultBase::Ok; } + auto type() const -> ResultBase::Type { return m_type; } + auto errorMessage() const -> std::string { return m_errorMessage; } + + protected: + void enforceOk() const override { + + // Errors shouldn't reach this point, but if they do + // the actual error message will be in m_errorMessage + assert( m_type != ResultBase::LogicError ); + assert( m_type != ResultBase::RuntimeError ); + if( m_type != ResultBase::Ok ) + std::abort(); + } + + std::string m_errorMessage; // Only populated if resultType is an error + + BasicResult( ResultBase::Type type, std::string const &message ) + : ResultValueBase<T>(type), + m_errorMessage(message) + { + assert( m_type != ResultBase::Ok ); + } + + using ResultValueBase<T>::ResultValueBase; + using ResultBase::m_type; + }; + + enum class ParseResultType { + Matched, NoMatch, ShortCircuitAll, ShortCircuitSame + }; + + class ParseState { + public: + + ParseState( ParseResultType type, TokenStream const &remainingTokens ) + : m_type(type), + m_remainingTokens( remainingTokens ) + {} + + auto type() const -> ParseResultType { return m_type; } + auto remainingTokens() const -> TokenStream { return m_remainingTokens; } + + private: + ParseResultType m_type; + TokenStream m_remainingTokens; + }; + + using Result = BasicResult<void>; + using ParserResult = BasicResult<ParseResultType>; + using InternalParseResult = BasicResult<ParseState>; + + struct HelpColumns { + std::string left; + std::string right; + }; + + template<typename T> + inline auto convertInto( std::string const &source, T& target ) -> ParserResult { + std::stringstream ss; + ss << source; + ss >> target; + if( ss.fail() ) + return ParserResult::runtimeError( "Unable to convert '" + source + "' to destination type" ); + else + return ParserResult::ok( ParseResultType::Matched ); + } + inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult { + target = source; + return ParserResult::ok( ParseResultType::Matched ); + } + inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { + std::string srcLC = source; + std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( char c ) { return static_cast<char>( std::tolower(c) ); } ); + if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") + target = true; + else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") + target = false; + else + return ParserResult::runtimeError( "Expected a boolean value but did not recognise: '" + source + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + } +#ifdef CLARA_CONFIG_OPTIONAL_TYPE + template<typename T> + inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE<T>& target ) -> ParserResult { + T temp; + auto result = convertInto( source, temp ); + if( result ) + target = std::move(temp); + return result; + } +#endif // CLARA_CONFIG_OPTIONAL_TYPE + + struct NonCopyable { + NonCopyable() = default; + NonCopyable( NonCopyable const & ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable &operator=( NonCopyable const & ) = delete; + NonCopyable &operator=( NonCopyable && ) = delete; + }; + + struct BoundRef : NonCopyable { + virtual ~BoundRef() = default; + virtual auto isContainer() const -> bool { return false; } + virtual auto isFlag() const -> bool { return false; } + }; + struct BoundValueRefBase : BoundRef { + virtual auto setValue( std::string const &arg ) -> ParserResult = 0; + }; + struct BoundFlagRefBase : BoundRef { + virtual auto setFlag( bool flag ) -> ParserResult = 0; + virtual auto isFlag() const -> bool { return true; } + }; + + template<typename T> + struct BoundValueRef : BoundValueRefBase { + T &m_ref; + + explicit BoundValueRef( T &ref ) : m_ref( ref ) {} + + auto setValue( std::string const &arg ) -> ParserResult override { + return convertInto( arg, m_ref ); + } + }; + + template<typename T> + struct BoundValueRef<std::vector<T>> : BoundValueRefBase { + std::vector<T> &m_ref; + + explicit BoundValueRef( std::vector<T> &ref ) : m_ref( ref ) {} + + auto isContainer() const -> bool override { return true; } + + auto setValue( std::string const &arg ) -> ParserResult override { + T temp; + auto result = convertInto( arg, temp ); + if( result ) + m_ref.push_back( temp ); + return result; + } + }; + + struct BoundFlagRef : BoundFlagRefBase { + bool &m_ref; + + explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {} + + auto setFlag( bool flag ) -> ParserResult override { + m_ref = flag; + return ParserResult::ok( ParseResultType::Matched ); + } + }; + + template<typename ReturnType> + struct LambdaInvoker { + static_assert( std::is_same<ReturnType, ParserResult>::value, "Lambda must return void or clara::ParserResult" ); + + template<typename L, typename ArgType> + static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { + return lambda( arg ); + } + }; + + template<> + struct LambdaInvoker<void> { + template<typename L, typename ArgType> + static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { + lambda( arg ); + return ParserResult::ok( ParseResultType::Matched ); + } + }; + + template<typename ArgType, typename L> + inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult { + ArgType temp{}; + auto result = convertInto( arg, temp ); + return !result + ? result + : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( lambda, temp ); + } + + template<typename L> + struct BoundLambda : BoundValueRefBase { + L m_lambda; + + static_assert( UnaryLambdaTraits<L>::isValid, "Supplied lambda must take exactly one argument" ); + explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {} + + auto setValue( std::string const &arg ) -> ParserResult override { + return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>( m_lambda, arg ); + } + }; + + template<typename L> + struct BoundFlagLambda : BoundFlagRefBase { + L m_lambda; + + static_assert( UnaryLambdaTraits<L>::isValid, "Supplied lambda must take exactly one argument" ); + static_assert( std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value, "flags must be boolean" ); + + explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {} + + auto setFlag( bool flag ) -> ParserResult override { + return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( m_lambda, flag ); + } + }; + + enum class Optionality { Optional, Required }; + + struct Parser; + + class ParserBase { + public: + virtual ~ParserBase() = default; + virtual auto validate() const -> Result { return Result::ok(); } + virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult = 0; + virtual auto cardinality() const -> size_t { return 1; } + + auto parse( Args const &args ) const -> InternalParseResult { + return parse( args.exeName(), TokenStream( args ) ); + } + }; + + template<typename DerivedT> + class ComposableParserImpl : public ParserBase { + public: + template<typename T> + auto operator|( T const &other ) const -> Parser; + + template<typename T> + auto operator+( T const &other ) const -> Parser; + }; + + // Common code and state for Args and Opts + template<typename DerivedT> + class ParserRefImpl : public ComposableParserImpl<DerivedT> { + protected: + Optionality m_optionality = Optionality::Optional; + std::shared_ptr<BoundRef> m_ref; + std::string m_hint; + std::string m_description; + + explicit ParserRefImpl( std::shared_ptr<BoundRef> const &ref ) : m_ref( ref ) {} + + public: + template<typename T> + ParserRefImpl( T &ref, std::string const &hint ) + : m_ref( std::make_shared<BoundValueRef<T>>( ref ) ), + m_hint( hint ) + {} + + template<typename LambdaT> + ParserRefImpl( LambdaT const &ref, std::string const &hint ) + : m_ref( std::make_shared<BoundLambda<LambdaT>>( ref ) ), + m_hint(hint) + {} + + auto operator()( std::string const &description ) -> DerivedT & { + m_description = description; + return static_cast<DerivedT &>( *this ); + } + + auto optional() -> DerivedT & { + m_optionality = Optionality::Optional; + return static_cast<DerivedT &>( *this ); + }; + + auto required() -> DerivedT & { + m_optionality = Optionality::Required; + return static_cast<DerivedT &>( *this ); + }; + + auto isOptional() const -> bool { + return m_optionality == Optionality::Optional; + } + + auto cardinality() const -> size_t override { + if( m_ref->isContainer() ) + return 0; + else + return 1; + } + + auto hint() const -> std::string { return m_hint; } + }; + + class ExeName : public ComposableParserImpl<ExeName> { + std::shared_ptr<std::string> m_name; + std::shared_ptr<BoundValueRefBase> m_ref; + + template<typename LambdaT> + static auto makeRef(LambdaT const &lambda) -> std::shared_ptr<BoundValueRefBase> { + return std::make_shared<BoundLambda<LambdaT>>( lambda) ; + } + + public: + ExeName() : m_name( std::make_shared<std::string>( "<executable>" ) ) {} + + explicit ExeName( std::string &ref ) : ExeName() { + m_ref = std::make_shared<BoundValueRef<std::string>>( ref ); + } + + template<typename LambdaT> + explicit ExeName( LambdaT const& lambda ) : ExeName() { + m_ref = std::make_shared<BoundLambda<LambdaT>>( lambda ); + } + + // The exe name is not parsed out of the normal tokens, but is handled specially + auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); + } + + auto name() const -> std::string { return *m_name; } + auto set( std::string const& newName ) -> ParserResult { + + auto lastSlash = newName.find_last_of( "\\/" ); + auto filename = ( lastSlash == std::string::npos ) + ? newName + : newName.substr( lastSlash+1 ); + + *m_name = filename; + if( m_ref ) + return m_ref->setValue( filename ); + else + return ParserResult::ok( ParseResultType::Matched ); + } + }; + + class Arg : public ParserRefImpl<Arg> { + public: + using ParserRefImpl::ParserRefImpl; + + auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override { + auto validationResult = validate(); + if( !validationResult ) + return InternalParseResult( validationResult ); + + auto remainingTokens = tokens; + auto const &token = *remainingTokens; + if( token.type != TokenType::Argument ) + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); + + assert( !m_ref->isFlag() ); + auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); + + auto result = valueRef->setValue( remainingTokens->token ); + if( !result ) + return InternalParseResult( result ); + else + return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + } + }; + + inline auto normaliseOpt( std::string const &optName ) -> std::string { +#ifdef CATCH_PLATFORM_WINDOWS + if( optName[0] == '/' ) + return "-" + optName.substr( 1 ); + else +#endif + return optName; + } + + class Opt : public ParserRefImpl<Opt> { + protected: + std::vector<std::string> m_optNames; + + public: + template<typename LambdaT> + explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared<BoundFlagLambda<LambdaT>>( ref ) ) {} + + explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared<BoundFlagRef>( ref ) ) {} + + template<typename LambdaT> + Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} + + template<typename T> + Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} + + auto operator[]( std::string const &optName ) -> Opt & { + m_optNames.push_back( optName ); + return *this; + } + + auto getHelpColumns() const -> std::vector<HelpColumns> { + std::ostringstream oss; + bool first = true; + for( auto const &opt : m_optNames ) { + if (first) + first = false; + else + oss << ", "; + oss << opt; + } + if( !m_hint.empty() ) + oss << " <" << m_hint << ">"; + return { { oss.str(), m_description } }; + } + + auto isMatch( std::string const &optToken ) const -> bool { + auto normalisedToken = normaliseOpt( optToken ); + for( auto const &name : m_optNames ) { + if( normaliseOpt( name ) == normalisedToken ) + return true; + } + return false; + } + + using ParserBase::parse; + + auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { + auto validationResult = validate(); + if( !validationResult ) + return InternalParseResult( validationResult ); + + auto remainingTokens = tokens; + if( remainingTokens && remainingTokens->type == TokenType::Option ) { + auto const &token = *remainingTokens; + if( isMatch(token.token ) ) { + if( m_ref->isFlag() ) { + auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() ); + auto result = flagRef->setFlag( true ); + if( !result ) + return InternalParseResult( result ); + if( result.value() == ParseResultType::ShortCircuitAll ) + return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + } else { + auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); + ++remainingTokens; + if( !remainingTokens ) + return InternalParseResult::runtimeError( "Expected argument following " + token.token ); + auto const &argToken = *remainingTokens; + if( argToken.type != TokenType::Argument ) + return InternalParseResult::runtimeError( "Expected argument following " + token.token ); + auto result = valueRef->setValue( argToken.token ); + if( !result ) + return InternalParseResult( result ); + if( result.value() == ParseResultType::ShortCircuitAll ) + return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + } + return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + } + } + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); + } + + auto validate() const -> Result override { + if( m_optNames.empty() ) + return Result::logicError( "No options supplied to Opt" ); + for( auto const &name : m_optNames ) { + if( name.empty() ) + return Result::logicError( "Option name cannot be empty" ); +#ifdef CATCH_PLATFORM_WINDOWS + if( name[0] != '-' && name[0] != '/' ) + return Result::logicError( "Option name must begin with '-' or '/'" ); +#else + if( name[0] != '-' ) + return Result::logicError( "Option name must begin with '-'" ); +#endif + } + return ParserRefImpl::validate(); + } + }; + + struct Help : Opt { + Help( bool &showHelpFlag ) + : Opt([&]( bool flag ) { + showHelpFlag = flag; + return ParserResult::ok( ParseResultType::ShortCircuitAll ); + }) + { + static_cast<Opt &>( *this ) + ("display usage information") + ["-?"]["-h"]["--help"] + .optional(); + } + }; + + struct Parser : ParserBase { + + mutable ExeName m_exeName; + std::vector<Opt> m_options; + std::vector<Arg> m_args; + + auto operator|=( ExeName const &exeName ) -> Parser & { + m_exeName = exeName; + return *this; + } + + auto operator|=( Arg const &arg ) -> Parser & { + m_args.push_back(arg); + return *this; + } + + auto operator|=( Opt const &opt ) -> Parser & { + m_options.push_back(opt); + return *this; + } + + auto operator|=( Parser const &other ) -> Parser & { + m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end()); + m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end()); + return *this; + } + + template<typename T> + auto operator|( T const &other ) const -> Parser { + return Parser( *this ) |= other; + } + + // Forward deprecated interface with '+' instead of '|' + template<typename T> + auto operator+=( T const &other ) -> Parser & { return operator|=( other ); } + template<typename T> + auto operator+( T const &other ) const -> Parser { return operator|( other ); } + + auto getHelpColumns() const -> std::vector<HelpColumns> { + std::vector<HelpColumns> cols; + for (auto const &o : m_options) { + auto childCols = o.getHelpColumns(); + cols.insert( cols.end(), childCols.begin(), childCols.end() ); + } + return cols; + } + + void writeToStream( std::ostream &os ) const { + if (!m_exeName.name().empty()) { + os << "usage:\n" << " " << m_exeName.name() << " "; + bool required = true, first = true; + for( auto const &arg : m_args ) { + if (first) + first = false; + else + os << " "; + if( arg.isOptional() && required ) { + os << "["; + required = false; + } + os << "<" << arg.hint() << ">"; + if( arg.cardinality() == 0 ) + os << " ... "; + } + if( !required ) + os << "]"; + if( !m_options.empty() ) + os << " options"; + os << "\n\nwhere options are:" << std::endl; + } + + auto rows = getHelpColumns(); + size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; + size_t optWidth = 0; + for( auto const &cols : rows ) + optWidth = (std::max)(optWidth, cols.left.size() + 2); + + optWidth = (std::min)(optWidth, consoleWidth/2); + + for( auto const &cols : rows ) { + auto row = + TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) + + TextFlow::Spacer(4) + + TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth ); + os << row << std::endl; + } + } + + friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& { + parser.writeToStream( os ); + return os; + } + + auto validate() const -> Result override { + for( auto const &opt : m_options ) { + auto result = opt.validate(); + if( !result ) + return result; + } + for( auto const &arg : m_args ) { + auto result = arg.validate(); + if( !result ) + return result; + } + return Result::ok(); + } + + using ParserBase::parse; + + auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override { + + struct ParserInfo { + ParserBase const* parser = nullptr; + size_t count = 0; + }; + const size_t totalParsers = m_options.size() + m_args.size(); + assert( totalParsers < 512 ); + // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do + ParserInfo parseInfos[512]; + + { + size_t i = 0; + for (auto const &opt : m_options) parseInfos[i++].parser = &opt; + for (auto const &arg : m_args) parseInfos[i++].parser = &arg; + } + + m_exeName.set( exeName ); + + auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); + while( result.value().remainingTokens() ) { + bool tokenParsed = false; + + for( size_t i = 0; i < totalParsers; ++i ) { + auto& parseInfo = parseInfos[i]; + if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { + result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); + if (!result) + return result; + if (result.value().type() != ParseResultType::NoMatch) { + tokenParsed = true; + ++parseInfo.count; + break; + } + } + } + + if( result.value().type() == ParseResultType::ShortCircuitAll ) + return result; + if( !tokenParsed ) + return InternalParseResult::runtimeError( "Unrecognised token: " + result.value().remainingTokens()->token ); + } + // !TBD Check missing required options + return result; + } + }; + + template<typename DerivedT> + template<typename T> + auto ComposableParserImpl<DerivedT>::operator|( T const &other ) const -> Parser { + return Parser() | static_cast<DerivedT const &>( *this ) | other; + } +} // namespace detail + +// A Combined parser +using detail::Parser; + +// A parser for options +using detail::Opt; + +// A parser for arguments +using detail::Arg; + +// Wrapper for argc, argv from main() +using detail::Args; + +// Specifies the name of the executable +using detail::ExeName; + +// Convenience wrapper for option parser that specifies the help option +using detail::Help; + +// enum of result types from a parse +using detail::ParseResultType; + +// Result type for parser operation +using detail::ParserResult; + +}} // namespace Catch::clara + +// end clara.hpp +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// Restore Clara's value for console width, if present +#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +// end catch_clara.h +namespace Catch { + + clara::Parser makeCommandLineParser( ConfigData& config ); + +} // end namespace Catch + +// end catch_commandline.h +#include <fstream> +#include <ctime> + +namespace Catch { + + clara::Parser makeCommandLineParser( ConfigData& config ) { + + using namespace clara; + + auto const setWarning = [&]( std::string const& warning ) { + auto warningSet = [&]() { + if( warning == "NoAssertions" ) + return WarnAbout::NoAssertions; + + if ( warning == "NoTests" ) + return WarnAbout::NoTests; + + return WarnAbout::Nothing; + }(); + + if (warningSet == WarnAbout::Nothing) + return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" ); + config.warnings = static_cast<WarnAbout::What>( config.warnings | warningSet ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const loadTestNamesFromFile = [&]( std::string const& filename ) { + std::ifstream f( filename.c_str() ); + if( !f.is_open() ) + return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" ); + + std::string line; + while( std::getline( f, line ) ) { + line = trim(line); + if( !line.empty() && !startsWith( line, '#' ) ) { + if( !startsWith( line, '"' ) ) + line = '"' + line + '"'; + config.testsOrTags.push_back( line ); + config.testsOrTags.emplace_back( "," ); + } + } + //Remove comma in the end + if(!config.testsOrTags.empty()) + config.testsOrTags.erase( config.testsOrTags.end()-1 ); + + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setTestOrder = [&]( std::string const& order ) { + if( startsWith( "declared", order ) ) + config.runOrder = RunTests::InDeclarationOrder; + else if( startsWith( "lexical", order ) ) + config.runOrder = RunTests::InLexicographicalOrder; + else if( startsWith( "random", order ) ) + config.runOrder = RunTests::InRandomOrder; + else + return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setRngSeed = [&]( std::string const& seed ) { + if( seed != "time" ) + return clara::detail::convertInto( seed, config.rngSeed ); + config.rngSeed = static_cast<unsigned int>( std::time(nullptr) ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setColourUsage = [&]( std::string const& useColour ) { + auto mode = toLower( useColour ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setWaitForKeypress = [&]( std::string const& keypress ) { + auto keypressLc = toLower( keypress ); + if (keypressLc == "never") + config.waitForKeypress = WaitForKeypress::Never; + else if( keypressLc == "start" ) + config.waitForKeypress = WaitForKeypress::BeforeStart; + else if( keypressLc == "exit" ) + config.waitForKeypress = WaitForKeypress::BeforeExit; + else if( keypressLc == "both" ) + config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; + else + return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setVerbosity = [&]( std::string const& verbosity ) { + auto lcVerbosity = toLower( verbosity ); + if( lcVerbosity == "quiet" ) + config.verbosity = Verbosity::Quiet; + else if( lcVerbosity == "normal" ) + config.verbosity = Verbosity::Normal; + else if( lcVerbosity == "high" ) + config.verbosity = Verbosity::High; + else + return ParserResult::runtimeError( "Unrecognised verbosity, '" + verbosity + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setReporter = [&]( std::string const& reporter ) { + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + + auto lcReporter = toLower( reporter ); + auto result = factories.find( lcReporter ); + + if( factories.end() != result ) + config.reporterName = lcReporter; + else + return ParserResult::runtimeError( "Unrecognized reporter, '" + reporter + "'. Check available with --list-reporters" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + + auto cli + = ExeName( config.processName ) + | Help( config.showHelp ) + | Opt( config.listTests ) + ["-l"]["--list-tests"] + ( "list all/matching test cases" ) + | Opt( config.listTags ) + ["-t"]["--list-tags"] + ( "list all/matching tags" ) + | Opt( config.showSuccessfulTests ) + ["-s"]["--success"] + ( "include successful tests in output" ) + | Opt( config.shouldDebugBreak ) + ["-b"]["--break"] + ( "break into debugger on failure" ) + | Opt( config.noThrow ) + ["-e"]["--nothrow"] + ( "skip exception tests" ) + | Opt( config.showInvisibles ) + ["-i"]["--invisibles"] + ( "show invisibles (tabs, newlines)" ) + | Opt( config.outputFilename, "filename" ) + ["-o"]["--out"] + ( "output filename" ) + | Opt( setReporter, "name" ) + ["-r"]["--reporter"] + ( "reporter to use (defaults to console)" ) + | Opt( config.name, "name" ) + ["-n"]["--name"] + ( "suite name" ) + | Opt( [&]( bool ){ config.abortAfter = 1; } ) + ["-a"]["--abort"] + ( "abort at first failure" ) + | Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" ) + ["-x"]["--abortx"] + ( "abort after x failures" ) + | Opt( setWarning, "warning name" ) + ["-w"]["--warn"] + ( "enable warnings" ) + | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) + ["-d"]["--durations"] + ( "show test durations" ) + | Opt( loadTestNamesFromFile, "filename" ) + ["-f"]["--input-file"] + ( "load test names to run from a file" ) + | Opt( config.filenamesAsTags ) + ["-#"]["--filenames-as-tags"] + ( "adds a tag for the filename" ) + | Opt( config.sectionsToRun, "section name" ) + ["-c"]["--section"] + ( "specify section to run" ) + | Opt( setVerbosity, "quiet|normal|high" ) + ["-v"]["--verbosity"] + ( "set output verbosity" ) + | Opt( config.listTestNamesOnly ) + ["--list-test-names-only"] + ( "list all/matching test cases names only" ) + | Opt( config.listReporters ) + ["--list-reporters"] + ( "list all reporters" ) + | Opt( setTestOrder, "decl|lex|rand" ) + ["--order"] + ( "test case order (defaults to decl)" ) + | Opt( setRngSeed, "'time'|number" ) + ["--rng-seed"] + ( "set a specific seed for random numbers" ) + | Opt( setColourUsage, "yes|no" ) + ["--use-colour"] + ( "should output be colourised" ) + | Opt( config.libIdentify ) + ["--libidentify"] + ( "report name and version according to libidentify standard" ) + | Opt( setWaitForKeypress, "never|start|exit|both" ) + ["--wait-for-keypress"] + ( "waits for a keypress before exiting" ) + | Opt( config.benchmarkSamples, "samples" ) + ["--benchmark-samples"] + ( "number of samples to collect (default: 100)" ) + | Opt( config.benchmarkResamples, "resamples" ) + ["--benchmark-resamples"] + ( "number of resamples for the bootstrap (default: 100000)" ) + | Opt( config.benchmarkConfidenceInterval, "confidence interval" ) + ["--benchmark-confidence-interval"] + ( "confidence interval for the bootstrap (between 0 and 1, default: 0.95)" ) + | Opt( config.benchmarkNoAnalysis ) + ["--benchmark-no-analysis"] + ( "perform only measurements; do not perform any analysis" ) + | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" ) + ["--benchmark-warmup-time"] + ( "amount of time in milliseconds spent on warming up each test (default: 100)" ) + | Arg( config.testsOrTags, "test name|pattern|tags" ) + ( "which test or tests to use" ); + + return cli; + } + +} // end namespace Catch +// end catch_commandline.cpp +// start catch_common.cpp + +#include <cstring> +#include <ostream> + +namespace Catch { + + bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept { + return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); + } + bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const noexcept { + // We can assume that the same file will usually have the same pointer. + // Thus, if the pointers are the same, there is no point in calling the strcmp + return line < other.line || ( line == other.line && file != other.file && (std::strcmp(file, other.file) < 0)); + } + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { + // Strip ../ from tests file paths + const char * fileInfo = info.file; + if (strlen(info.file) > 2 && info.file[0] == '.' && info.file[1] == '.') { + fileInfo = fileInfo+3; + } +#ifndef __GNUG__ + os << fileInfo << '(' << info.line << ')'; +#else + os << fileInfo << ':' << info.line; +#endif + return os; + } + + std::string StreamEndStop::operator+() const { + return std::string(); + } + + NonCopyable::NonCopyable() = default; + NonCopyable::~NonCopyable() = default; + +} +// end catch_common.cpp +// start catch_config.cpp + +namespace Catch { + + Config::Config( ConfigData const& data ) + : m_data( data ), + m_stream( openStream() ) + { + // We need to trim filter specs to avoid trouble with superfluous + // whitespace (esp. important for bdd macros, as those are manually + // aligned with whitespace). + + for (auto& elem : m_data.testsOrTags) { + elem = trim(elem); + } + for (auto& elem : m_data.sectionsToRun) { + elem = trim(elem); + } + + TestSpecParser parser(ITagAliasRegistry::get()); + if (!m_data.testsOrTags.empty()) { + m_hasTestFilters = true; + for (auto const& testOrTags : m_data.testsOrTags) { + parser.parse(testOrTags); + } + } + m_testSpec = parser.testSpec(); + } + + std::string const& Config::getFilename() const { + return m_data.outputFilename ; + } + + bool Config::listTests() const { return m_data.listTests; } + bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; } + bool Config::listTags() const { return m_data.listTags; } + bool Config::listReporters() const { return m_data.listReporters; } + + std::string Config::getProcessName() const { return m_data.processName; } + std::string const& Config::getReporterName() const { return m_data.reporterName; } + + std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; } + std::vector<std::string> const& Config::getSectionsToRun() const { return m_data.sectionsToRun; } + + TestSpec const& Config::testSpec() const { return m_testSpec; } + bool Config::hasTestFilters() const { return m_hasTestFilters; } + + bool Config::showHelp() const { return m_data.showHelp; } + + // IConfig interface + bool Config::allowThrows() const { return !m_data.noThrow; } + std::ostream& Config::stream() const { return m_stream->stream(); } + std::string Config::name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } + bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; } + bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); } + bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); } + ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; } + RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; } + unsigned int Config::rngSeed() const { return m_data.rngSeed; } + UseColour::YesOrNo Config::useColour() const { return m_data.useColour; } + bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; } + int Config::abortAfter() const { return m_data.abortAfter; } + bool Config::showInvisibles() const { return m_data.showInvisibles; } + Verbosity Config::verbosity() const { return m_data.verbosity; } + + bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; } + int Config::benchmarkSamples() const { return m_data.benchmarkSamples; } + double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; } + unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; } + std::chrono::milliseconds Config::benchmarkWarmupTime() const { return std::chrono::milliseconds(m_data.benchmarkWarmupTime); } + + IStream const* Config::openStream() { + return Catch::makeStream(m_data.outputFilename); + } + +} // end namespace Catch +// end catch_config.cpp +// start catch_console_colour.cpp + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wexit-time-destructors" +#endif + +// start catch_errno_guard.h + +namespace Catch { + + class ErrnoGuard { + public: + ErrnoGuard(); + ~ErrnoGuard(); + private: + int m_oldErrno; + }; + +} + +// end catch_errno_guard.h +#include <sstream> + +namespace Catch { + namespace { + + struct IColourImpl { + virtual ~IColourImpl() = default; + virtual void use( Colour::Code _colourCode ) = 0; + }; + + struct NoColourImpl : IColourImpl { + void use( Colour::Code ) override {} + + static IColourImpl* instance() { + static NoColourImpl s_instance; + return &s_instance; + } + }; + + } // anon namespace +} // namespace Catch + +#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) +# ifdef CATCH_PLATFORM_WINDOWS +# define CATCH_CONFIG_COLOUR_WINDOWS +# else +# define CATCH_CONFIG_COLOUR_ANSI +# endif +#endif + +#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// + +namespace Catch { +namespace { + + class Win32ColourImpl : public IColourImpl { + public: + Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) + { + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); + originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); + originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); + } + + void use( Colour::Code _colourCode ) override { + switch( _colourCode ) { + case Colour::None: return setTextAttribute( originalForegroundAttributes ); + case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::Red: return setTextAttribute( FOREGROUND_RED ); + case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); + case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); + case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); + case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); + case Colour::Grey: return setTextAttribute( 0 ); + + case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); + case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); + case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); + case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::BrightYellow: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN ); + + case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); + + default: + CATCH_ERROR( "Unknown colour requested" ); + } + } + + private: + void setTextAttribute( WORD _textAttribute ) { + SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); + } + HANDLE stdoutHandle; + WORD originalForegroundAttributes; + WORD originalBackgroundAttributes; + }; + + IColourImpl* platformColourInstance() { + static Win32ColourImpl s_instance; + + IConfigPtr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = UseColour::Yes; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// + +#include <unistd.h> + +namespace Catch { +namespace { + + // use POSIX/ ANSI console terminal codes + // Thanks to Adam Strzelecki for original contribution + // (http://github.com/nanoant) + // https://github.com/philsquared/Catch/pull/131 + class PosixColourImpl : public IColourImpl { + public: + void use( Colour::Code _colourCode ) override { + switch( _colourCode ) { + case Colour::None: + case Colour::White: return setColour( "[0m" ); + case Colour::Red: return setColour( "[0;31m" ); + case Colour::Green: return setColour( "[0;32m" ); + case Colour::Blue: return setColour( "[0;34m" ); + case Colour::Cyan: return setColour( "[0;36m" ); + case Colour::Yellow: return setColour( "[0;33m" ); + case Colour::Grey: return setColour( "[1;30m" ); + + case Colour::LightGrey: return setColour( "[0;37m" ); + case Colour::BrightRed: return setColour( "[1;31m" ); + case Colour::BrightGreen: return setColour( "[1;32m" ); + case Colour::BrightWhite: return setColour( "[1;37m" ); + case Colour::BrightYellow: return setColour( "[1;33m" ); + + case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); + default: CATCH_INTERNAL_ERROR( "Unknown colour requested" ); + } + } + static IColourImpl* instance() { + static PosixColourImpl s_instance; + return &s_instance; + } + + private: + void setColour( const char* _escapeCode ) { + getCurrentContext().getConfig()->stream() + << '\033' << _escapeCode; + } + }; + + bool useColourOnPlatform() { + return +#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) + !isDebuggerActive() && +#endif +#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__)) + isatty(STDOUT_FILENO) +#else + false +#endif + ; + } + IColourImpl* platformColourInstance() { + ErrnoGuard guard; + IConfigPtr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = useColourOnPlatform() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? PosixColourImpl::instance() + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#else // not Windows or ANSI /////////////////////////////////////////////// + +namespace Catch { + + static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } + +} // end namespace Catch + +#endif // Windows/ ANSI/ None + +namespace Catch { + + Colour::Colour( Code _colourCode ) { use( _colourCode ); } + Colour::Colour( Colour&& other ) noexcept { + m_moved = other.m_moved; + other.m_moved = true; + } + Colour& Colour::operator=( Colour&& other ) noexcept { + m_moved = other.m_moved; + other.m_moved = true; + return *this; + } + + Colour::~Colour(){ if( !m_moved ) use( None ); } + + void Colour::use( Code _colourCode ) { + static IColourImpl* impl = platformColourInstance(); + // Strictly speaking, this cannot possibly happen. + // However, under some conditions it does happen (see #1626), + // and this change is small enough that we can let practicality + // triumph over purity in this case. + if (impl != nullptr) { + impl->use( _colourCode ); + } + } + + std::ostream& operator << ( std::ostream& os, Colour const& ) { + return os; + } + +} // end namespace Catch + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +// end catch_console_colour.cpp +// start catch_context.cpp + +namespace Catch { + + class Context : public IMutableContext, NonCopyable { + + public: // IContext + IResultCapture* getResultCapture() override { + return m_resultCapture; + } + IRunner* getRunner() override { + return m_runner; + } + + IConfigPtr const& getConfig() const override { + return m_config; + } + + ~Context() override; + + public: // IMutableContext + void setResultCapture( IResultCapture* resultCapture ) override { + m_resultCapture = resultCapture; + } + void setRunner( IRunner* runner ) override { + m_runner = runner; + } + void setConfig( IConfigPtr const& config ) override { + m_config = config; + } + + friend IMutableContext& getCurrentMutableContext(); + + private: + IConfigPtr m_config; + IRunner* m_runner = nullptr; + IResultCapture* m_resultCapture = nullptr; + }; + + IMutableContext *IMutableContext::currentContext = nullptr; + + void IMutableContext::createContext() + { + currentContext = new Context(); + } + + void cleanUpContext() { + delete IMutableContext::currentContext; + IMutableContext::currentContext = nullptr; + } + IContext::~IContext() = default; + IMutableContext::~IMutableContext() = default; + Context::~Context() = default; + + SimplePcg32& rng() { + static SimplePcg32 s_rng; + return s_rng; + } + +} +// end catch_context.cpp +// start catch_debug_console.cpp + +// start catch_debug_console.h + +#include <string> + +namespace Catch { + void writeToDebugConsole( std::string const& text ); +} + +// end catch_debug_console.h +#if defined(CATCH_CONFIG_ANDROID_LOGWRITE) +#include <android/log.h> + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + __android_log_write( ANDROID_LOG_DEBUG, "Catch", text.c_str() ); + } + } + +#elif defined(CATCH_PLATFORM_WINDOWS) + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + ::OutputDebugStringA( text.c_str() ); + } + } + +#else + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + // !TBD: Need a version for Mac/ XCode and other IDEs + Catch::cout() << text; + } + } + +#endif // Platform +// end catch_debug_console.cpp +// start catch_debugger.cpp + +#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) + +# include <cassert> +# include <sys/types.h> +# include <unistd.h> +# include <cstddef> +# include <ostream> + +#ifdef __apple_build_version__ + // These headers will only compile with AppleClang (XCode) + // For other compilers (Clang, GCC, ... ) we need to exclude them +# include <sys/sysctl.h> +#endif + + namespace Catch { + #ifdef __apple_build_version__ + // The following function is taken directly from the following technical note: + // https://developer.apple.com/library/archive/qa/qa1361/_index.html + + // Returns true if the current process is being debugged (either + // running under the debugger or has a debugger attached post facto). + bool isDebuggerActive(){ + int mib[4]; + struct kinfo_proc info; + std::size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) { + Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } + + // We're being debugged if the P_TRACED flag is set. + + return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); + } + #else + bool isDebuggerActive() { + // We need to find another way to determine this for non-appleclang compilers on macOS + return false; + } + #endif + } // namespace Catch + +#elif defined(CATCH_PLATFORM_LINUX) + #include <fstream> + #include <string> + + namespace Catch{ + // The standard POSIX way of detecting a debugger is to attempt to + // ptrace() the process, but this needs to be done from a child and not + // this process itself to still allow attaching to this process later + // if wanted, so is rather heavy. Under Linux we have the PID of the + // "debugger" (which doesn't need to be gdb, of course, it could also + // be strace, for example) in /proc/$PID/status, so just get it from + // there instead. + bool isDebuggerActive(){ + // Libstdc++ has a bug, where std::ifstream sets errno to 0 + // This way our users can properly assert over errno values + ErrnoGuard guard; + std::ifstream in("/proc/self/status"); + for( std::string line; std::getline(in, line); ) { + static const int PREFIX_LEN = 11; + if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { + // We're traced if the PID is not 0 and no other PID starts + // with 0 digit, so it's enough to check for just a single + // character. + return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; + } + } + + return false; + } + } // namespace Catch +#elif defined(_MSC_VER) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#else + namespace Catch { + bool isDebuggerActive() { return false; } + } +#endif // Platform +// end catch_debugger.cpp +// start catch_decomposer.cpp + +namespace Catch { + + ITransientExpression::~ITransientExpression() = default; + + void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) { + if( lhs.size() + rhs.size() < 40 && + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ) + os << lhs << " " << op << " " << rhs; + else + os << lhs << "\n" << op << "\n" << rhs; + } +} +// end catch_decomposer.cpp +// start catch_enforce.cpp + +#include <stdexcept> + +namespace Catch { +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) + [[noreturn]] + void throw_exception(std::exception const& e) { + Catch::cerr() << "Catch will terminate because it needed to throw an exception.\n" + << "The message was: " << e.what() << '\n'; + std::terminate(); + } +#endif + + [[noreturn]] + void throw_logic_error(std::string const& msg) { + throw_exception(std::logic_error(msg)); + } + + [[noreturn]] + void throw_domain_error(std::string const& msg) { + throw_exception(std::domain_error(msg)); + } + + [[noreturn]] + void throw_runtime_error(std::string const& msg) { + throw_exception(std::runtime_error(msg)); + } + +} // namespace Catch; +// end catch_enforce.cpp +// start catch_enum_values_registry.cpp +// start catch_enum_values_registry.h + +#include <vector> +#include <memory> + +namespace Catch { + + namespace Detail { + + std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ); + + class EnumValuesRegistry : public IMutableEnumValuesRegistry { + + std::vector<std::unique_ptr<EnumInfo>> m_enumInfos; + + EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override; + }; + + std::vector<StringRef> parseEnums( StringRef enums ); + + } // Detail + +} // Catch + +// end catch_enum_values_registry.h + +#include <map> +#include <cassert> + +namespace Catch { + + IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {} + + namespace Detail { + + namespace { + // Extracts the actual name part of an enum instance + // In other words, it returns the Blue part of Bikeshed::Colour::Blue + StringRef extractInstanceName(StringRef enumInstance) { + // Find last occurence of ":" + size_t name_start = enumInstance.size(); + while (name_start > 0 && enumInstance[name_start - 1] != ':') { + --name_start; + } + return enumInstance.substr(name_start, enumInstance.size() - name_start); + } + } + + std::vector<StringRef> parseEnums( StringRef enums ) { + auto enumValues = splitStringRef( enums, ',' ); + std::vector<StringRef> parsed; + parsed.reserve( enumValues.size() ); + for( auto const& enumValue : enumValues ) { + parsed.push_back(trim(extractInstanceName(enumValue))); + } + return parsed; + } + + EnumInfo::~EnumInfo() {} + + StringRef EnumInfo::lookup( int value ) const { + for( auto const& valueToName : m_values ) { + if( valueToName.first == value ) + return valueToName.second; + } + return "{** unexpected enum value **}"_sr; + } + + std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { + std::unique_ptr<EnumInfo> enumInfo( new EnumInfo ); + enumInfo->m_name = enumName; + enumInfo->m_values.reserve( values.size() ); + + const auto valueNames = Catch::Detail::parseEnums( allValueNames ); + assert( valueNames.size() == values.size() ); + std::size_t i = 0; + for( auto value : values ) + enumInfo->m_values.emplace_back(value, valueNames[i++]); + + return enumInfo; + } + + EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { + m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values)); + return *m_enumInfos.back(); + } + + } // Detail +} // Catch + +// end catch_enum_values_registry.cpp +// start catch_errno_guard.cpp + +#include <cerrno> + +namespace Catch { + ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} + ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } +} +// end catch_errno_guard.cpp +// start catch_exception_translator_registry.cpp + +// start catch_exception_translator_registry.h + +#include <vector> +#include <string> +#include <memory> + +namespace Catch { + + class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { + public: + ~ExceptionTranslatorRegistry(); + virtual void registerTranslator( const IExceptionTranslator* translator ); + std::string translateActiveException() const override; + std::string tryTranslators() const; + + private: + std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators; + }; +} + +// end catch_exception_translator_registry.h +#ifdef __OBJC__ +#import "Foundation/Foundation.h" +#endif + +namespace Catch { + + ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() { + } + + void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator* translator ) { + m_translators.push_back( std::unique_ptr<const IExceptionTranslator>( translator ) ); + } + +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + std::string ExceptionTranslatorRegistry::translateActiveException() const { + try { +#ifdef __OBJC__ + // In Objective-C try objective-c exceptions first + @try { + return tryTranslators(); + } + @catch (NSException *exception) { + return Catch::Detail::stringify( [exception description] ); + } +#else + // Compiling a mixed mode project with MSVC means that CLR + // exceptions will be caught in (...) as well. However, these + // do not fill-in std::current_exception and thus lead to crash + // when attempting rethrow. + // /EHa switch also causes structured exceptions to be caught + // here, but they fill-in current_exception properly, so + // at worst the output should be a little weird, instead of + // causing a crash. + if (std::current_exception() == nullptr) { + return "Non C++ exception. Possibly a CLR exception."; + } + return tryTranslators(); +#endif + } + catch( TestFailureException& ) { + std::rethrow_exception(std::current_exception()); + } + catch( std::exception& ex ) { + return ex.what(); + } + catch( std::string& msg ) { + return msg; + } + catch( const char* msg ) { + return msg; + } + catch(...) { + return "Unknown exception"; + } + } + + std::string ExceptionTranslatorRegistry::tryTranslators() const { + if (m_translators.empty()) { + std::rethrow_exception(std::current_exception()); + } else { + return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end()); + } + } + +#else // ^^ Exceptions are enabled // Exceptions are disabled vv + std::string ExceptionTranslatorRegistry::translateActiveException() const { + CATCH_INTERNAL_ERROR("Attempted to translate active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); + } + + std::string ExceptionTranslatorRegistry::tryTranslators() const { + CATCH_INTERNAL_ERROR("Attempted to use exception translators under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); + } +#endif + +} +// end catch_exception_translator_registry.cpp +// start catch_fatal_condition.cpp + +#if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + +#if defined( CATCH_CONFIG_WINDOWS_SEH ) || defined( CATCH_CONFIG_POSIX_SIGNALS ) + +namespace { + // Report the error condition + void reportFatal( char const * const message ) { + Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message ); + } +} + +#endif // signals/SEH handling + +#if defined( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + struct SignalDefs { DWORD id; const char* name; }; + + // There is no 1-1 mapping between signals and windows exceptions. + // Windows can easily distinguish between SO and SigSegV, + // but SigInt, SigTerm, etc are handled differently. + static SignalDefs signalDefs[] = { + { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION), "SIGILL - Illegal instruction signal" }, + { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow" }, + { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal" }, + { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error" }, + }; + + LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { + for (auto const& def : signalDefs) { + if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) { + reportFatal(def.name); + } + } + // If its not an exception we care about, pass it along. + // This stops us from eating debugger breaks etc. + return EXCEPTION_CONTINUE_SEARCH; + } + + FatalConditionHandler::FatalConditionHandler() { + isSet = true; + // 32k seems enough for Catch to handle stack overflow, + // but the value was found experimentally, so there is no strong guarantee + guaranteeSize = 32 * 1024; + exceptionHandlerHandle = nullptr; + // Register as first handler in current chain + exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); + // Pass in guarantee size to be filled + SetThreadStackGuarantee(&guaranteeSize); + } + + void FatalConditionHandler::reset() { + if (isSet) { + RemoveVectoredExceptionHandler(exceptionHandlerHandle); + SetThreadStackGuarantee(&guaranteeSize); + exceptionHandlerHandle = nullptr; + isSet = false; + } + } + + FatalConditionHandler::~FatalConditionHandler() { + reset(); + } + +bool FatalConditionHandler::isSet = false; +ULONG FatalConditionHandler::guaranteeSize = 0; +PVOID FatalConditionHandler::exceptionHandlerHandle = nullptr; + +} // namespace Catch + +#elif defined( CATCH_CONFIG_POSIX_SIGNALS ) + +namespace Catch { + + struct SignalDefs { + int id; + const char* name; + }; + + // 32kb for the alternate stack seems to be sufficient. However, this value + // is experimentally determined, so that's not guaranteed. + static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ; + + static SignalDefs signalDefs[] = { + { SIGINT, "SIGINT - Terminal interrupt signal" }, + { SIGILL, "SIGILL - Illegal instruction signal" }, + { SIGFPE, "SIGFPE - Floating point error signal" }, + { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, + { SIGTERM, "SIGTERM - Termination request signal" }, + { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } + }; + + void FatalConditionHandler::handleSignal( int sig ) { + char const * name = "<unknown signal>"; + for (auto const& def : signalDefs) { + if (sig == def.id) { + name = def.name; + break; + } + } + reset(); + reportFatal(name); + raise( sig ); + } + + FatalConditionHandler::FatalConditionHandler() { + isSet = true; + stack_t sigStack; + sigStack.ss_sp = altStackMem; + sigStack.ss_size = sigStackSize; + sigStack.ss_flags = 0; + sigaltstack(&sigStack, &oldSigStack); + struct sigaction sa = { }; + + sa.sa_handler = handleSignal; + sa.sa_flags = SA_ONSTACK; + for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { + sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); + } + } + + FatalConditionHandler::~FatalConditionHandler() { + reset(); + } + + void FatalConditionHandler::reset() { + if( isSet ) { + // Set signals back to previous values -- hopefully nobody overwrote them in the meantime + for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { + sigaction(signalDefs[i].id, &oldSigActions[i], nullptr); + } + // Return the old stack + sigaltstack(&oldSigStack, nullptr); + isSet = false; + } + } + + bool FatalConditionHandler::isSet = false; + struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; + stack_t FatalConditionHandler::oldSigStack = {}; + char FatalConditionHandler::altStackMem[sigStackSize] = {}; + +} // namespace Catch + +#else + +namespace Catch { + void FatalConditionHandler::reset() {} +} + +#endif // signals/SEH handling + +#if defined(__GNUC__) +# pragma GCC diagnostic pop +#endif +// end catch_fatal_condition.cpp +// start catch_generators.cpp + +#include <limits> +#include <set> + +namespace Catch { + +IGeneratorTracker::~IGeneratorTracker() {} + +const char* GeneratorException::what() const noexcept { + return m_msg; +} + +namespace Generators { + + GeneratorUntypedBase::~GeneratorUntypedBase() {} + + auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + return getResultCapture().acquireGeneratorTracker( lineInfo ); + } + +} // namespace Generators +} // namespace Catch +// end catch_generators.cpp +// start catch_interfaces_capture.cpp + +namespace Catch { + IResultCapture::~IResultCapture() = default; +} +// end catch_interfaces_capture.cpp +// start catch_interfaces_config.cpp + +namespace Catch { + IConfig::~IConfig() = default; +} +// end catch_interfaces_config.cpp +// start catch_interfaces_exception.cpp + +namespace Catch { + IExceptionTranslator::~IExceptionTranslator() = default; + IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default; +} +// end catch_interfaces_exception.cpp +// start catch_interfaces_registry_hub.cpp + +namespace Catch { + IRegistryHub::~IRegistryHub() = default; + IMutableRegistryHub::~IMutableRegistryHub() = default; +} +// end catch_interfaces_registry_hub.cpp +// start catch_interfaces_reporter.cpp + +// start catch_reporter_listening.h + +namespace Catch { + + class ListeningReporter : public IStreamingReporter { + using Reporters = std::vector<IStreamingReporterPtr>; + Reporters m_listeners; + IStreamingReporterPtr m_reporter = nullptr; + ReporterPreferences m_preferences; + + public: + ListeningReporter(); + + void addListener( IStreamingReporterPtr&& listener ); + void addReporter( IStreamingReporterPtr&& reporter ); + + public: // IStreamingReporter + + ReporterPreferences getPreferences() const override; + + void noMatchingTestCases( std::string const& spec ) override; + + void reportInvalidArguments(std::string const&arg) override; + + static std::set<Verbosity> getSupportedVerbosities(); + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override; + void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override; + void benchmarkFailed(std::string const&) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void testRunStarting( TestRunInfo const& testRunInfo ) override; + void testGroupStarting( GroupInfo const& groupInfo ) override; + void testCaseStarting( TestCaseInfo const& testInfo ) override; + void sectionStarting( SectionInfo const& sectionInfo ) override; + void assertionStarting( AssertionInfo const& assertionInfo ) override; + + // The return value indicates if the messages buffer should be cleared: + bool assertionEnded( AssertionStats const& assertionStats ) override; + void sectionEnded( SectionStats const& sectionStats ) override; + void testCaseEnded( TestCaseStats const& testCaseStats ) override; + void testGroupEnded( TestGroupStats const& testGroupStats ) override; + void testRunEnded( TestRunStats const& testRunStats ) override; + + void skipTest( TestCaseInfo const& testInfo ) override; + bool isMulti() const override; + + }; + +} // end namespace Catch + +// end catch_reporter_listening.h +namespace Catch { + + ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig ) + : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} + + ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ) + : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} + + std::ostream& ReporterConfig::stream() const { return *m_stream; } + IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; } + + TestRunInfo::TestRunInfo( std::string const& _name ) : name( _name ) {} + + GroupInfo::GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ) + : name( _name ), + groupIndex( _groupIndex ), + groupsCounts( _groupsCount ) + {} + + AssertionStats::AssertionStats( AssertionResult const& _assertionResult, + std::vector<MessageInfo> const& _infoMessages, + Totals const& _totals ) + : assertionResult( _assertionResult ), + infoMessages( _infoMessages ), + totals( _totals ) + { + assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression; + + if( assertionResult.hasMessage() ) { + // Copy message into messages list. + // !TBD This should have been done earlier, somewhere + MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); + builder << assertionResult.getMessage(); + builder.m_info.message = builder.m_stream.str(); + + infoMessages.push_back( builder.m_info ); + } + } + + AssertionStats::~AssertionStats() = default; + + SectionStats::SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ) + : sectionInfo( _sectionInfo ), + assertions( _assertions ), + durationInSeconds( _durationInSeconds ), + missingAssertions( _missingAssertions ) + {} + + SectionStats::~SectionStats() = default; + + TestCaseStats::TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ) + : testInfo( _testInfo ), + totals( _totals ), + stdOut( _stdOut ), + stdErr( _stdErr ), + aborting( _aborting ) + {} + + TestCaseStats::~TestCaseStats() = default; + + TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ) + : groupInfo( _groupInfo ), + totals( _totals ), + aborting( _aborting ) + {} + + TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo ) + : groupInfo( _groupInfo ), + aborting( false ) + {} + + TestGroupStats::~TestGroupStats() = default; + + TestRunStats::TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ) + : runInfo( _runInfo ), + totals( _totals ), + aborting( _aborting ) + {} + + TestRunStats::~TestRunStats() = default; + + void IStreamingReporter::fatalErrorEncountered( StringRef ) {} + bool IStreamingReporter::isMulti() const { return false; } + + IReporterFactory::~IReporterFactory() = default; + IReporterRegistry::~IReporterRegistry() = default; + +} // end namespace Catch +// end catch_interfaces_reporter.cpp +// start catch_interfaces_runner.cpp + +namespace Catch { + IRunner::~IRunner() = default; +} +// end catch_interfaces_runner.cpp +// start catch_interfaces_testcase.cpp + +namespace Catch { + ITestInvoker::~ITestInvoker() = default; + ITestCaseRegistry::~ITestCaseRegistry() = default; +} +// end catch_interfaces_testcase.cpp +// start catch_leak_detector.cpp + +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include <crtdbg.h> + +namespace Catch { + + LeakDetector::LeakDetector() { + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); + } +} + +#else + + Catch::LeakDetector::LeakDetector() {} + +#endif + +Catch::LeakDetector::~LeakDetector() { + Catch::cleanUp(); +} +// end catch_leak_detector.cpp +// start catch_list.cpp + +// start catch_list.h + +#include <set> + +namespace Catch { + + std::size_t listTests( Config const& config ); + + std::size_t listTestsNamesOnly( Config const& config ); + + struct TagInfo { + void add( std::string const& spelling ); + std::string all() const; + + std::set<std::string> spellings; + std::size_t count = 0; + }; + + std::size_t listTags( Config const& config ); + + std::size_t listReporters(); + + Option<std::size_t> list( std::shared_ptr<Config> const& config ); + +} // end namespace Catch + +// end catch_list.h +// start catch_text.h + +namespace Catch { + using namespace clara::TextFlow; +} + +// end catch_text.h +#include <limits> +#include <algorithm> +#include <iomanip> + +namespace Catch { + + std::size_t listTests( Config const& config ) { + TestSpec const& testSpec = config.testSpec(); + if( config.hasTestFilters() ) + Catch::cout() << "Matching test cases:\n"; + else { + Catch::cout() << "All available test cases:\n"; + } + + auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( auto const& testCaseInfo : matchedTestCases ) { + Colour::Code colour = testCaseInfo.isHidden() + ? Colour::SecondaryText + : Colour::None; + Colour colourGuard( colour ); + + Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << "\n"; + if( config.verbosity() >= Verbosity::High ) { + Catch::cout() << Column( Catch::Detail::stringify( testCaseInfo.lineInfo ) ).indent(4) << std::endl; + std::string description = testCaseInfo.description; + if( description.empty() ) + description = "(NO DESCRIPTION)"; + Catch::cout() << Column( description ).indent(4) << std::endl; + } + if( !testCaseInfo.tags.empty() ) + Catch::cout() << Column( testCaseInfo.tagsAsString() ).indent( 6 ) << "\n"; + } + + if( !config.hasTestFilters() ) + Catch::cout() << pluralise( matchedTestCases.size(), "test case" ) << '\n' << std::endl; + else + Catch::cout() << pluralise( matchedTestCases.size(), "matching test case" ) << '\n' << std::endl; + return matchedTestCases.size(); + } + + std::size_t listTestsNamesOnly( Config const& config ) { + TestSpec const& testSpec = config.testSpec(); + std::size_t matchedTests = 0; + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( auto const& testCaseInfo : matchedTestCases ) { + matchedTests++; + if( startsWith( testCaseInfo.name, '#' ) ) + Catch::cout() << '"' << testCaseInfo.name << '"'; + else + Catch::cout() << testCaseInfo.name; + if ( config.verbosity() >= Verbosity::High ) + Catch::cout() << "\t@" << testCaseInfo.lineInfo; + Catch::cout() << std::endl; + } + return matchedTests; + } + + void TagInfo::add( std::string const& spelling ) { + ++count; + spellings.insert( spelling ); + } + + std::string TagInfo::all() const { + size_t size = 0; + for (auto const& spelling : spellings) { + // Add 2 for the brackes + size += spelling.size() + 2; + } + + std::string out; out.reserve(size); + for (auto const& spelling : spellings) { + out += '['; + out += spelling; + out += ']'; + } + return out; + } + + std::size_t listTags( Config const& config ) { + TestSpec const& testSpec = config.testSpec(); + if( config.hasTestFilters() ) + Catch::cout() << "Tags for matching test cases:\n"; + else { + Catch::cout() << "All available tags:\n"; + } + + std::map<std::string, TagInfo> tagCounts; + + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( auto const& testCase : matchedTestCases ) { + for( auto const& tagName : testCase.getTestCaseInfo().tags ) { + std::string lcaseTagName = toLower( tagName ); + auto countIt = tagCounts.find( lcaseTagName ); + if( countIt == tagCounts.end() ) + countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; + countIt->second.add( tagName ); + } + } + + for( auto const& tagCount : tagCounts ) { + ReusableStringStream rss; + rss << " " << std::setw(2) << tagCount.second.count << " "; + auto str = rss.str(); + auto wrapper = Column( tagCount.second.all() ) + .initialIndent( 0 ) + .indent( str.size() ) + .width( CATCH_CONFIG_CONSOLE_WIDTH-10 ); + Catch::cout() << str << wrapper << '\n'; + } + Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; + return tagCounts.size(); + } + + std::size_t listReporters() { + Catch::cout() << "Available reporters:\n"; + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + std::size_t maxNameLen = 0; + for( auto const& factoryKvp : factories ) + maxNameLen = (std::max)( maxNameLen, factoryKvp.first.size() ); + + for( auto const& factoryKvp : factories ) { + Catch::cout() + << Column( factoryKvp.first + ":" ) + .indent(2) + .width( 5+maxNameLen ) + + Column( factoryKvp.second->getDescription() ) + .initialIndent(0) + .indent(2) + .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) + << "\n"; + } + Catch::cout() << std::endl; + return factories.size(); + } + + Option<std::size_t> list( std::shared_ptr<Config> const& config ) { + Option<std::size_t> listedCount; + getCurrentMutableContext().setConfig( config ); + if( config->listTests() ) + listedCount = listedCount.valueOr(0) + listTests( *config ); + if( config->listTestNamesOnly() ) + listedCount = listedCount.valueOr(0) + listTestsNamesOnly( *config ); + if( config->listTags() ) + listedCount = listedCount.valueOr(0) + listTags( *config ); + if( config->listReporters() ) + listedCount = listedCount.valueOr(0) + listReporters(); + return listedCount; + } + +} // end namespace Catch +// end catch_list.cpp +// start catch_matchers.cpp + +namespace Catch { +namespace Matchers { + namespace Impl { + + std::string MatcherUntypedBase::toString() const { + if( m_cachedToString.empty() ) + m_cachedToString = describe(); + return m_cachedToString; + } + + MatcherUntypedBase::~MatcherUntypedBase() = default; + + } // namespace Impl +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch +// end catch_matchers.cpp +// start catch_matchers_exception.cpp + +namespace Catch { +namespace Matchers { +namespace Exception { + +bool ExceptionMessageMatcher::match(std::exception const& ex) const { + return ex.what() == m_message; +} + +std::string ExceptionMessageMatcher::describe() const { + return "exception message matches \"" + m_message + "\""; +} + +} +Exception::ExceptionMessageMatcher Message(std::string const& message) { + return Exception::ExceptionMessageMatcher(message); +} + +// namespace Exception +} // namespace Matchers +} // namespace Catch +// end catch_matchers_exception.cpp +// start catch_matchers_floating.cpp + +// start catch_polyfills.hpp + +namespace Catch { + bool isnan(float f); + bool isnan(double d); +} + +// end catch_polyfills.hpp +// start catch_to_string.hpp + +#include <string> + +namespace Catch { + template <typename T> + std::string to_string(T const& t) { +#if defined(CATCH_CONFIG_CPP11_TO_STRING) + return std::to_string(t); +#else + ReusableStringStream rss; + rss << t; + return rss.str(); +#endif + } +} // end namespace Catch + +// end catch_to_string.hpp +#include <algorithm> +#include <cmath> +#include <cstdlib> +#include <cstdint> +#include <cstring> +#include <sstream> +#include <type_traits> +#include <iomanip> +#include <limits> + +namespace Catch { +namespace { + + int32_t convert(float f) { + static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); + int32_t i; + std::memcpy(&i, &f, sizeof(f)); + return i; + } + + int64_t convert(double d) { + static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); + int64_t i; + std::memcpy(&i, &d, sizeof(d)); + return i; + } + + template <typename FP> + bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) { + // Comparison with NaN should always be false. + // This way we can rule it out before getting into the ugly details + if (Catch::isnan(lhs) || Catch::isnan(rhs)) { + return false; + } + + auto lc = convert(lhs); + auto rc = convert(rhs); + + if ((lc < 0) != (rc < 0)) { + // Potentially we can have +0 and -0 + return lhs == rhs; + } + + auto ulpDiff = std::abs(lc - rc); + return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff; + } + +#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) + + float nextafter(float x, float y) { + return ::nextafterf(x, y); + } + + double nextafter(double x, double y) { + return ::nextafter(x, y); + } + +#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^ + +template <typename FP> +FP step(FP start, FP direction, uint64_t steps) { + for (uint64_t i = 0; i < steps; ++i) { +#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) + start = Catch::nextafter(start, direction); +#else + start = std::nextafter(start, direction); +#endif + } + return start; +} + +// Performs equivalent check of std::fabs(lhs - rhs) <= margin +// But without the subtraction to allow for INFINITY in comparison +bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); +} + +template <typename FloatingPoint> +void write(std::ostream& out, FloatingPoint num) { + out << std::scientific + << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1) + << num; +} + +} // end anonymous namespace + +namespace Matchers { +namespace Floating { + + enum class FloatingPointKind : uint8_t { + Float, + Double + }; + + WithinAbsMatcher::WithinAbsMatcher(double target, double margin) + :m_target{ target }, m_margin{ margin } { + CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.' + << " Margin has to be non-negative."); + } + + // Performs equivalent check of std::fabs(lhs - rhs) <= margin + // But without the subtraction to allow for INFINITY in comparison + bool WithinAbsMatcher::match(double const& matchee) const { + return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee); + } + + std::string WithinAbsMatcher::describe() const { + return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target); + } + + WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType) + :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { + CATCH_ENFORCE(m_type == FloatingPointKind::Double + || m_ulps < (std::numeric_limits<uint32_t>::max)(), + "Provided ULP is impossibly large for a float comparison."); + } + +#if defined(__clang__) +#pragma clang diagnostic push +// Clang <3.5 reports on the default branch in the switch below +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + + bool WithinUlpsMatcher::match(double const& matchee) const { + switch (m_type) { + case FloatingPointKind::Float: + return almostEqualUlps<float>(static_cast<float>(matchee), static_cast<float>(m_target), m_ulps); + case FloatingPointKind::Double: + return almostEqualUlps<double>(matchee, m_target, m_ulps); + default: + CATCH_INTERNAL_ERROR( "Unknown FloatingPointKind value" ); + } + } + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + + std::string WithinUlpsMatcher::describe() const { + std::stringstream ret; + + ret << "is within " << m_ulps << " ULPs of "; + + if (m_type == FloatingPointKind::Float) { + write(ret, static_cast<float>(m_target)); + ret << 'f'; + } else { + write(ret, m_target); + } + + ret << " (["; + if (m_type == FloatingPointKind::Double) { + write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(m_target, static_cast<double>( INFINITY), m_ulps)); + } else { + // We have to cast INFINITY to float because of MinGW, see #1782 + write(ret, step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(static_cast<float>(m_target), static_cast<float>( INFINITY), m_ulps)); + } + ret << "])"; + + return ret.str(); + } + + WithinRelMatcher::WithinRelMatcher(double target, double epsilon): + m_target(target), + m_epsilon(epsilon){ + CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense."); + CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense."); + } + + bool WithinRelMatcher::match(double const& matchee) const { + const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target)); + return marginComparison(matchee, m_target, + std::isinf(relMargin)? 0 : relMargin); + } + + std::string WithinRelMatcher::describe() const { + Catch::ReusableStringStream sstr; + sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other"; + return sstr.str(); + } + +}// namespace Floating + +Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) { + return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double); +} + +Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) { + return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float); +} + +Floating::WithinAbsMatcher WithinAbs(double target, double margin) { + return Floating::WithinAbsMatcher(target, margin); +} + +Floating::WithinRelMatcher WithinRel(double target, double eps) { + return Floating::WithinRelMatcher(target, eps); +} + +Floating::WithinRelMatcher WithinRel(double target) { + return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100); +} + +Floating::WithinRelMatcher WithinRel(float target, float eps) { + return Floating::WithinRelMatcher(target, eps); +} + +Floating::WithinRelMatcher WithinRel(float target) { + return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100); +} + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_floating.cpp +// start catch_matchers_generic.cpp + +std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) { + if (desc.empty()) { + return "matches undescribed predicate"; + } else { + return "matches predicate: \"" + desc + '"'; + } +} +// end catch_matchers_generic.cpp +// start catch_matchers_string.cpp + +#include <regex> + +namespace Catch { +namespace Matchers { + + namespace StdString { + + CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_str( adjustString( str ) ) + {} + std::string CasedString::adjustString( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No + ? toLower( str ) + : str; + } + std::string CasedString::caseSensitivitySuffix() const { + return m_caseSensitivity == CaseSensitive::No + ? " (case insensitive)" + : std::string(); + } + + StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) + : m_comparator( comparator ), + m_operation( operation ) { + } + + std::string StringMatcherBase::describe() const { + std::string description; + description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + + m_comparator.caseSensitivitySuffix().size()); + description += m_operation; + description += ": \""; + description += m_comparator.m_str; + description += "\""; + description += m_comparator.caseSensitivitySuffix(); + return description; + } + + EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} + + bool EqualsMatcher::match( std::string const& source ) const { + return m_comparator.adjustString( source ) == m_comparator.m_str; + } + + ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} + + bool ContainsMatcher::match( std::string const& source ) const { + return contains( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} + + bool StartsWithMatcher::match( std::string const& source ) const { + return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} + + bool EndsWithMatcher::match( std::string const& source ) const { + return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {} + + bool RegexMatcher::match(std::string const& matchee) const { + auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway + if (m_caseSensitivity == CaseSensitive::Choice::No) { + flags |= std::regex::icase; + } + auto reg = std::regex(m_regex, flags); + return std::regex_match(matchee, reg); + } + + std::string RegexMatcher::describe() const { + return "matches " + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? " case sensitively" : " case insensitively"); + } + + } // namespace StdString + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + + StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) { + return StdString::RegexMatcher(regex, caseSensitivity); + } + +} // namespace Matchers +} // namespace Catch +// end catch_matchers_string.cpp +// start catch_message.cpp + +// start catch_uncaught_exceptions.h + +namespace Catch { + bool uncaught_exceptions(); +} // end namespace Catch + +// end catch_uncaught_exceptions.h +#include <cassert> +#include <stack> + +namespace Catch { + + MessageInfo::MessageInfo( StringRef const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + type( _type ), + sequence( ++globalCount ) + {} + + bool MessageInfo::operator==( MessageInfo const& other ) const { + return sequence == other.sequence; + } + + bool MessageInfo::operator<( MessageInfo const& other ) const { + return sequence < other.sequence; + } + + // This may need protecting if threading support is added + unsigned int MessageInfo::globalCount = 0; + + //////////////////////////////////////////////////////////////////////////// + + Catch::MessageBuilder::MessageBuilder( StringRef const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ) + :m_info(macroName, lineInfo, type) {} + + //////////////////////////////////////////////////////////////////////////// + + ScopedMessage::ScopedMessage( MessageBuilder const& builder ) + : m_info( builder.m_info ), m_moved() + { + m_info.message = builder.m_stream.str(); + getResultCapture().pushScopedMessage( m_info ); + } + + ScopedMessage::ScopedMessage( ScopedMessage&& old ) + : m_info( old.m_info ), m_moved() + { + old.m_moved = true; + } + + ScopedMessage::~ScopedMessage() { + if ( !uncaught_exceptions() && !m_moved ){ + getResultCapture().popScopedMessage(m_info); + } + } + + Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) { + auto trimmed = [&] (size_t start, size_t end) { + while (names[start] == ',' || isspace(names[start])) { + ++start; + } + while (names[end] == ',' || isspace(names[end])) { + --end; + } + return names.substr(start, end - start + 1); + }; + auto skipq = [&] (size_t start, char quote) { + for (auto i = start + 1; i < names.size() ; ++i) { + if (names[i] == quote) + return i; + if (names[i] == '\\') + ++i; + } + CATCH_INTERNAL_ERROR("CAPTURE parsing encountered unmatched quote"); + }; + + size_t start = 0; + std::stack<char> openings; + for (size_t pos = 0; pos < names.size(); ++pos) { + char c = names[pos]; + switch (c) { + case '[': + case '{': + case '(': + // It is basically impossible to disambiguate between + // comparison and start of template args in this context +// case '<': + openings.push(c); + break; + case ']': + case '}': + case ')': +// case '>': + openings.pop(); + break; + case '"': + case '\'': + pos = skipq(pos, c); + break; + case ',': + if (start != pos && openings.empty()) { + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message = static_cast<std::string>(trimmed(start, pos)); + m_messages.back().message += " := "; + start = pos; + } + } + } + assert(openings.empty() && "Mismatched openings"); + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1)); + m_messages.back().message += " := "; + } + Capturer::~Capturer() { + if ( !uncaught_exceptions() ){ + assert( m_captured == m_messages.size() ); + for( size_t i = 0; i < m_captured; ++i ) + m_resultCapture.popScopedMessage( m_messages[i] ); + } + } + + void Capturer::captureValue( size_t index, std::string const& value ) { + assert( index < m_messages.size() ); + m_messages[index].message += value; + m_resultCapture.pushScopedMessage( m_messages[index] ); + m_captured++; + } + +} // end namespace Catch +// end catch_message.cpp +// start catch_output_redirect.cpp + +// start catch_output_redirect.h +#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H +#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H + +#include <cstdio> +#include <iosfwd> +#include <string> + +namespace Catch { + + class RedirectedStream { + std::ostream& m_originalStream; + std::ostream& m_redirectionStream; + std::streambuf* m_prevBuf; + + public: + RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ); + ~RedirectedStream(); + }; + + class RedirectedStdOut { + ReusableStringStream m_rss; + RedirectedStream m_cout; + public: + RedirectedStdOut(); + auto str() const -> std::string; + }; + + // StdErr has two constituent streams in C++, std::cerr and std::clog + // This means that we need to redirect 2 streams into 1 to keep proper + // order of writes + class RedirectedStdErr { + ReusableStringStream m_rss; + RedirectedStream m_cerr; + RedirectedStream m_clog; + public: + RedirectedStdErr(); + auto str() const -> std::string; + }; + + class RedirectedStreams { + public: + RedirectedStreams(RedirectedStreams const&) = delete; + RedirectedStreams& operator=(RedirectedStreams const&) = delete; + RedirectedStreams(RedirectedStreams&&) = delete; + RedirectedStreams& operator=(RedirectedStreams&&) = delete; + + RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr); + ~RedirectedStreams(); + private: + std::string& m_redirectedCout; + std::string& m_redirectedCerr; + RedirectedStdOut m_redirectedStdOut; + RedirectedStdErr m_redirectedStdErr; + }; + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + + // Windows's implementation of std::tmpfile is terrible (it tries + // to create a file inside system folder, thus requiring elevated + // privileges for the binary), so we have to use tmpnam(_s) and + // create the file ourselves there. + class TempFile { + public: + TempFile(TempFile const&) = delete; + TempFile& operator=(TempFile const&) = delete; + TempFile(TempFile&&) = delete; + TempFile& operator=(TempFile&&) = delete; + + TempFile(); + ~TempFile(); + + std::FILE* getFile(); + std::string getContents(); + + private: + std::FILE* m_file = nullptr; + #if defined(_MSC_VER) + char m_buffer[L_tmpnam] = { 0 }; + #endif + }; + + class OutputRedirect { + public: + OutputRedirect(OutputRedirect const&) = delete; + OutputRedirect& operator=(OutputRedirect const&) = delete; + OutputRedirect(OutputRedirect&&) = delete; + OutputRedirect& operator=(OutputRedirect&&) = delete; + + OutputRedirect(std::string& stdout_dest, std::string& stderr_dest); + ~OutputRedirect(); + + private: + int m_originalStdout = -1; + int m_originalStderr = -1; + TempFile m_stdoutFile; + TempFile m_stderrFile; + std::string& m_stdoutDest; + std::string& m_stderrDest; + }; + +#endif + +} // end namespace Catch + +#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H +// end catch_output_redirect.h +#include <cstdio> +#include <cstring> +#include <fstream> +#include <sstream> +#include <stdexcept> + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + #if defined(_MSC_VER) + #include <io.h> //_dup and _dup2 + #define dup _dup + #define dup2 _dup2 + #define fileno _fileno + #else + #include <unistd.h> // dup and dup2 + #endif +#endif + +namespace Catch { + + RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ) + : m_originalStream( originalStream ), + m_redirectionStream( redirectionStream ), + m_prevBuf( m_originalStream.rdbuf() ) + { + m_originalStream.rdbuf( m_redirectionStream.rdbuf() ); + } + + RedirectedStream::~RedirectedStream() { + m_originalStream.rdbuf( m_prevBuf ); + } + + RedirectedStdOut::RedirectedStdOut() : m_cout( Catch::cout(), m_rss.get() ) {} + auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); } + + RedirectedStdErr::RedirectedStdErr() + : m_cerr( Catch::cerr(), m_rss.get() ), + m_clog( Catch::clog(), m_rss.get() ) + {} + auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } + + RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr) + : m_redirectedCout(redirectedCout), + m_redirectedCerr(redirectedCerr) + {} + + RedirectedStreams::~RedirectedStreams() { + m_redirectedCout += m_redirectedStdOut.str(); + m_redirectedCerr += m_redirectedStdErr.str(); + } + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + +#if defined(_MSC_VER) + TempFile::TempFile() { + if (tmpnam_s(m_buffer)) { + CATCH_RUNTIME_ERROR("Could not get a temp filename"); + } + if (fopen_s(&m_file, m_buffer, "w")) { + char buffer[100]; + if (strerror_s(buffer, errno)) { + CATCH_RUNTIME_ERROR("Could not translate errno to a string"); + } + CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer << "' because: " << buffer); + } + } +#else + TempFile::TempFile() { + m_file = std::tmpfile(); + if (!m_file) { + CATCH_RUNTIME_ERROR("Could not create a temp file."); + } + } + +#endif + + TempFile::~TempFile() { + // TBD: What to do about errors here? + std::fclose(m_file); + // We manually create the file on Windows only, on Linux + // it will be autodeleted +#if defined(_MSC_VER) + std::remove(m_buffer); +#endif + } + + FILE* TempFile::getFile() { + return m_file; + } + + std::string TempFile::getContents() { + std::stringstream sstr; + char buffer[100] = {}; + std::rewind(m_file); + while (std::fgets(buffer, sizeof(buffer), m_file)) { + sstr << buffer; + } + return sstr.str(); + } + + OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) : + m_originalStdout(dup(1)), + m_originalStderr(dup(2)), + m_stdoutDest(stdout_dest), + m_stderrDest(stderr_dest) { + dup2(fileno(m_stdoutFile.getFile()), 1); + dup2(fileno(m_stderrFile.getFile()), 2); + } + + OutputRedirect::~OutputRedirect() { + Catch::cout() << std::flush; + fflush(stdout); + // Since we support overriding these streams, we flush cerr + // even though std::cerr is unbuffered + Catch::cerr() << std::flush; + Catch::clog() << std::flush; + fflush(stderr); + + dup2(m_originalStdout, 1); + dup2(m_originalStderr, 2); + + m_stdoutDest += m_stdoutFile.getContents(); + m_stderrDest += m_stderrFile.getContents(); + } + +#endif // CATCH_CONFIG_NEW_CAPTURE + +} // namespace Catch + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + #if defined(_MSC_VER) + #undef dup + #undef dup2 + #undef fileno + #endif +#endif +// end catch_output_redirect.cpp +// start catch_polyfills.cpp + +#include <cmath> + +namespace Catch { + +#if !defined(CATCH_CONFIG_POLYFILL_ISNAN) + bool isnan(float f) { + return std::isnan(f); + } + bool isnan(double d) { + return std::isnan(d); + } +#else + // For now we only use this for embarcadero + bool isnan(float f) { + return std::_isnan(f); + } + bool isnan(double d) { + return std::_isnan(d); + } +#endif + +} // end namespace Catch +// end catch_polyfills.cpp +// start catch_random_number_generator.cpp + +namespace Catch { + +namespace { + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4146) // we negate uint32 during the rotate +#endif + // Safe rotr implementation thanks to John Regehr + uint32_t rotate_right(uint32_t val, uint32_t count) { + const uint32_t mask = 31; + count &= mask; + return (val >> count) | (val << (-count & mask)); + } + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +} + + SimplePcg32::SimplePcg32(result_type seed_) { + seed(seed_); + } + + void SimplePcg32::seed(result_type seed_) { + m_state = 0; + (*this)(); + m_state += seed_; + (*this)(); + } + + void SimplePcg32::discard(uint64_t skip) { + // We could implement this to run in O(log n) steps, but this + // should suffice for our use case. + for (uint64_t s = 0; s < skip; ++s) { + static_cast<void>((*this)()); + } + } + + SimplePcg32::result_type SimplePcg32::operator()() { + // prepare the output value + const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u); + const auto output = rotate_right(xorshifted, m_state >> 59u); + + // advance state + m_state = m_state * 6364136223846793005ULL + s_inc; + + return output; + } + + bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { + return lhs.m_state == rhs.m_state; + } + + bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { + return lhs.m_state != rhs.m_state; + } +} +// end catch_random_number_generator.cpp +// start catch_registry_hub.cpp + +// start catch_test_case_registry_impl.h + +#include <vector> +#include <set> +#include <algorithm> +#include <ios> + +namespace Catch { + + class TestCase; + struct IConfig; + + std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ); + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + + void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ); + + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ); + + class TestRegistry : public ITestCaseRegistry { + public: + virtual ~TestRegistry() = default; + + virtual void registerTest( TestCase const& testCase ); + + std::vector<TestCase> const& getAllTests() const override; + std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const override; + + private: + std::vector<TestCase> m_functions; + mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder; + mutable std::vector<TestCase> m_sortedFunctions; + std::size_t m_unnamedCount = 0; + std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised + }; + + /////////////////////////////////////////////////////////////////////////// + + class TestInvokerAsFunction : public ITestInvoker { + void(*m_testAsFunction)(); + public: + TestInvokerAsFunction( void(*testAsFunction)() ) noexcept; + + void invoke() const override; + }; + + std::string extractClassName( StringRef const& classOrQualifiedMethodName ); + + /////////////////////////////////////////////////////////////////////////// + +} // end namespace Catch + +// end catch_test_case_registry_impl.h +// start catch_reporter_registry.h + +#include <map> + +namespace Catch { + + class ReporterRegistry : public IReporterRegistry { + + public: + + ~ReporterRegistry() override; + + IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override; + + void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ); + void registerListener( IReporterFactoryPtr const& factory ); + + FactoryMap const& getFactories() const override; + Listeners const& getListeners() const override; + + private: + FactoryMap m_factories; + Listeners m_listeners; + }; +} + +// end catch_reporter_registry.h +// start catch_tag_alias_registry.h + +// start catch_tag_alias.h + +#include <string> + +namespace Catch { + + struct TagAlias { + TagAlias(std::string const& _tag, SourceLineInfo _lineInfo); + + std::string tag; + SourceLineInfo lineInfo; + }; + +} // end namespace Catch + +// end catch_tag_alias.h +#include <map> + +namespace Catch { + + class TagAliasRegistry : public ITagAliasRegistry { + public: + ~TagAliasRegistry() override; + TagAlias const* find( std::string const& alias ) const override; + std::string expandAliases( std::string const& unexpandedTestSpec ) const override; + void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); + + private: + std::map<std::string, TagAlias> m_registry; + }; + +} // end namespace Catch + +// end catch_tag_alias_registry.h +// start catch_startup_exception_registry.h + +#include <vector> +#include <exception> + +namespace Catch { + + class StartupExceptionRegistry { + public: + void add(std::exception_ptr const& exception) noexcept; + std::vector<std::exception_ptr> const& getExceptions() const noexcept; + private: + std::vector<std::exception_ptr> m_exceptions; + }; + +} // end namespace Catch + +// end catch_startup_exception_registry.h +// start catch_singletons.hpp + +namespace Catch { + + struct ISingleton { + virtual ~ISingleton(); + }; + + void addSingleton( ISingleton* singleton ); + void cleanupSingletons(); + + template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT> + class Singleton : SingletonImplT, public ISingleton { + + static auto getInternal() -> Singleton* { + static Singleton* s_instance = nullptr; + if( !s_instance ) { + s_instance = new Singleton; + addSingleton( s_instance ); + } + return s_instance; + } + + public: + static auto get() -> InterfaceT const& { + return *getInternal(); + } + static auto getMutable() -> MutableInterfaceT& { + return *getInternal(); + } + }; + +} // namespace Catch + +// end catch_singletons.hpp +namespace Catch { + + namespace { + + class RegistryHub : public IRegistryHub, public IMutableRegistryHub, + private NonCopyable { + + public: // IRegistryHub + RegistryHub() = default; + IReporterRegistry const& getReporterRegistry() const override { + return m_reporterRegistry; + } + ITestCaseRegistry const& getTestCaseRegistry() const override { + return m_testCaseRegistry; + } + IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override { + return m_exceptionTranslatorRegistry; + } + ITagAliasRegistry const& getTagAliasRegistry() const override { + return m_tagAliasRegistry; + } + StartupExceptionRegistry const& getStartupExceptionRegistry() const override { + return m_exceptionRegistry; + } + + public: // IMutableRegistryHub + void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override { + m_reporterRegistry.registerReporter( name, factory ); + } + void registerListener( IReporterFactoryPtr const& factory ) override { + m_reporterRegistry.registerListener( factory ); + } + void registerTest( TestCase const& testInfo ) override { + m_testCaseRegistry.registerTest( testInfo ); + } + void registerTranslator( const IExceptionTranslator* translator ) override { + m_exceptionTranslatorRegistry.registerTranslator( translator ); + } + void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override { + m_tagAliasRegistry.add( alias, tag, lineInfo ); + } + void registerStartupException() noexcept override { + m_exceptionRegistry.add(std::current_exception()); + } + IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override { + return m_enumValuesRegistry; + } + + private: + TestRegistry m_testCaseRegistry; + ReporterRegistry m_reporterRegistry; + ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; + TagAliasRegistry m_tagAliasRegistry; + StartupExceptionRegistry m_exceptionRegistry; + Detail::EnumValuesRegistry m_enumValuesRegistry; + }; + } + + using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>; + + IRegistryHub const& getRegistryHub() { + return RegistryHubSingleton::get(); + } + IMutableRegistryHub& getMutableRegistryHub() { + return RegistryHubSingleton::getMutable(); + } + void cleanUp() { + cleanupSingletons(); + cleanUpContext(); + } + std::string translateActiveException() { + return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); + } + +} // end namespace Catch +// end catch_registry_hub.cpp +// start catch_reporter_registry.cpp + +namespace Catch { + + ReporterRegistry::~ReporterRegistry() = default; + + IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const { + auto it = m_factories.find( name ); + if( it == m_factories.end() ) + return nullptr; + return it->second->create( ReporterConfig( config ) ); + } + + void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) { + m_factories.emplace(name, factory); + } + void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) { + m_listeners.push_back( factory ); + } + + IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const { + return m_factories; + } + IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const { + return m_listeners; + } + +} +// end catch_reporter_registry.cpp +// start catch_result_type.cpp + +namespace Catch { + + bool isOk( ResultWas::OfType resultType ) { + return ( resultType & ResultWas::FailureBit ) == 0; + } + bool isJustInfo( int flags ) { + return flags == ResultWas::Info; + } + + ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { + return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) ); + } + + bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } + bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } + +} // end namespace Catch +// end catch_result_type.cpp +// start catch_run_context.cpp + +#include <cassert> +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace Generators { + struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker { + GeneratorBasePtr m_generator; + + GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ) + {} + ~GeneratorTracker(); + + static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) { + std::shared_ptr<GeneratorTracker> tracker; + + ITracker& currentTracker = ctx.currentTracker(); + if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isGeneratorTracker() ); + tracker = std::static_pointer_cast<GeneratorTracker>( childTracker ); + } + else { + tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( tracker ); + } + + if( !ctx.completedCycle() && !tracker->isComplete() ) { + tracker->open(); + } + + return *tracker; + } + + // TrackerBase interface + bool isGeneratorTracker() const override { return true; } + auto hasGenerator() const -> bool override { + return !!m_generator; + } + void close() override { + TrackerBase::close(); + // Generator interface only finds out if it has another item on atual move + if (m_runState == CompletedSuccessfully && m_generator->next()) { + m_children.clear(); + m_runState = Executing; + } + } + + // IGeneratorTracker interface + auto getGenerator() const -> GeneratorBasePtr const& override { + return m_generator; + } + void setGenerator( GeneratorBasePtr&& generator ) override { + m_generator = std::move( generator ); + } + }; + GeneratorTracker::~GeneratorTracker() {} + } + + RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter) + : m_runInfo(_config->name()), + m_context(getCurrentMutableContext()), + m_config(_config), + m_reporter(std::move(reporter)), + m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, + m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions ) + { + m_context.setRunner(this); + m_context.setConfig(m_config); + m_context.setResultCapture(this); + m_reporter->testRunStarting(m_runInfo); + } + + RunContext::~RunContext() { + m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting())); + } + + void RunContext::testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount) { + m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount)); + } + + void RunContext::testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount) { + m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting())); + } + + Totals RunContext::runTest(TestCase const& testCase) { + Totals prevTotals = m_totals; + + std::string redirectedCout; + std::string redirectedCerr; + + auto const& testInfo = testCase.getTestCaseInfo(); + + m_reporter->testCaseStarting(testInfo); + + m_activeTestCase = &testCase; + + ITracker& rootTracker = m_trackerContext.startRun(); + assert(rootTracker.isSectionTracker()); + static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun()); + do { + m_trackerContext.startCycle(); + m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo)); + runCurrentTest(redirectedCout, redirectedCerr); + } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting()); + + Totals deltaTotals = m_totals.delta(prevTotals); + if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } + m_totals.testCases += deltaTotals.testCases; + m_reporter->testCaseEnded(TestCaseStats(testInfo, + deltaTotals, + redirectedCout, + redirectedCerr, + aborting())); + + m_activeTestCase = nullptr; + m_testCaseTracker = nullptr; + + return deltaTotals; + } + + IConfigPtr RunContext::config() const { + return m_config; + } + + IStreamingReporter& RunContext::reporter() const { + return *m_reporter; + } + + void RunContext::assertionEnded(AssertionResult const & result) { + if (result.getResultType() == ResultWas::Ok) { + m_totals.assertions.passed++; + m_lastAssertionPassed = true; + } else if (!result.isOk()) { + m_lastAssertionPassed = false; + if( m_activeTestCase->getTestCaseInfo().okToFail() ) + m_totals.assertions.failedButOk++; + else + m_totals.assertions.failed++; + } + else { + m_lastAssertionPassed = true; + } + + // We have no use for the return value (whether messages should be cleared), because messages were made scoped + // and should be let to clear themselves out. + static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); + + if (result.getResultType() != ResultWas::Warning) + m_messageScopes.clear(); + + // Reset working state + resetAssertionInfo(); + m_lastResult = result; + } + void RunContext::resetAssertionInfo() { + m_lastAssertionInfo.macroName = StringRef(); + m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"_sr; + } + + bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) { + ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo)); + if (!sectionTracker.isOpen()) + return false; + m_activeSections.push_back(§ionTracker); + + m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; + + m_reporter->sectionStarting(sectionInfo); + + assertions = m_totals.assertions; + + return true; + } + auto RunContext::acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + using namespace Generators; + GeneratorTracker& tracker = GeneratorTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( "generator", lineInfo ) ); + assert( tracker.isOpen() ); + m_lastAssertionInfo.lineInfo = lineInfo; + return tracker; + } + + bool RunContext::testForMissingAssertions(Counts& assertions) { + if (assertions.total() != 0) + return false; + if (!m_config->warnAboutMissingAssertions()) + return false; + if (m_trackerContext.currentTracker().hasChildren()) + return false; + m_totals.assertions.failed++; + assertions.failed++; + return true; + } + + void RunContext::sectionEnded(SectionEndInfo const & endInfo) { + Counts assertions = m_totals.assertions - endInfo.prevAssertions; + bool missingAssertions = testForMissingAssertions(assertions); + + if (!m_activeSections.empty()) { + m_activeSections.back()->close(); + m_activeSections.pop_back(); + } + + m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions)); + m_messages.clear(); + m_messageScopes.clear(); + } + + void RunContext::sectionEndedEarly(SectionEndInfo const & endInfo) { + if (m_unfinishedSections.empty()) + m_activeSections.back()->fail(); + else + m_activeSections.back()->close(); + m_activeSections.pop_back(); + + m_unfinishedSections.push_back(endInfo); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void RunContext::benchmarkPreparing(std::string const& name) { + m_reporter->benchmarkPreparing(name); + } + void RunContext::benchmarkStarting( BenchmarkInfo const& info ) { + m_reporter->benchmarkStarting( info ); + } + void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) { + m_reporter->benchmarkEnded( stats ); + } + void RunContext::benchmarkFailed(std::string const & error) { + m_reporter->benchmarkFailed(error); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void RunContext::pushScopedMessage(MessageInfo const & message) { + m_messages.push_back(message); + } + + void RunContext::popScopedMessage(MessageInfo const & message) { + m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end()); + } + + void RunContext::emplaceUnscopedMessage( MessageBuilder const& builder ) { + m_messageScopes.emplace_back( builder ); + } + + std::string RunContext::getCurrentTestName() const { + return m_activeTestCase + ? m_activeTestCase->getTestCaseInfo().name + : std::string(); + } + + const AssertionResult * RunContext::getLastResult() const { + return &(*m_lastResult); + } + + void RunContext::exceptionEarlyReported() { + m_shouldReportUnexpected = false; + } + + void RunContext::handleFatalErrorCondition( StringRef message ) { + // First notify reporter that bad things happened + m_reporter->fatalErrorEncountered(message); + + // Don't rebuild the result -- the stringification itself can cause more fatal errors + // Instead, fake a result data. + AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } ); + tempResult.message = static_cast<std::string>(message); + AssertionResult result(m_lastAssertionInfo, tempResult); + + assertionEnded(result); + + handleUnfinishedSections(); + + // Recreate section for test case (as we will lose the one that was in scope) + auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); + + Counts assertions; + assertions.failed = 1; + SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false); + m_reporter->sectionEnded(testCaseSectionStats); + + auto const& testInfo = m_activeTestCase->getTestCaseInfo(); + + Totals deltaTotals; + deltaTotals.testCases.failed = 1; + deltaTotals.assertions.failed = 1; + m_reporter->testCaseEnded(TestCaseStats(testInfo, + deltaTotals, + std::string(), + std::string(), + false)); + m_totals.testCases.failed++; + testGroupEnded(std::string(), m_totals, 1, 1); + m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false)); + } + + bool RunContext::lastAssertionPassed() { + return m_lastAssertionPassed; + } + + void RunContext::assertionPassed() { + m_lastAssertionPassed = true; + ++m_totals.assertions.passed; + resetAssertionInfo(); + m_messageScopes.clear(); + } + + bool RunContext::aborting() const { + return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter()); + } + + void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) { + auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); + m_reporter->sectionStarting(testCaseSection); + Counts prevAssertions = m_totals.assertions; + double duration = 0; + m_shouldReportUnexpected = true; + m_lastAssertionInfo = { "TEST_CASE"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal }; + + seedRng(*m_config); + + Timer timer; + CATCH_TRY { + if (m_reporter->getPreferences().shouldRedirectStdOut) { +#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) + RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr); + + timer.start(); + invokeActiveTestCase(); +#else + OutputRedirect r(redirectedCout, redirectedCerr); + timer.start(); + invokeActiveTestCase(); +#endif + } else { + timer.start(); + invokeActiveTestCase(); + } + duration = timer.getElapsedSeconds(); + } CATCH_CATCH_ANON (TestFailureException&) { + // This just means the test was aborted due to failure + } CATCH_CATCH_ALL { + // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions + // are reported without translation at the point of origin. + if( m_shouldReportUnexpected ) { + AssertionReaction dummyReaction; + handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction ); + } + } + Counts assertions = m_totals.assertions - prevAssertions; + bool missingAssertions = testForMissingAssertions(assertions); + + m_testCaseTracker->close(); + handleUnfinishedSections(); + m_messages.clear(); + m_messageScopes.clear(); + + SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions); + m_reporter->sectionEnded(testCaseSectionStats); + } + + void RunContext::invokeActiveTestCase() { + FatalConditionHandler fatalConditionHandler; // Handle signals + m_activeTestCase->invoke(); + fatalConditionHandler.reset(); + } + + void RunContext::handleUnfinishedSections() { + // If sections ended prematurely due to an exception we stored their + // infos here so we can tear them down outside the unwind process. + for (auto it = m_unfinishedSections.rbegin(), + itEnd = m_unfinishedSections.rend(); + it != itEnd; + ++it) + sectionEnded(*it); + m_unfinishedSections.clear(); + } + + void RunContext::handleExpr( + AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction + ) { + m_reporter->assertionStarting( info ); + + bool negated = isFalseTest( info.resultDisposition ); + bool result = expr.getResult() != negated; + + if( result ) { + if (!m_includeSuccessfulResults) { + assertionPassed(); + } + else { + reportExpr(info, ResultWas::Ok, &expr, negated); + } + } + else { + reportExpr(info, ResultWas::ExpressionFailed, &expr, negated ); + populateReaction( reaction ); + } + } + void RunContext::reportExpr( + AssertionInfo const &info, + ResultWas::OfType resultType, + ITransientExpression const *expr, + bool negated ) { + + m_lastAssertionInfo = info; + AssertionResultData data( resultType, LazyExpression( negated ) ); + + AssertionResult assertionResult{ info, data }; + assertionResult.m_resultData.lazyExpression.m_transientExpression = expr; + + assertionEnded( assertionResult ); + } + + void RunContext::handleMessage( + AssertionInfo const& info, + ResultWas::OfType resultType, + StringRef const& message, + AssertionReaction& reaction + ) { + m_reporter->assertionStarting( info ); + + m_lastAssertionInfo = info; + + AssertionResultData data( resultType, LazyExpression( false ) ); + data.message = static_cast<std::string>(message); + AssertionResult assertionResult{ m_lastAssertionInfo, data }; + assertionEnded( assertionResult ); + if( !assertionResult.isOk() ) + populateReaction( reaction ); + } + void RunContext::handleUnexpectedExceptionNotThrown( + AssertionInfo const& info, + AssertionReaction& reaction + ) { + handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction); + } + + void RunContext::handleUnexpectedInflightException( + AssertionInfo const& info, + std::string const& message, + AssertionReaction& reaction + ) { + m_lastAssertionInfo = info; + + AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) ); + data.message = message; + AssertionResult assertionResult{ info, data }; + assertionEnded( assertionResult ); + populateReaction( reaction ); + } + + void RunContext::populateReaction( AssertionReaction& reaction ) { + reaction.shouldDebugBreak = m_config->shouldDebugBreak(); + reaction.shouldThrow = aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal); + } + + void RunContext::handleIncomplete( + AssertionInfo const& info + ) { + m_lastAssertionInfo = info; + + AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) ); + data.message = "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; + AssertionResult assertionResult{ info, data }; + assertionEnded( assertionResult ); + } + void RunContext::handleNonExpr( + AssertionInfo const &info, + ResultWas::OfType resultType, + AssertionReaction &reaction + ) { + m_lastAssertionInfo = info; + + AssertionResultData data( resultType, LazyExpression( false ) ); + AssertionResult assertionResult{ info, data }; + assertionEnded( assertionResult ); + + if( !assertionResult.isOk() ) + populateReaction( reaction ); + } + + IResultCapture& getResultCapture() { + if (auto* capture = getCurrentContext().getResultCapture()) + return *capture; + else + CATCH_INTERNAL_ERROR("No result capture instance"); + } + + void seedRng(IConfig const& config) { + if (config.rngSeed() != 0) { + std::srand(config.rngSeed()); + rng().seed(config.rngSeed()); + } + } + + unsigned int rngSeed() { + return getCurrentContext().getConfig()->rngSeed(); + } + +} +// end catch_run_context.cpp +// start catch_section.cpp + +namespace Catch { + + Section::Section( SectionInfo const& info ) + : m_info( info ), + m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) + { + m_timer.start(); + } + + Section::~Section() { + if( m_sectionIncluded ) { + SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() }; + if( uncaught_exceptions() ) + getResultCapture().sectionEndedEarly( endInfo ); + else + getResultCapture().sectionEnded( endInfo ); + } + } + + // This indicates whether the section should be executed or not + Section::operator bool() const { + return m_sectionIncluded; + } + +} // end namespace Catch +// end catch_section.cpp +// start catch_section_info.cpp + +namespace Catch { + + SectionInfo::SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name ) + : name( _name ), + lineInfo( _lineInfo ) + {} + +} // end namespace Catch +// end catch_section_info.cpp +// start catch_session.cpp + +// start catch_session.h + +#include <memory> + +namespace Catch { + + class Session : NonCopyable { + public: + + Session(); + ~Session() override; + + void showHelp() const; + void libIdentify(); + + int applyCommandLine( int argc, char const * const * argv ); + #if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) + int applyCommandLine( int argc, wchar_t const * const * argv ); + #endif + + void useConfigData( ConfigData const& configData ); + + template<typename CharT> + int run(int argc, CharT const * const argv[]) { + if (m_startupExceptions) + return 1; + int returnCode = applyCommandLine(argc, argv); + if (returnCode == 0) + returnCode = run(); + return returnCode; + } + + int run(); + + clara::Parser const& cli() const; + void cli( clara::Parser const& newParser ); + ConfigData& configData(); + Config& config(); + private: + int runInternal(); + + clara::Parser m_cli; + ConfigData m_configData; + std::shared_ptr<Config> m_config; + bool m_startupExceptions = false; + }; + +} // end namespace Catch + +// end catch_session.h +// start catch_version.h + +#include <iosfwd> + +namespace Catch { + + // Versioning information + struct Version { + Version( Version const& ) = delete; + Version& operator=( Version const& ) = delete; + Version( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ); + + unsigned int const majorVersion; + unsigned int const minorVersion; + unsigned int const patchNumber; + + // buildNumber is only used if branchName is not null + char const * const branchName; + unsigned int const buildNumber; + + friend std::ostream& operator << ( std::ostream& os, Version const& version ); + }; + + Version const& libraryVersion(); +} + +// end catch_version.h +#include <cstdlib> +#include <iomanip> +#include <set> +#include <iterator> + +namespace Catch { + + namespace { + const int MaxExitCode = 255; + + IStreamingReporterPtr createReporter(std::string const& reporterName, IConfigPtr const& config) { + auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, config); + CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << "'"); + + return reporter; + } + + IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) { + if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) { + return createReporter(config->getReporterName(), config); + } + + // On older platforms, returning std::unique_ptr<ListeningReporter> + // when the return type is std::unique_ptr<IStreamingReporter> + // doesn't compile without a std::move call. However, this causes + // a warning on newer platforms. Thus, we have to work around + // it a bit and downcast the pointer manually. + auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter); + auto& multi = static_cast<ListeningReporter&>(*ret); + auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners(); + for (auto const& listener : listeners) { + multi.addListener(listener->create(Catch::ReporterConfig(config))); + } + multi.addReporter(createReporter(config->getReporterName(), config)); + return ret; + } + + class TestGroup { + public: + explicit TestGroup(std::shared_ptr<Config> const& config) + : m_config{config} + , m_context{config, makeReporter(config)} + { + auto const& allTestCases = getAllTestCasesSorted(*m_config); + m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config); + auto const& invalidArgs = m_config->testSpec().getInvalidArgs(); + + if (m_matches.empty() && invalidArgs.empty()) { + for (auto const& test : allTestCases) + if (!test.isHidden()) + m_tests.emplace(&test); + } else { + for (auto const& match : m_matches) + m_tests.insert(match.tests.begin(), match.tests.end()); + } + } + + Totals execute() { + auto const& invalidArgs = m_config->testSpec().getInvalidArgs(); + Totals totals; + m_context.testGroupStarting(m_config->name(), 1, 1); + for (auto const& testCase : m_tests) { + if (!m_context.aborting()) + totals += m_context.runTest(*testCase); + else + m_context.reporter().skipTest(*testCase); + } + + for (auto const& match : m_matches) { + if (match.tests.empty()) { + m_context.reporter().noMatchingTestCases(match.name); + totals.error = -1; + } + } + + if (!invalidArgs.empty()) { + for (auto const& invalidArg: invalidArgs) + m_context.reporter().reportInvalidArguments(invalidArg); + } + + m_context.testGroupEnded(m_config->name(), totals, 1, 1); + return totals; + } + + private: + using Tests = std::set<TestCase const*>; + + std::shared_ptr<Config> m_config; + RunContext m_context; + Tests m_tests; + TestSpec::Matches m_matches; + }; + + void applyFilenamesAsTags(Catch::IConfig const& config) { + auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config)); + for (auto& testCase : tests) { + auto tags = testCase.tags; + + std::string filename = testCase.lineInfo.file; + auto lastSlash = filename.find_last_of("\\/"); + if (lastSlash != std::string::npos) { + filename.erase(0, lastSlash); + filename[0] = '#'; + } + + auto lastDot = filename.find_last_of('.'); + if (lastDot != std::string::npos) { + filename.erase(lastDot); + } + + tags.push_back(std::move(filename)); + setTags(testCase, tags); + } + } + + } // anon namespace + + Session::Session() { + static bool alreadyInstantiated = false; + if( alreadyInstantiated ) { + CATCH_TRY { CATCH_INTERNAL_ERROR( "Only one instance of Catch::Session can ever be used" ); } + CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); } + } + + // There cannot be exceptions at startup in no-exception mode. +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions(); + if ( !exceptions.empty() ) { + config(); + getCurrentMutableContext().setConfig(m_config); + + m_startupExceptions = true; + Colour colourGuard( Colour::Red ); + Catch::cerr() << "Errors occurred during startup!" << '\n'; + // iterate over all exceptions and notify user + for ( const auto& ex_ptr : exceptions ) { + try { + std::rethrow_exception(ex_ptr); + } catch ( std::exception const& ex ) { + Catch::cerr() << Column( ex.what() ).indent(2) << '\n'; + } + } + } +#endif + + alreadyInstantiated = true; + m_cli = makeCommandLineParser( m_configData ); + } + Session::~Session() { + Catch::cleanUp(); + } + + void Session::showHelp() const { + Catch::cout() + << "\nCatch v" << libraryVersion() << "\n" + << m_cli << std::endl + << "For more detailed usage please see the project docs\n" << std::endl; + } + void Session::libIdentify() { + Catch::cout() + << std::left << std::setw(16) << "description: " << "A Catch2 test executable\n" + << std::left << std::setw(16) << "category: " << "testframework\n" + << std::left << std::setw(16) << "framework: " << "Catch Test\n" + << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl; + } + + int Session::applyCommandLine( int argc, char const * const * argv ) { + if( m_startupExceptions ) + return 1; + + auto result = m_cli.parse( clara::Args( argc, argv ) ); + if( !result ) { + config(); + getCurrentMutableContext().setConfig(m_config); + Catch::cerr() + << Colour( Colour::Red ) + << "\nError(s) in input:\n" + << Column( result.errorMessage() ).indent( 2 ) + << "\n\n"; + Catch::cerr() << "Run with -? for usage\n" << std::endl; + return MaxExitCode; + } + + if( m_configData.showHelp ) + showHelp(); + if( m_configData.libIdentify ) + libIdentify(); + m_config.reset(); + return 0; + } + +#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) + int Session::applyCommandLine( int argc, wchar_t const * const * argv ) { + + char **utf8Argv = new char *[ argc ]; + + for ( int i = 0; i < argc; ++i ) { + int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr ); + + utf8Argv[ i ] = new char[ bufSize ]; + + WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr ); + } + + int returnCode = applyCommandLine( argc, utf8Argv ); + + for ( int i = 0; i < argc; ++i ) + delete [] utf8Argv[ i ]; + + delete [] utf8Argv; + + return returnCode; + } +#endif + + void Session::useConfigData( ConfigData const& configData ) { + m_configData = configData; + m_config.reset(); + } + + int Session::run() { + if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) { + Catch::cout() << "...waiting for enter/ return before starting" << std::endl; + static_cast<void>(std::getchar()); + } + int exitCode = runInternal(); + if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) { + Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode << std::endl; + static_cast<void>(std::getchar()); + } + return exitCode; + } + + clara::Parser const& Session::cli() const { + return m_cli; + } + void Session::cli( clara::Parser const& newParser ) { + m_cli = newParser; + } + ConfigData& Session::configData() { + return m_configData; + } + Config& Session::config() { + if( !m_config ) + m_config = std::make_shared<Config>( m_configData ); + return *m_config; + } + + int Session::runInternal() { + if( m_startupExceptions ) + return 1; + + if (m_configData.showHelp || m_configData.libIdentify) { + return 0; + } + + CATCH_TRY { + config(); // Force config to be constructed + + seedRng( *m_config ); + + if( m_configData.filenamesAsTags ) + applyFilenamesAsTags( *m_config ); + + // Handle list request + if( Option<std::size_t> listed = list( m_config ) ) + return static_cast<int>( *listed ); + + TestGroup tests { m_config }; + auto const totals = tests.execute(); + + if( m_config->warnAboutNoTests() && totals.error == -1 ) + return 2; + + // Note that on unices only the lower 8 bits are usually used, clamping + // the return value to 255 prevents false negative when some multiple + // of 256 tests has failed + return (std::min) (MaxExitCode, (std::max) (totals.error, static_cast<int>(totals.assertions.failed))); + } +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + catch( std::exception& ex ) { + Catch::cerr() << ex.what() << std::endl; + return MaxExitCode; + } +#endif + } + +} // end namespace Catch +// end catch_session.cpp +// start catch_singletons.cpp + +#include <vector> + +namespace Catch { + + namespace { + static auto getSingletons() -> std::vector<ISingleton*>*& { + static std::vector<ISingleton*>* g_singletons = nullptr; + if( !g_singletons ) + g_singletons = new std::vector<ISingleton*>(); + return g_singletons; + } + } + + ISingleton::~ISingleton() {} + + void addSingleton(ISingleton* singleton ) { + getSingletons()->push_back( singleton ); + } + void cleanupSingletons() { + auto& singletons = getSingletons(); + for( auto singleton : *singletons ) + delete singleton; + delete singletons; + singletons = nullptr; + } + +} // namespace Catch +// end catch_singletons.cpp +// start catch_startup_exception_registry.cpp + +namespace Catch { +void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { + CATCH_TRY { + m_exceptions.push_back(exception); + } CATCH_CATCH_ALL { + // If we run out of memory during start-up there's really not a lot more we can do about it + std::terminate(); + } + } + + std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept { + return m_exceptions; + } + +} // end namespace Catch +// end catch_startup_exception_registry.cpp +// start catch_stream.cpp + +#include <cstdio> +#include <iostream> +#include <fstream> +#include <sstream> +#include <vector> +#include <memory> + +namespace Catch { + + Catch::IStream::~IStream() = default; + + namespace Detail { namespace { + template<typename WriterF, std::size_t bufferSize=256> + class StreamBufImpl : public std::streambuf { + char data[bufferSize]; + WriterF m_writer; + + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); + } + + ~StreamBufImpl() noexcept { + StreamBufImpl::sync(); + } + + private: + int overflow( int c ) override { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast<char>( c ) ) ); + else + sputc( static_cast<char>( c ) ); + } + return 0; + } + + int sync() override { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + struct OutputDebugWriter { + + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; + + /////////////////////////////////////////////////////////////////////////// + + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( StringRef filename ) { + m_ofs.open( filename.c_str() ); + CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); + } + ~FileStream() override = default; + public: // IStream + std::ostream& stream() const override { + return m_ofs; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream() : m_os( Catch::cout().rdbuf() ) {} + ~CoutStream() override = default; + + public: // IStream + std::ostream& stream() const override { return m_os; } + }; + + /////////////////////////////////////////////////////////////////////////// + + class DebugOutStream : public IStream { + std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream() + : m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ), + m_os( m_streamBuf.get() ) + {} + + ~DebugOutStream() override = default; + + public: // IStream + std::ostream& stream() const override { return m_os; } + }; + + }} // namespace anon::detail + + /////////////////////////////////////////////////////////////////////////// + + auto makeStream( StringRef const &filename ) -> IStream const* { + if( filename.empty() ) + return new Detail::CoutStream(); + else if( filename[0] == '%' ) { + if( filename == "%debug" ) + return new Detail::DebugOutStream(); + else + CATCH_ERROR( "Unrecognised stream: '" << filename << "'" ); + } + else + return new Detail::FileStream( filename ); + } + + // This class encapsulates the idea of a pool of ostringstreams that can be reused. + struct StringStreams { + std::vector<std::unique_ptr<std::ostringstream>> m_streams; + std::vector<std::size_t> m_unused; + std::ostringstream m_referenceStream; // Used for copy state/ flags from + + auto add() -> std::size_t { + if( m_unused.empty() ) { + m_streams.push_back( std::unique_ptr<std::ostringstream>( new std::ostringstream ) ); + return m_streams.size()-1; + } + else { + auto index = m_unused.back(); + m_unused.pop_back(); + return index; + } + } + + void release( std::size_t index ) { + m_streams[index]->copyfmt( m_referenceStream ); // Restore initial flags and other state + m_unused.push_back(index); + } + }; + + ReusableStringStream::ReusableStringStream() + : m_index( Singleton<StringStreams>::getMutable().add() ), + m_oss( Singleton<StringStreams>::getMutable().m_streams[m_index].get() ) + {} + + ReusableStringStream::~ReusableStringStream() { + static_cast<std::ostringstream*>( m_oss )->str(""); + m_oss->clear(); + Singleton<StringStreams>::getMutable().release( m_index ); + } + + auto ReusableStringStream::str() const -> std::string { + return static_cast<std::ostringstream*>( m_oss )->str(); + } + + /////////////////////////////////////////////////////////////////////////// + +#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions + std::ostream& cout() { return std::cout; } + std::ostream& cerr() { return std::cerr; } + std::ostream& clog() { return std::clog; } +#endif +} +// end catch_stream.cpp +// start catch_string_manip.cpp + +#include <algorithm> +#include <ostream> +#include <cstring> +#include <cctype> +#include <vector> + +namespace Catch { + + namespace { + char toLowerCh(char c) { + return static_cast<char>( std::tolower( c ) ); + } + } + + bool startsWith( std::string const& s, std::string const& prefix ) { + return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); + } + bool startsWith( std::string const& s, char prefix ) { + return !s.empty() && s[0] == prefix; + } + bool endsWith( std::string const& s, std::string const& suffix ) { + return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); + } + bool endsWith( std::string const& s, char suffix ) { + return !s.empty() && s[s.size()-1] == suffix; + } + bool contains( std::string const& s, std::string const& infix ) { + return s.find( infix ) != std::string::npos; + } + void toLowerInPlace( std::string& s ) { + std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); + } + std::string toLower( std::string const& s ) { + std::string lc = s; + toLowerInPlace( lc ); + return lc; + } + std::string trim( std::string const& str ) { + static char const* whitespaceChars = "\n\r\t "; + std::string::size_type start = str.find_first_not_of( whitespaceChars ); + std::string::size_type end = str.find_last_not_of( whitespaceChars ); + + return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); + } + + StringRef trim(StringRef ref) { + const auto is_ws = [](char c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; + }; + size_t real_begin = 0; + while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; } + size_t real_end = ref.size(); + while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; } + + return ref.substr(real_begin, real_end - real_begin); + } + + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { + bool replaced = false; + std::size_t i = str.find( replaceThis ); + while( i != std::string::npos ) { + replaced = true; + str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); + if( i < str.size()-withThis.size() ) + i = str.find( replaceThis, i+withThis.size() ); + else + i = std::string::npos; + } + return replaced; + } + + std::vector<StringRef> splitStringRef( StringRef str, char delimiter ) { + std::vector<StringRef> subStrings; + std::size_t start = 0; + for(std::size_t pos = 0; pos < str.size(); ++pos ) { + if( str[pos] == delimiter ) { + if( pos - start > 1 ) + subStrings.push_back( str.substr( start, pos-start ) ); + start = pos+1; + } + } + if( start < str.size() ) + subStrings.push_back( str.substr( start, str.size()-start ) ); + return subStrings; + } + + pluralise::pluralise( std::size_t count, std::string const& label ) + : m_count( count ), + m_label( label ) + {} + + std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { + os << pluraliser.m_count << ' ' << pluraliser.m_label; + if( pluraliser.m_count != 1 ) + os << 's'; + return os; + } + +} +// end catch_string_manip.cpp +// start catch_stringref.cpp + +#include <algorithm> +#include <ostream> +#include <cstring> +#include <cstdint> + +namespace Catch { + StringRef::StringRef( char const* rawChars ) noexcept + : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) ) + {} + + auto StringRef::c_str() const -> char const* { + CATCH_ENFORCE(isNullTerminated(), "Called StringRef::c_str() on a non-null-terminated instance"); + return m_start; + } + auto StringRef::data() const noexcept -> char const* { + return m_start; + } + + auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef { + if (start < m_size) { + return StringRef(m_start + start, (std::min)(m_size - start, size)); + } else { + return StringRef(); + } + } + auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool { + return m_size == other.m_size + && (std::memcmp( m_start, other.m_start, m_size ) == 0); + } + + auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& { + return os.write(str.data(), str.size()); + } + + auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& { + lhs.append(rhs.data(), rhs.size()); + return lhs; + } + +} // namespace Catch +// end catch_stringref.cpp +// start catch_tag_alias.cpp + +namespace Catch { + TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {} +} +// end catch_tag_alias.cpp +// start catch_tag_alias_autoregistrar.cpp + +namespace Catch { + + RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) { + CATCH_TRY { + getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); + } CATCH_CATCH_ALL { + // Do not throw when constructing global objects, instead register the exception to be processed later + getMutableRegistryHub().registerStartupException(); + } + } + +} +// end catch_tag_alias_autoregistrar.cpp +// start catch_tag_alias_registry.cpp + +#include <sstream> + +namespace Catch { + + TagAliasRegistry::~TagAliasRegistry() {} + + TagAlias const* TagAliasRegistry::find( std::string const& alias ) const { + auto it = m_registry.find( alias ); + if( it != m_registry.end() ) + return &(it->second); + else + return nullptr; + } + + std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { + std::string expandedTestSpec = unexpandedTestSpec; + for( auto const& registryKvp : m_registry ) { + std::size_t pos = expandedTestSpec.find( registryKvp.first ); + if( pos != std::string::npos ) { + expandedTestSpec = expandedTestSpec.substr( 0, pos ) + + registryKvp.second.tag + + expandedTestSpec.substr( pos + registryKvp.first.size() ); + } + } + return expandedTestSpec; + } + + void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { + CATCH_ENFORCE( startsWith(alias, "[@") && endsWith(alias, ']'), + "error: tag alias, '" << alias << "' is not of the form [@alias name].\n" << lineInfo ); + + CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second, + "error: tag alias, '" << alias << "' already registered.\n" + << "\tFirst seen at: " << find(alias)->lineInfo << "\n" + << "\tRedefined at: " << lineInfo ); + } + + ITagAliasRegistry::~ITagAliasRegistry() {} + + ITagAliasRegistry const& ITagAliasRegistry::get() { + return getRegistryHub().getTagAliasRegistry(); + } + +} // end namespace Catch +// end catch_tag_alias_registry.cpp +// start catch_test_case_info.cpp + +#include <cctype> +#include <exception> +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace { + TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { + if( startsWith( tag, '.' ) || + tag == "!hide" ) + return TestCaseInfo::IsHidden; + else if( tag == "!throws" ) + return TestCaseInfo::Throws; + else if( tag == "!shouldfail" ) + return TestCaseInfo::ShouldFail; + else if( tag == "!mayfail" ) + return TestCaseInfo::MayFail; + else if( tag == "!nonportable" ) + return TestCaseInfo::NonPortable; + else if( tag == "!benchmark" ) + return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden ); + else + return TestCaseInfo::None; + } + bool isReservedTag( std::string const& tag ) { + return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) ); + } + void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { + CATCH_ENFORCE( !isReservedTag(tag), + "Tag name: [" << tag << "] is not allowed.\n" + << "Tag names starting with non alphanumeric characters are reserved\n" + << _lineInfo ); + } + } + + TestCase makeTestCase( ITestInvoker* _testCase, + std::string const& _className, + NameAndTags const& nameAndTags, + SourceLineInfo const& _lineInfo ) + { + bool isHidden = false; + + // Parse out tags + std::vector<std::string> tags; + std::string desc, tag; + bool inTag = false; + for (char c : nameAndTags.tags) { + if( !inTag ) { + if( c == '[' ) + inTag = true; + else + desc += c; + } + else { + if( c == ']' ) { + TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); + if( ( prop & TestCaseInfo::IsHidden ) != 0 ) + isHidden = true; + else if( prop == TestCaseInfo::None ) + enforceNotReservedTag( tag, _lineInfo ); + + // Merged hide tags like `[.approvals]` should be added as + // `[.][approvals]`. The `[.]` is added at later point, so + // we only strip the prefix + if (startsWith(tag, '.') && tag.size() > 1) { + tag.erase(0, 1); + } + tags.push_back( tag ); + tag.clear(); + inTag = false; + } + else + tag += c; + } + } + if( isHidden ) { + // Add all "hidden" tags to make them behave identically + tags.insert( tags.end(), { ".", "!hide" } ); + } + + TestCaseInfo info( static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo ); + return TestCase( _testCase, std::move(info) ); + } + + void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ) { + std::sort(begin(tags), end(tags)); + tags.erase(std::unique(begin(tags), end(tags)), end(tags)); + testCaseInfo.lcaseTags.clear(); + + for( auto const& tag : tags ) { + std::string lcaseTag = toLower( tag ); + testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); + testCaseInfo.lcaseTags.push_back( lcaseTag ); + } + testCaseInfo.tags = std::move(tags); + } + + TestCaseInfo::TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::vector<std::string> const& _tags, + SourceLineInfo const& _lineInfo ) + : name( _name ), + className( _className ), + description( _description ), + lineInfo( _lineInfo ), + properties( None ) + { + setTags( *this, _tags ); + } + + bool TestCaseInfo::isHidden() const { + return ( properties & IsHidden ) != 0; + } + bool TestCaseInfo::throws() const { + return ( properties & Throws ) != 0; + } + bool TestCaseInfo::okToFail() const { + return ( properties & (ShouldFail | MayFail ) ) != 0; + } + bool TestCaseInfo::expectedToFail() const { + return ( properties & (ShouldFail ) ) != 0; + } + + std::string TestCaseInfo::tagsAsString() const { + std::string ret; + // '[' and ']' per tag + std::size_t full_size = 2 * tags.size(); + for (const auto& tag : tags) { + full_size += tag.size(); + } + ret.reserve(full_size); + for (const auto& tag : tags) { + ret.push_back('['); + ret.append(tag); + ret.push_back(']'); + } + + return ret; + } + + TestCase::TestCase( ITestInvoker* testCase, TestCaseInfo&& info ) : TestCaseInfo( std::move(info) ), test( testCase ) {} + + TestCase TestCase::withName( std::string const& _newName ) const { + TestCase other( *this ); + other.name = _newName; + return other; + } + + void TestCase::invoke() const { + test->invoke(); + } + + bool TestCase::operator == ( TestCase const& other ) const { + return test.get() == other.test.get() && + name == other.name && + className == other.className; + } + + bool TestCase::operator < ( TestCase const& other ) const { + return name < other.name; + } + + TestCaseInfo const& TestCase::getTestCaseInfo() const + { + return *this; + } + +} // end namespace Catch +// end catch_test_case_info.cpp +// start catch_test_case_registry_impl.cpp + +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace { + struct TestHasher { + explicit TestHasher(Catch::SimplePcg32& rng) { + basis = rng(); + basis <<= 32; + basis |= rng(); + } + + uint64_t basis; + + uint64_t operator()(TestCase const& t) const { + // Modified FNV-1a hash + static constexpr uint64_t prime = 1099511628211; + uint64_t hash = basis; + for (const char c : t.name) { + hash ^= c; + hash *= prime; + } + return hash; + } + }; + } // end unnamed namespace + + std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) { + switch( config.runOrder() ) { + case RunTests::InDeclarationOrder: + // already in declaration order + break; + + case RunTests::InLexicographicalOrder: { + std::vector<TestCase> sorted = unsortedTestCases; + std::sort( sorted.begin(), sorted.end() ); + return sorted; + } + + case RunTests::InRandomOrder: { + seedRng( config ); + TestHasher h( rng() ); + + using hashedTest = std::pair<uint64_t, TestCase const*>; + std::vector<hashedTest> indexed_tests; + indexed_tests.reserve( unsortedTestCases.size() ); + + for (auto const& testCase : unsortedTestCases) { + indexed_tests.emplace_back(h(testCase), &testCase); + } + + std::sort(indexed_tests.begin(), indexed_tests.end(), + [](hashedTest const& lhs, hashedTest const& rhs) { + if (lhs.first == rhs.first) { + return lhs.second->name < rhs.second->name; + } + return lhs.first < rhs.first; + }); + + std::vector<TestCase> sorted; + sorted.reserve( indexed_tests.size() ); + + for (auto const& hashed : indexed_tests) { + sorted.emplace_back(*hashed.second); + } + + return sorted; + } + } + return unsortedTestCases; + } + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ) { + return !testCase.throws() || config.allowThrows(); + } + + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { + return testSpec.matches( testCase ) && isThrowSafe( testCase, config ); + } + + void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) { + std::set<TestCase> seenFunctions; + for( auto const& function : functions ) { + auto prev = seenFunctions.insert( function ); + CATCH_ENFORCE( prev.second, + "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" + << "\tRedefined at " << function.getTestCaseInfo().lineInfo ); + } + } + + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) { + std::vector<TestCase> filtered; + filtered.reserve( testCases.size() ); + for (auto const& testCase : testCases) { + if ((!testSpec.hasFilters() && !testCase.isHidden()) || + (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) { + filtered.push_back(testCase); + } + } + return filtered; + } + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) { + return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); + } + + void TestRegistry::registerTest( TestCase const& testCase ) { + std::string name = testCase.getTestCaseInfo().name; + if( name.empty() ) { + ReusableStringStream rss; + rss << "Anonymous test case " << ++m_unnamedCount; + return registerTest( testCase.withName( rss.str() ) ); + } + m_functions.push_back( testCase ); + } + + std::vector<TestCase> const& TestRegistry::getAllTests() const { + return m_functions; + } + std::vector<TestCase> const& TestRegistry::getAllTestsSorted( IConfig const& config ) const { + if( m_sortedFunctions.empty() ) + enforceNoDuplicateTestCases( m_functions ); + + if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { + m_sortedFunctions = sortTests( config, m_functions ); + m_currentSortOrder = config.runOrder(); + } + return m_sortedFunctions; + } + + /////////////////////////////////////////////////////////////////////////// + TestInvokerAsFunction::TestInvokerAsFunction( void(*testAsFunction)() ) noexcept : m_testAsFunction( testAsFunction ) {} + + void TestInvokerAsFunction::invoke() const { + m_testAsFunction(); + } + + std::string extractClassName( StringRef const& classOrQualifiedMethodName ) { + std::string className(classOrQualifiedMethodName); + if( startsWith( className, '&' ) ) + { + std::size_t lastColons = className.rfind( "::" ); + std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); + if( penultimateColons == std::string::npos ) + penultimateColons = 1; + className = className.substr( penultimateColons, lastColons-penultimateColons ); + } + return className; + } + +} // end namespace Catch +// end catch_test_case_registry_impl.cpp +// start catch_test_case_tracker.cpp + +#include <algorithm> +#include <cassert> +#include <stdexcept> +#include <memory> +#include <sstream> + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wexit-time-destructors" +#endif + +namespace Catch { +namespace TestCaseTracking { + + NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) + : name( _name ), + location( _location ) + {} + + ITracker::~ITracker() = default; + + ITracker& TrackerContext::startRun() { + m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr ); + m_currentTracker = nullptr; + m_runState = Executing; + return *m_rootTracker; + } + + void TrackerContext::endRun() { + m_rootTracker.reset(); + m_currentTracker = nullptr; + m_runState = NotStarted; + } + + void TrackerContext::startCycle() { + m_currentTracker = m_rootTracker.get(); + m_runState = Executing; + } + void TrackerContext::completeCycle() { + m_runState = CompletedCycle; + } + + bool TrackerContext::completedCycle() const { + return m_runState == CompletedCycle; + } + ITracker& TrackerContext::currentTracker() { + return *m_currentTracker; + } + void TrackerContext::setCurrentTracker( ITracker* tracker ) { + m_currentTracker = tracker; + } + + TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : m_nameAndLocation( nameAndLocation ), + m_ctx( ctx ), + m_parent( parent ) + {} + + NameAndLocation const& TrackerBase::nameAndLocation() const { + return m_nameAndLocation; + } + bool TrackerBase::isComplete() const { + return m_runState == CompletedSuccessfully || m_runState == Failed; + } + bool TrackerBase::isSuccessfullyCompleted() const { + return m_runState == CompletedSuccessfully; + } + bool TrackerBase::isOpen() const { + return m_runState != NotStarted && !isComplete(); + } + bool TrackerBase::hasChildren() const { + return !m_children.empty(); + } + + void TrackerBase::addChild( ITrackerPtr const& child ) { + m_children.push_back( child ); + } + + ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) { + auto it = std::find_if( m_children.begin(), m_children.end(), + [&nameAndLocation]( ITrackerPtr const& tracker ){ + return + tracker->nameAndLocation().location == nameAndLocation.location && + tracker->nameAndLocation().name == nameAndLocation.name; + } ); + return( it != m_children.end() ) + ? *it + : nullptr; + } + ITracker& TrackerBase::parent() { + assert( m_parent ); // Should always be non-null except for root + return *m_parent; + } + + void TrackerBase::openChild() { + if( m_runState != ExecutingChildren ) { + m_runState = ExecutingChildren; + if( m_parent ) + m_parent->openChild(); + } + } + + bool TrackerBase::isSectionTracker() const { return false; } + bool TrackerBase::isGeneratorTracker() const { return false; } + + void TrackerBase::open() { + m_runState = Executing; + moveToThis(); + if( m_parent ) + m_parent->openChild(); + } + + void TrackerBase::close() { + + // Close any still open children (e.g. generators) + while( &m_ctx.currentTracker() != this ) + m_ctx.currentTracker().close(); + + switch( m_runState ) { + case NeedsAnotherRun: + break; + + case Executing: + m_runState = CompletedSuccessfully; + break; + case ExecutingChildren: + if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) ) + m_runState = CompletedSuccessfully; + break; + + case NotStarted: + case CompletedSuccessfully: + case Failed: + CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState ); + + default: + CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState ); + } + moveToParent(); + m_ctx.completeCycle(); + } + void TrackerBase::fail() { + m_runState = Failed; + if( m_parent ) + m_parent->markAsNeedingAnotherRun(); + moveToParent(); + m_ctx.completeCycle(); + } + void TrackerBase::markAsNeedingAnotherRun() { + m_runState = NeedsAnotherRun; + } + + void TrackerBase::moveToParent() { + assert( m_parent ); + m_ctx.setCurrentTracker( m_parent ); + } + void TrackerBase::moveToThis() { + m_ctx.setCurrentTracker( this ); + } + + SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_trimmed_name(trim(nameAndLocation.name)) + { + if( parent ) { + while( !parent->isSectionTracker() ) + parent = &parent->parent(); + + SectionTracker& parentSection = static_cast<SectionTracker&>( *parent ); + addNextFilters( parentSection.m_filters ); + } + } + + bool SectionTracker::isComplete() const { + bool complete = true; + + if ((m_filters.empty() || m_filters[0] == "") + || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) { + complete = TrackerBase::isComplete(); + } + return complete; + } + + bool SectionTracker::isSectionTracker() const { return true; } + + SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { + std::shared_ptr<SectionTracker> section; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = std::static_pointer_cast<SectionTracker>( childTracker ); + } + else { + section = std::make_shared<SectionTracker>( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( section ); + } + if( !ctx.completedCycle() ) + section->tryOpen(); + return *section; + } + + void SectionTracker::tryOpen() { + if( !isComplete() ) + open(); + } + + void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) { + if( !filters.empty() ) { + m_filters.reserve( m_filters.size() + filters.size() + 2 ); + m_filters.emplace_back(""); // Root - should never be consulted + m_filters.emplace_back(""); // Test Case - not a section filter + m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + } + } + void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) { + if( filters.size() > 1 ) + m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); + } + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; + +} // namespace Catch + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif +// end catch_test_case_tracker.cpp +// start catch_test_registry.cpp + +namespace Catch { + + auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker* { + return new(std::nothrow) TestInvokerAsFunction( testAsFunction ); + } + + NameAndTags::NameAndTags( StringRef const& name_ , StringRef const& tags_ ) noexcept : name( name_ ), tags( tags_ ) {} + + AutoReg::AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept { + CATCH_TRY { + getMutableRegistryHub() + .registerTest( + makeTestCase( + invoker, + extractClassName( classOrMethod ), + nameAndTags, + lineInfo)); + } CATCH_CATCH_ALL { + // Do not throw when constructing global objects, instead register the exception to be processed later + getMutableRegistryHub().registerStartupException(); + } + } + + AutoReg::~AutoReg() = default; +} +// end catch_test_registry.cpp +// start catch_test_spec.cpp + +#include <algorithm> +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + TestSpec::Pattern::Pattern( std::string const& name ) + : m_name( name ) + {} + + TestSpec::Pattern::~Pattern() = default; + + std::string const& TestSpec::Pattern::name() const { + return m_name; + } + + TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString ) + : Pattern( filterString ) + , m_wildcardPattern( toLower( name ), CaseSensitive::No ) + {} + + bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const { + return m_wildcardPattern.matches( testCase.name ); + } + + TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString ) + : Pattern( filterString ) + , m_tag( toLower( tag ) ) + {} + + bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const { + return std::find(begin(testCase.lcaseTags), + end(testCase.lcaseTags), + m_tag) != end(testCase.lcaseTags); + } + + TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) + : Pattern( underlyingPattern->name() ) + , m_underlyingPattern( underlyingPattern ) + {} + + bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { + return !m_underlyingPattern->matches( testCase ); + } + + bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const { + return std::all_of( m_patterns.begin(), m_patterns.end(), [&]( PatternPtr const& p ){ return p->matches( testCase ); } ); + } + + std::string TestSpec::Filter::name() const { + std::string name; + for( auto const& p : m_patterns ) + name += p->name(); + return name; + } + + bool TestSpec::hasFilters() const { + return !m_filters.empty(); + } + + bool TestSpec::matches( TestCaseInfo const& testCase ) const { + return std::any_of( m_filters.begin(), m_filters.end(), [&]( Filter const& f ){ return f.matches( testCase ); } ); + } + + TestSpec::Matches TestSpec::matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const + { + Matches matches( m_filters.size() ); + std::transform( m_filters.begin(), m_filters.end(), matches.begin(), [&]( Filter const& filter ){ + std::vector<TestCase const*> currentMatches; + for( auto const& test : testCases ) + if( isThrowSafe( test, config ) && filter.matches( test ) ) + currentMatches.emplace_back( &test ); + return FilterMatch{ filter.name(), currentMatches }; + } ); + return matches; + } + + const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{ + return (m_invalidArgs); + } + +} +// end catch_test_spec.cpp +// start catch_test_spec_parser.cpp + +namespace Catch { + + TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} + + TestSpecParser& TestSpecParser::parse( std::string const& arg ) { + m_mode = None; + m_exclusion = false; + m_arg = m_tagAliases->expandAliases( arg ); + m_escapeChars.clear(); + m_substring.reserve(m_arg.size()); + m_patternName.reserve(m_arg.size()); + m_realPatternPos = 0; + + for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) + //if visitChar fails + if( !visitChar( m_arg[m_pos] ) ){ + m_testSpec.m_invalidArgs.push_back(arg); + break; + } + endMode(); + return *this; + } + TestSpec TestSpecParser::testSpec() { + addFilter(); + return m_testSpec; + } + bool TestSpecParser::visitChar( char c ) { + if( (m_mode != EscapedName) && (c == '\\') ) { + escape(); + addCharToPattern(c); + return true; + }else if((m_mode != EscapedName) && (c == ',') ) { + return separate(); + } + + switch( m_mode ) { + case None: + if( processNoneChar( c ) ) + return true; + break; + case Name: + processNameChar( c ); + break; + case EscapedName: + endMode(); + addCharToPattern(c); + return true; + default: + case Tag: + case QuotedName: + if( processOtherChar( c ) ) + return true; + break; + } + + m_substring += c; + if( !isControlChar( c ) ) { + m_patternName += c; + m_realPatternPos++; + } + return true; + } + // Two of the processing methods return true to signal the caller to return + // without adding the given character to the current pattern strings + bool TestSpecParser::processNoneChar( char c ) { + switch( c ) { + case ' ': + return true; + case '~': + m_exclusion = true; + return false; + case '[': + startNewMode( Tag ); + return false; + case '"': + startNewMode( QuotedName ); + return false; + default: + startNewMode( Name ); + return false; + } + } + void TestSpecParser::processNameChar( char c ) { + if( c == '[' ) { + if( m_substring == "exclude:" ) + m_exclusion = true; + else + endMode(); + startNewMode( Tag ); + } + } + bool TestSpecParser::processOtherChar( char c ) { + if( !isControlChar( c ) ) + return false; + m_substring += c; + endMode(); + return true; + } + void TestSpecParser::startNewMode( Mode mode ) { + m_mode = mode; + } + void TestSpecParser::endMode() { + switch( m_mode ) { + case Name: + case QuotedName: + return addNamePattern(); + case Tag: + return addTagPattern(); + case EscapedName: + revertBackToLastMode(); + return; + case None: + default: + return startNewMode( None ); + } + } + void TestSpecParser::escape() { + saveLastMode(); + m_mode = EscapedName; + m_escapeChars.push_back(m_realPatternPos); + } + bool TestSpecParser::isControlChar( char c ) const { + switch( m_mode ) { + default: + return false; + case None: + return c == '~'; + case Name: + return c == '['; + case EscapedName: + return true; + case QuotedName: + return c == '"'; + case Tag: + return c == '[' || c == ']'; + } + } + + void TestSpecParser::addFilter() { + if( !m_currentFilter.m_patterns.empty() ) { + m_testSpec.m_filters.push_back( m_currentFilter ); + m_currentFilter = TestSpec::Filter(); + } + } + + void TestSpecParser::saveLastMode() { + lastMode = m_mode; + } + + void TestSpecParser::revertBackToLastMode() { + m_mode = lastMode; + } + + bool TestSpecParser::separate() { + if( (m_mode==QuotedName) || (m_mode==Tag) ){ + //invalid argument, signal failure to previous scope. + m_mode = None; + m_pos = m_arg.size(); + m_substring.clear(); + m_patternName.clear(); + m_realPatternPos = 0; + return false; + } + endMode(); + addFilter(); + return true; //success + } + + std::string TestSpecParser::preprocessPattern() { + std::string token = m_patternName; + for (std::size_t i = 0; i < m_escapeChars.size(); ++i) + token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1); + m_escapeChars.clear(); + if (startsWith(token, "exclude:")) { + m_exclusion = true; + token = token.substr(8); + } + + m_patternName.clear(); + m_realPatternPos = 0; + + return token; + } + + void TestSpecParser::addNamePattern() { + auto token = preprocessPattern(); + + if (!token.empty()) { + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::NamePattern>(token, m_substring); + if (m_exclusion) + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + m_currentFilter.m_patterns.push_back(pattern); + } + m_substring.clear(); + m_exclusion = false; + m_mode = None; + } + + void TestSpecParser::addTagPattern() { + auto token = preprocessPattern(); + + if (!token.empty()) { + // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo]) + // we have to create a separate hide tag and shorten the real one + if (token.size() > 1 && token[0] == '.') { + token.erase(token.begin()); + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(".", m_substring); + if (m_exclusion) { + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + } + m_currentFilter.m_patterns.push_back(pattern); + } + + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(token, m_substring); + + if (m_exclusion) { + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + } + m_currentFilter.m_patterns.push_back(pattern); + } + m_substring.clear(); + m_exclusion = false; + m_mode = None; + } + + TestSpec parseTestSpec( std::string const& arg ) { + return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); + } + +} // namespace Catch +// end catch_test_spec_parser.cpp +// start catch_timer.cpp + +#include <chrono> + +static const uint64_t nanosecondsInSecond = 1000000000; + +namespace Catch { + + auto getCurrentNanosecondsSinceEpoch() -> uint64_t { + return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count(); + } + + namespace { + auto estimateClockResolution() -> uint64_t { + uint64_t sum = 0; + static const uint64_t iterations = 1000000; + + auto startTime = getCurrentNanosecondsSinceEpoch(); + + for( std::size_t i = 0; i < iterations; ++i ) { + + uint64_t ticks; + uint64_t baseTicks = getCurrentNanosecondsSinceEpoch(); + do { + ticks = getCurrentNanosecondsSinceEpoch(); + } while( ticks == baseTicks ); + + auto delta = ticks - baseTicks; + sum += delta; + + // If we have been calibrating for over 3 seconds -- the clock + // is terrible and we should move on. + // TBD: How to signal that the measured resolution is probably wrong? + if (ticks > startTime + 3 * nanosecondsInSecond) { + return sum / ( i + 1u ); + } + } + + // We're just taking the mean, here. To do better we could take the std. dev and exclude outliers + // - and potentially do more iterations if there's a high variance. + return sum/iterations; + } + } + auto getEstimatedClockResolution() -> uint64_t { + static auto s_resolution = estimateClockResolution(); + return s_resolution; + } + + void Timer::start() { + m_nanoseconds = getCurrentNanosecondsSinceEpoch(); + } + auto Timer::getElapsedNanoseconds() const -> uint64_t { + return getCurrentNanosecondsSinceEpoch() - m_nanoseconds; + } + auto Timer::getElapsedMicroseconds() const -> uint64_t { + return getElapsedNanoseconds()/1000; + } + auto Timer::getElapsedMilliseconds() const -> unsigned int { + return static_cast<unsigned int>(getElapsedMicroseconds()/1000); + } + auto Timer::getElapsedSeconds() const -> double { + return getElapsedMicroseconds()/1000000.0; + } + +} // namespace Catch +// end catch_timer.cpp +// start catch_tostring.cpp + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wexit-time-destructors" +# pragma clang diagnostic ignored "-Wglobal-constructors" +#endif + +// Enable specific decls locally +#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +#endif + +#include <cmath> +#include <iomanip> + +namespace Catch { + +namespace Detail { + + const std::string unprintableString = "{?}"; + + namespace { + const int hexThreshold = 255; + + struct Endianness { + enum Arch { Big, Little }; + + static Arch which() { + int one = 1; + // If the lowest byte we read is non-zero, we can assume + // that little endian format is used. + auto value = *reinterpret_cast<char*>(&one); + return value ? Little : Big; + } + }; + } + + std::string rawMemoryToString( const void *object, std::size_t size ) { + // Reverse order for little endian architectures + int i = 0, end = static_cast<int>( size ), inc = 1; + if( Endianness::which() == Endianness::Little ) { + i = end-1; + end = inc = -1; + } + + unsigned char const *bytes = static_cast<unsigned char const *>(object); + ReusableStringStream rss; + rss << "0x" << std::setfill('0') << std::hex; + for( ; i != end; i += inc ) + rss << std::setw(2) << static_cast<unsigned>(bytes[i]); + return rss.str(); + } +} + +template<typename T> +std::string fpToString( T value, int precision ) { + if (Catch::isnan(value)) { + return "nan"; + } + + ReusableStringStream rss; + rss << std::setprecision( precision ) + << std::fixed + << value; + std::string d = rss.str(); + std::size_t i = d.find_last_not_of( '0' ); + if( i != std::string::npos && i != d.size()-1 ) { + if( d[i] == '.' ) + i++; + d = d.substr( 0, i+1 ); + } + return d; +} + +//// ======================================================= //// +// +// Out-of-line defs for full specialization of StringMaker +// +//// ======================================================= //// + +std::string StringMaker<std::string>::convert(const std::string& str) { + if (!getCurrentContext().getConfig()->showInvisibles()) { + return '"' + str + '"'; + } + + std::string s("\""); + for (char c : str) { + switch (c) { + case '\n': + s.append("\\n"); + break; + case '\t': + s.append("\\t"); + break; + default: + s.push_back(c); + break; + } + } + s.append("\""); + return s; +} + +#ifdef CATCH_CONFIG_CPP17_STRING_VIEW +std::string StringMaker<std::string_view>::convert(std::string_view str) { + return ::Catch::Detail::stringify(std::string{ str }); +} +#endif + +std::string StringMaker<char const*>::convert(char const* str) { + if (str) { + return ::Catch::Detail::stringify(std::string{ str }); + } else { + return{ "{null string}" }; + } +} +std::string StringMaker<char*>::convert(char* str) { + if (str) { + return ::Catch::Detail::stringify(std::string{ str }); + } else { + return{ "{null string}" }; + } +} + +#ifdef CATCH_CONFIG_WCHAR +std::string StringMaker<std::wstring>::convert(const std::wstring& wstr) { + std::string s; + s.reserve(wstr.size()); + for (auto c : wstr) { + s += (c <= 0xff) ? static_cast<char>(c) : '?'; + } + return ::Catch::Detail::stringify(s); +} + +# ifdef CATCH_CONFIG_CPP17_STRING_VIEW +std::string StringMaker<std::wstring_view>::convert(std::wstring_view str) { + return StringMaker<std::wstring>::convert(std::wstring(str)); +} +# endif + +std::string StringMaker<wchar_t const*>::convert(wchar_t const * str) { + if (str) { + return ::Catch::Detail::stringify(std::wstring{ str }); + } else { + return{ "{null string}" }; + } +} +std::string StringMaker<wchar_t *>::convert(wchar_t * str) { + if (str) { + return ::Catch::Detail::stringify(std::wstring{ str }); + } else { + return{ "{null string}" }; + } +} +#endif + +#if defined(CATCH_CONFIG_CPP17_BYTE) +#include <cstddef> +std::string StringMaker<std::byte>::convert(std::byte value) { + return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value)); +} +#endif // defined(CATCH_CONFIG_CPP17_BYTE) + +std::string StringMaker<int>::convert(int value) { + return ::Catch::Detail::stringify(static_cast<long long>(value)); +} +std::string StringMaker<long>::convert(long value) { + return ::Catch::Detail::stringify(static_cast<long long>(value)); +} +std::string StringMaker<long long>::convert(long long value) { + ReusableStringStream rss; + rss << value; + if (value > Detail::hexThreshold) { + rss << " (0x" << std::hex << value << ')'; + } + return rss.str(); +} + +std::string StringMaker<unsigned int>::convert(unsigned int value) { + return ::Catch::Detail::stringify(static_cast<unsigned long long>(value)); +} +std::string StringMaker<unsigned long>::convert(unsigned long value) { + return ::Catch::Detail::stringify(static_cast<unsigned long long>(value)); +} +std::string StringMaker<unsigned long long>::convert(unsigned long long value) { + ReusableStringStream rss; + rss << value; + if (value > Detail::hexThreshold) { + rss << " (0x" << std::hex << value << ')'; + } + return rss.str(); +} + +std::string StringMaker<bool>::convert(bool b) { + return b ? "true" : "false"; +} + +std::string StringMaker<signed char>::convert(signed char value) { + if (value == '\r') { + return "'\\r'"; + } else if (value == '\f') { + return "'\\f'"; + } else if (value == '\n') { + return "'\\n'"; + } else if (value == '\t') { + return "'\\t'"; + } else if ('\0' <= value && value < ' ') { + return ::Catch::Detail::stringify(static_cast<unsigned int>(value)); + } else { + char chstr[] = "' '"; + chstr[1] = value; + return chstr; + } +} +std::string StringMaker<char>::convert(char c) { + return ::Catch::Detail::stringify(static_cast<signed char>(c)); +} +std::string StringMaker<unsigned char>::convert(unsigned char c) { + return ::Catch::Detail::stringify(static_cast<char>(c)); +} + +std::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) { + return "nullptr"; +} + +int StringMaker<float>::precision = 5; + +std::string StringMaker<float>::convert(float value) { + return fpToString(value, precision) + 'f'; +} + +int StringMaker<double>::precision = 10; + +std::string StringMaker<double>::convert(double value) { + return fpToString(value, precision); +} + +std::string ratio_string<std::atto>::symbol() { return "a"; } +std::string ratio_string<std::femto>::symbol() { return "f"; } +std::string ratio_string<std::pico>::symbol() { return "p"; } +std::string ratio_string<std::nano>::symbol() { return "n"; } +std::string ratio_string<std::micro>::symbol() { return "u"; } +std::string ratio_string<std::milli>::symbol() { return "m"; } + +} // end namespace Catch + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +// end catch_tostring.cpp +// start catch_totals.cpp + +namespace Catch { + + Counts Counts::operator - ( Counts const& other ) const { + Counts diff; + diff.passed = passed - other.passed; + diff.failed = failed - other.failed; + diff.failedButOk = failedButOk - other.failedButOk; + return diff; + } + + Counts& Counts::operator += ( Counts const& other ) { + passed += other.passed; + failed += other.failed; + failedButOk += other.failedButOk; + return *this; + } + + std::size_t Counts::total() const { + return passed + failed + failedButOk; + } + bool Counts::allPassed() const { + return failed == 0 && failedButOk == 0; + } + bool Counts::allOk() const { + return failed == 0; + } + + Totals Totals::operator - ( Totals const& other ) const { + Totals diff; + diff.assertions = assertions - other.assertions; + diff.testCases = testCases - other.testCases; + return diff; + } + + Totals& Totals::operator += ( Totals const& other ) { + assertions += other.assertions; + testCases += other.testCases; + return *this; + } + + Totals Totals::delta( Totals const& prevTotals ) const { + Totals diff = *this - prevTotals; + if( diff.assertions.failed > 0 ) + ++diff.testCases.failed; + else if( diff.assertions.failedButOk > 0 ) + ++diff.testCases.failedButOk; + else + ++diff.testCases.passed; + return diff; + } + +} +// end catch_totals.cpp +// start catch_uncaught_exceptions.cpp + +#include <exception> + +namespace Catch { + bool uncaught_exceptions() { +#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + return std::uncaught_exceptions() > 0; +#else + return std::uncaught_exception(); +#endif + } +} // end namespace Catch +// end catch_uncaught_exceptions.cpp +// start catch_version.cpp + +#include <ostream> + +namespace Catch { + + Version::Version + ( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + patchNumber( _patchNumber ), + branchName( _branchName ), + buildNumber( _buildNumber ) + {} + + std::ostream& operator << ( std::ostream& os, Version const& version ) { + os << version.majorVersion << '.' + << version.minorVersion << '.' + << version.patchNumber; + // branchName is never null -> 0th char is \0 if it is empty + if (version.branchName[0]) { + os << '-' << version.branchName + << '.' << version.buildNumber; + } + return os; + } + + Version const& libraryVersion() { + static Version version( 2, 12, 1, "", 0 ); + return version; + } + +} +// end catch_version.cpp +// start catch_wildcard_pattern.cpp + +namespace Catch { + + WildcardPattern::WildcardPattern( std::string const& pattern, + CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_pattern( normaliseString( pattern ) ) + { + if( startsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 1 ); + m_wildcard = WildcardAtStart; + } + if( endsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); + m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd ); + } + } + + bool WildcardPattern::matches( std::string const& str ) const { + switch( m_wildcard ) { + case NoWildcard: + return m_pattern == normaliseString( str ); + case WildcardAtStart: + return endsWith( normaliseString( str ), m_pattern ); + case WildcardAtEnd: + return startsWith( normaliseString( str ), m_pattern ); + case WildcardAtBothEnds: + return contains( normaliseString( str ), m_pattern ); + default: + CATCH_INTERNAL_ERROR( "Unknown enum" ); + } + } + + std::string WildcardPattern::normaliseString( std::string const& str ) const { + return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str ); + } +} +// end catch_wildcard_pattern.cpp +// start catch_xmlwriter.cpp + +#include <iomanip> +#include <type_traits> + +namespace Catch { + +namespace { + + size_t trailingBytes(unsigned char c) { + if ((c & 0xE0) == 0xC0) { + return 2; + } + if ((c & 0xF0) == 0xE0) { + return 3; + } + if ((c & 0xF8) == 0xF0) { + return 4; + } + CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); + } + + uint32_t headerValue(unsigned char c) { + if ((c & 0xE0) == 0xC0) { + return c & 0x1F; + } + if ((c & 0xF0) == 0xE0) { + return c & 0x0F; + } + if ((c & 0xF8) == 0xF0) { + return c & 0x07; + } + CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); + } + + void hexEscapeChar(std::ostream& os, unsigned char c) { + std::ios_base::fmtflags f(os.flags()); + os << "\\x" + << std::uppercase << std::hex << std::setfill('0') << std::setw(2) + << static_cast<int>(c); + os.flags(f); + } + + bool shouldNewline(XmlFormatting fmt) { + return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Newline)); + } + + bool shouldIndent(XmlFormatting fmt) { + return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Indent)); + } + +} // anonymous namespace + + XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) { + return static_cast<XmlFormatting>( + static_cast<std::underlying_type<XmlFormatting>::type>(lhs) | + static_cast<std::underlying_type<XmlFormatting>::type>(rhs) + ); + } + + XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) { + return static_cast<XmlFormatting>( + static_cast<std::underlying_type<XmlFormatting>::type>(lhs) & + static_cast<std::underlying_type<XmlFormatting>::type>(rhs) + ); + } + + XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat ) + : m_str( str ), + m_forWhat( forWhat ) + {} + + void XmlEncode::encodeTo( std::ostream& os ) const { + // Apostrophe escaping not necessary if we always use " to write attributes + // (see: http://www.w3.org/TR/xml/#syntax) + + for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) { + unsigned char c = m_str[idx]; + switch (c) { + case '<': os << "<"; break; + case '&': os << "&"; break; + + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']') + os << ">"; + else + os << c; + break; + + case '\"': + if (m_forWhat == ForAttributes) + os << """; + else + os << c; + break; + + default: + // Check for control characters and invalid utf-8 + + // Escape control characters in standard ascii + // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 + if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) { + hexEscapeChar(os, c); + break; + } + + // Plain ASCII: Write it to stream + if (c < 0x7F) { + os << c; + break; + } + + // UTF-8 territory + // Check if the encoding is valid and if it is not, hex escape bytes. + // Important: We do not check the exact decoded values for validity, only the encoding format + // First check that this bytes is a valid lead byte: + // This means that it is not encoded as 1111 1XXX + // Or as 10XX XXXX + if (c < 0xC0 || + c >= 0xF8) { + hexEscapeChar(os, c); + break; + } + + auto encBytes = trailingBytes(c); + // Are there enough bytes left to avoid accessing out-of-bounds memory? + if (idx + encBytes - 1 >= m_str.size()) { + hexEscapeChar(os, c); + break; + } + // The header is valid, check data + // The next encBytes bytes must together be a valid utf-8 + // This means: bitpattern 10XX XXXX and the extracted value is sane (ish) + bool valid = true; + uint32_t value = headerValue(c); + for (std::size_t n = 1; n < encBytes; ++n) { + unsigned char nc = m_str[idx + n]; + valid &= ((nc & 0xC0) == 0x80); + value = (value << 6) | (nc & 0x3F); + } + + if ( + // Wrong bit pattern of following bytes + (!valid) || + // Overlong encodings + (value < 0x80) || + (0x80 <= value && value < 0x800 && encBytes > 2) || + (0x800 < value && value < 0x10000 && encBytes > 3) || + // Encoded value out of range + (value >= 0x110000) + ) { + hexEscapeChar(os, c); + break; + } + + // If we got here, this is in fact a valid(ish) utf-8 sequence + for (std::size_t n = 0; n < encBytes; ++n) { + os << m_str[idx + n]; + } + idx += encBytes - 1; + break; + } + } + } + + std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { + xmlEncode.encodeTo( os ); + return os; + } + + XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt ) + : m_writer( writer ), + m_fmt(fmt) + {} + + XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept + : m_writer( other.m_writer ), + m_fmt(other.m_fmt) + { + other.m_writer = nullptr; + other.m_fmt = XmlFormatting::None; + } + XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept { + if ( m_writer ) { + m_writer->endElement(); + } + m_writer = other.m_writer; + other.m_writer = nullptr; + m_fmt = other.m_fmt; + other.m_fmt = XmlFormatting::None; + return *this; + } + + XmlWriter::ScopedElement::~ScopedElement() { + if (m_writer) { + m_writer->endElement(m_fmt); + } + } + + XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, XmlFormatting fmt ) { + m_writer->writeText( text, fmt ); + return *this; + } + + XmlWriter::XmlWriter( std::ostream& os ) : m_os( os ) + { + writeDeclaration(); + } + + XmlWriter::~XmlWriter() { + while (!m_tags.empty()) { + endElement(); + } + newlineIfNecessary(); + } + + XmlWriter& XmlWriter::startElement( std::string const& name, XmlFormatting fmt ) { + ensureTagClosed(); + newlineIfNecessary(); + if (shouldIndent(fmt)) { + m_os << m_indent; + m_indent += " "; + } + m_os << '<' << name; + m_tags.push_back( name ); + m_tagIsOpen = true; + applyFormatting(fmt); + return *this; + } + + XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name, XmlFormatting fmt ) { + ScopedElement scoped( this, fmt ); + startElement( name, fmt ); + return scoped; + } + + XmlWriter& XmlWriter::endElement(XmlFormatting fmt) { + m_indent = m_indent.substr(0, m_indent.size() - 2); + + if( m_tagIsOpen ) { + m_os << "/>"; + m_tagIsOpen = false; + } else { + newlineIfNecessary(); + if (shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << "</" << m_tags.back() << ">"; + } + m_os << std::flush; + applyFormatting(fmt); + m_tags.pop_back(); + return *this; + } + + XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) { + if( !name.empty() && !attribute.empty() ) + m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; + return *this; + } + + XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) { + m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; + return *this; + } + + XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) { + if( !text.empty() ){ + bool tagWasOpen = m_tagIsOpen; + ensureTagClosed(); + if (tagWasOpen && shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << XmlEncode( text ); + applyFormatting(fmt); + } + return *this; + } + + XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) { + ensureTagClosed(); + if (shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << "<!--" << text << "-->"; + applyFormatting(fmt); + return *this; + } + + void XmlWriter::writeStylesheetRef( std::string const& url ) { + m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n"; + } + + XmlWriter& XmlWriter::writeBlankLine() { + ensureTagClosed(); + m_os << '\n'; + return *this; + } + + void XmlWriter::ensureTagClosed() { + if( m_tagIsOpen ) { + m_os << '>' << std::flush; + newlineIfNecessary(); + m_tagIsOpen = false; + } + } + + void XmlWriter::applyFormatting(XmlFormatting fmt) { + m_needsNewline = shouldNewline(fmt); + } + + void XmlWriter::writeDeclaration() { + m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + } + + void XmlWriter::newlineIfNecessary() { + if( m_needsNewline ) { + m_os << std::endl; + m_needsNewline = false; + } + } +} +// end catch_xmlwriter.cpp +// start catch_reporter_bases.cpp + +#include <cstring> +#include <cfloat> +#include <cstdio> +#include <cassert> +#include <memory> + +namespace Catch { + void prepareExpandedExpression(AssertionResult& result) { + result.getExpandedExpression(); + } + + // Because formatting using c++ streams is stateful, drop down to C is required + // Alternatively we could use stringstream, but its performance is... not good. + std::string getFormattedDuration( double duration ) { + // Max exponent + 1 is required to represent the whole part + // + 1 for decimal point + // + 3 for the 3 decimal places + // + 1 for null terminator + const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; + char buffer[maxDoubleSize]; + + // Save previous errno, to prevent sprintf from overwriting it + ErrnoGuard guard; +#ifdef _MSC_VER + sprintf_s(buffer, "%.3f", duration); +#else + std::sprintf(buffer, "%.3f", duration); +#endif + return std::string(buffer); + } + + std::string serializeFilters( std::vector<std::string> const& container ) { + ReusableStringStream oss; + bool first = true; + for (auto&& filter : container) + { + if (!first) + oss << ' '; + else + first = false; + + oss << filter; + } + return oss.str(); + } + + TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) + :StreamingReporterBase(_config) {} + + std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() { + return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High }; + } + + void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} + + bool TestEventListenerBase::assertionEnded(AssertionStats const &) { + return false; + } + +} // end namespace Catch +// end catch_reporter_bases.cpp +// start catch_reporter_compact.cpp + +namespace { + +#ifdef CATCH_PLATFORM_MAC + const char* failedString() { return "FAILED"; } + const char* passedString() { return "PASSED"; } +#else + const char* failedString() { return "failed"; } + const char* passedString() { return "passed"; } +#endif + + // Colour::LightGrey + Catch::Colour::Code dimColour() { return Catch::Colour::FileName; } + + std::string bothOrAll( std::size_t count ) { + return count == 1 ? std::string() : + count == 2 ? "both " : "all " ; + } + +} // anon namespace + +namespace Catch { +namespace { +// Colour, message variants: +// - white: No tests ran. +// - red: Failed [both/all] N test cases, failed [both/all] M assertions. +// - white: Passed [both/all] N test cases (no assertions). +// - red: Failed N tests cases, failed M assertions. +// - green: Passed [both/all] N tests cases with M assertions. +void printTotals(std::ostream& out, const Totals& totals) { + if (totals.testCases.total() == 0) { + out << "No tests ran."; + } else if (totals.testCases.failed == totals.testCases.total()) { + Colour colour(Colour::ResultError); + const std::string qualify_assertions_failed = + totals.assertions.failed == totals.assertions.total() ? + bothOrAll(totals.assertions.failed) : std::string(); + out << + "Failed " << bothOrAll(totals.testCases.failed) + << pluralise(totals.testCases.failed, "test case") << ", " + "failed " << qualify_assertions_failed << + pluralise(totals.assertions.failed, "assertion") << '.'; + } else if (totals.assertions.total() == 0) { + out << + "Passed " << bothOrAll(totals.testCases.total()) + << pluralise(totals.testCases.total(), "test case") + << " (no assertions)."; + } else if (totals.assertions.failed) { + Colour colour(Colour::ResultError); + out << + "Failed " << pluralise(totals.testCases.failed, "test case") << ", " + "failed " << pluralise(totals.assertions.failed, "assertion") << '.'; + } else { + Colour colour(Colour::ResultSuccess); + out << + "Passed " << bothOrAll(totals.testCases.passed) + << pluralise(totals.testCases.passed, "test case") << + " with " << pluralise(totals.assertions.passed, "assertion") << '.'; + } +} + +// Implementation of CompactReporter formatting +class AssertionPrinter { +public: + AssertionPrinter& operator= (AssertionPrinter const&) = delete; + AssertionPrinter(AssertionPrinter const&) = delete; + AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) + : stream(_stream) + , result(_stats.assertionResult) + , messages(_stats.infoMessages) + , itMessage(_stats.infoMessages.begin()) + , printInfoMessages(_printInfoMessages) {} + + void print() { + printSourceInfo(); + + itMessage = messages.begin(); + + switch (result.getResultType()) { + case ResultWas::Ok: + printResultType(Colour::ResultSuccess, passedString()); + printOriginalExpression(); + printReconstructedExpression(); + if (!result.hasExpression()) + printRemainingMessages(Colour::None); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) + printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok")); + else + printResultType(Colour::Error, failedString()); + printOriginalExpression(); + printReconstructedExpression(); + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType(Colour::Error, failedString()); + printIssue("unexpected exception with message:"); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::FatalErrorCondition: + printResultType(Colour::Error, failedString()); + printIssue("fatal error condition with message:"); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType(Colour::Error, failedString()); + printIssue("expected exception, got none"); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType(Colour::None, "info"); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType(Colour::None, "warning"); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType(Colour::Error, failedString()); + printIssue("explicitly"); + printRemainingMessages(Colour::None); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType(Colour::Error, "** internal error **"); + break; + } + } + +private: + void printSourceInfo() const { + Colour colourGuard(Colour::FileName); + stream << result.getSourceInfo() << ':'; + } + + void printResultType(Colour::Code colour, std::string const& passOrFail) const { + if (!passOrFail.empty()) { + { + Colour colourGuard(colour); + stream << ' ' << passOrFail; + } + stream << ':'; + } + } + + void printIssue(std::string const& issue) const { + stream << ' ' << issue; + } + + void printExpressionWas() { + if (result.hasExpression()) { + stream << ';'; + { + Colour colour(dimColour()); + stream << " expression was:"; + } + printOriginalExpression(); + } + } + + void printOriginalExpression() const { + if (result.hasExpression()) { + stream << ' ' << result.getExpression(); + } + } + + void printReconstructedExpression() const { + if (result.hasExpandedExpression()) { + { + Colour colour(dimColour()); + stream << " for: "; + } + stream << result.getExpandedExpression(); + } + } + + void printMessage() { + if (itMessage != messages.end()) { + stream << " '" << itMessage->message << '\''; + ++itMessage; + } + } + + void printRemainingMessages(Colour::Code colour = dimColour()) { + if (itMessage == messages.end()) + return; + + const auto itEnd = messages.cend(); + const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd)); + + { + Colour colourGuard(colour); + stream << " with " << pluralise(N, "message") << ':'; + } + + while (itMessage != itEnd) { + // If this assertion is a warning ignore any INFO messages + if (printInfoMessages || itMessage->type != ResultWas::Info) { + printMessage(); + if (itMessage != itEnd) { + Colour colourGuard(dimColour()); + stream << " and"; + } + continue; + } + ++itMessage; + } + } + +private: + std::ostream& stream; + AssertionResult const& result; + std::vector<MessageInfo> messages; + std::vector<MessageInfo>::const_iterator itMessage; + bool printInfoMessages; +}; + +} // anon namespace + + std::string CompactReporter::getDescription() { + return "Reports test results on a single line, suitable for IDEs"; + } + + ReporterPreferences CompactReporter::getPreferences() const { + return m_reporterPrefs; + } + + void CompactReporter::noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } + + void CompactReporter::assertionStarting( AssertionInfo const& ) {} + + bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool printInfoMessages = true; + + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } + + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); + + stream << std::endl; + return true; + } + + void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { + if (m_config->showDurations() == ShowDurations::Always) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + } + + void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) { + printTotals( stream, _testRunStats.totals ); + stream << '\n' << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + CompactReporter::~CompactReporter() {} + + CATCH_REGISTER_REPORTER( "compact", CompactReporter ) + +} // end namespace Catch +// end catch_reporter_compact.cpp +// start catch_reporter_console.cpp + +#include <cfloat> +#include <cstdio> + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch + // Note that 4062 (not all labels are handled and default is missing) is enabled +#endif + +#if defined(__clang__) +# pragma clang diagnostic push +// For simplicity, benchmarking-only helpers are always enabled +# pragma clang diagnostic ignored "-Wunused-function" +#endif + +namespace Catch { + +namespace { + +// Formatter impl for ConsoleReporter +class ConsoleAssertionPrinter { +public: + ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete; + ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete; + ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) + : stream(_stream), + stats(_stats), + result(_stats.assertionResult), + colour(Colour::None), + message(result.getMessage()), + messages(_stats.infoMessages), + printInfoMessages(_printInfoMessages) { + switch (result.getResultType()) { + case ResultWas::Ok: + colour = Colour::Success; + passOrFail = "PASSED"; + //if( result.hasMessage() ) + if (_stats.infoMessages.size() == 1) + messageLabel = "with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "with messages"; + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) { + colour = Colour::Success; + passOrFail = "FAILED - but was ok"; + } else { + colour = Colour::Error; + passOrFail = "FAILED"; + } + if (_stats.infoMessages.size() == 1) + messageLabel = "with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "with messages"; + break; + case ResultWas::ThrewException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to unexpected exception with "; + if (_stats.infoMessages.size() == 1) + messageLabel += "message"; + if (_stats.infoMessages.size() > 1) + messageLabel += "messages"; + break; + case ResultWas::FatalErrorCondition: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to a fatal error condition"; + break; + case ResultWas::DidntThrowException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "because no exception was thrown where one was expected"; + break; + case ResultWas::Info: + messageLabel = "info"; + break; + case ResultWas::Warning: + messageLabel = "warning"; + break; + case ResultWas::ExplicitFailure: + passOrFail = "FAILED"; + colour = Colour::Error; + if (_stats.infoMessages.size() == 1) + messageLabel = "explicitly with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "explicitly with messages"; + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + passOrFail = "** internal error **"; + colour = Colour::Error; + break; + } + } + + void print() const { + printSourceInfo(); + if (stats.totals.assertions.total() > 0) { + printResultType(); + printOriginalExpression(); + printReconstructedExpression(); + } else { + stream << '\n'; + } + printMessage(); + } + +private: + void printResultType() const { + if (!passOrFail.empty()) { + Colour colourGuard(colour); + stream << passOrFail << ":\n"; + } + } + void printOriginalExpression() const { + if (result.hasExpression()) { + Colour colourGuard(Colour::OriginalExpression); + stream << " "; + stream << result.getExpressionInMacro(); + stream << '\n'; + } + } + void printReconstructedExpression() const { + if (result.hasExpandedExpression()) { + stream << "with expansion:\n"; + Colour colourGuard(Colour::ReconstructedExpression); + stream << Column(result.getExpandedExpression()).indent(2) << '\n'; + } + } + void printMessage() const { + if (!messageLabel.empty()) + stream << messageLabel << ':' << '\n'; + for (auto const& msg : messages) { + // If this assertion is a warning ignore any INFO messages + if (printInfoMessages || msg.type != ResultWas::Info) + stream << Column(msg.message).indent(2) << '\n'; + } + } + void printSourceInfo() const { + Colour colourGuard(Colour::FileName); + stream << result.getSourceInfo() << ": "; + } + + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + Colour::Code colour; + std::string passOrFail; + std::string messageLabel; + std::string message; + std::vector<MessageInfo> messages; + bool printInfoMessages; +}; + +std::size_t makeRatio(std::size_t number, std::size_t total) { + std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0; + return (ratio == 0 && number > 0) ? 1 : ratio; +} + +std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) { + if (i > j && i > k) + return i; + else if (j > k) + return j; + else + return k; +} + +struct ColumnInfo { + enum Justification { Left, Right }; + std::string name; + int width; + Justification justification; +}; +struct ColumnBreak {}; +struct RowBreak {}; + +class Duration { + enum class Unit { + Auto, + Nanoseconds, + Microseconds, + Milliseconds, + Seconds, + Minutes + }; + static const uint64_t s_nanosecondsInAMicrosecond = 1000; + static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond; + static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; + static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; + + double m_inNanoseconds; + Unit m_units; + +public: + explicit Duration(double inNanoseconds, Unit units = Unit::Auto) + : m_inNanoseconds(inNanoseconds), + m_units(units) { + if (m_units == Unit::Auto) { + if (m_inNanoseconds < s_nanosecondsInAMicrosecond) + m_units = Unit::Nanoseconds; + else if (m_inNanoseconds < s_nanosecondsInAMillisecond) + m_units = Unit::Microseconds; + else if (m_inNanoseconds < s_nanosecondsInASecond) + m_units = Unit::Milliseconds; + else if (m_inNanoseconds < s_nanosecondsInAMinute) + m_units = Unit::Seconds; + else + m_units = Unit::Minutes; + } + + } + + auto value() const -> double { + switch (m_units) { + case Unit::Microseconds: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond); + case Unit::Milliseconds: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond); + case Unit::Seconds: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond); + case Unit::Minutes: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute); + default: + return m_inNanoseconds; + } + } + auto unitsAsString() const -> std::string { + switch (m_units) { + case Unit::Nanoseconds: + return "ns"; + case Unit::Microseconds: + return "us"; + case Unit::Milliseconds: + return "ms"; + case Unit::Seconds: + return "s"; + case Unit::Minutes: + return "m"; + default: + return "** internal error **"; + } + + } + friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& { + return os << duration.value() << ' ' << duration.unitsAsString(); + } +}; +} // end anon namespace + +class TablePrinter { + std::ostream& m_os; + std::vector<ColumnInfo> m_columnInfos; + std::ostringstream m_oss; + int m_currentColumn = -1; + bool m_isOpen = false; + +public: + TablePrinter( std::ostream& os, std::vector<ColumnInfo> columnInfos ) + : m_os( os ), + m_columnInfos( std::move( columnInfos ) ) {} + + auto columnInfos() const -> std::vector<ColumnInfo> const& { + return m_columnInfos; + } + + void open() { + if (!m_isOpen) { + m_isOpen = true; + *this << RowBreak(); + + Columns headerCols; + Spacer spacer(2); + for (auto const& info : m_columnInfos) { + headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2)); + headerCols += spacer; + } + m_os << headerCols << '\n'; + + m_os << Catch::getLineOfChars<'-'>() << '\n'; + } + } + void close() { + if (m_isOpen) { + *this << RowBreak(); + m_os << std::endl; + m_isOpen = false; + } + } + + template<typename T> + friend TablePrinter& operator << (TablePrinter& tp, T const& value) { + tp.m_oss << value; + return tp; + } + + friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { + auto colStr = tp.m_oss.str(); + const auto strSize = colStr.size(); + tp.m_oss.str(""); + tp.open(); + if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) { + tp.m_currentColumn = -1; + tp.m_os << '\n'; + } + tp.m_currentColumn++; + + auto colInfo = tp.m_columnInfos[tp.m_currentColumn]; + auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width)) + ? std::string(colInfo.width - (strSize + 1), ' ') + : std::string(); + if (colInfo.justification == ColumnInfo::Left) + tp.m_os << colStr << padding << ' '; + else + tp.m_os << padding << colStr << ' '; + return tp; + } + + friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { + if (tp.m_currentColumn > 0) { + tp.m_os << '\n'; + tp.m_currentColumn = -1; + } + return tp; + } +}; + +ConsoleReporter::ConsoleReporter(ReporterConfig const& config) + : StreamingReporterBase(config), + m_tablePrinter(new TablePrinter(config.stream(), + [&config]() -> std::vector<ColumnInfo> { + if (config.fullConfig()->benchmarkNoAnalysis()) + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { " samples", 14, ColumnInfo::Right }, + { " iterations", 14, ColumnInfo::Right }, + { " mean", 14, ColumnInfo::Right } + }; + } + else + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { "samples mean std dev", 14, ColumnInfo::Right }, + { "iterations low mean low std dev", 14, ColumnInfo::Right }, + { "estimated high mean high std dev", 14, ColumnInfo::Right } + }; + } + }())) {} +ConsoleReporter::~ConsoleReporter() = default; + +std::string ConsoleReporter::getDescription() { + return "Reports test results as plain lines of text"; +} + +void ConsoleReporter::noMatchingTestCases(std::string const& spec) { + stream << "No test cases matched '" << spec << '\'' << std::endl; +} + +void ConsoleReporter::reportInvalidArguments(std::string const&arg){ + stream << "Invalid Filter: " << arg << std::endl; +} + +void ConsoleReporter::assertionStarting(AssertionInfo const&) {} + +bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + // Drop out if result was successful but we're not printing them. + if (!includeResults && result.getResultType() != ResultWas::Warning) + return false; + + lazyPrint(); + + ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults); + printer.print(); + stream << std::endl; + return true; +} + +void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) { + m_tablePrinter->close(); + m_headerPrinted = false; + StreamingReporterBase::sectionStarting(_sectionInfo); +} +void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { + m_tablePrinter->close(); + if (_sectionStats.missingAssertions) { + lazyPrint(); + Colour colour(Colour::ResultError); + if (m_sectionStack.size() > 1) + stream << "\nNo assertions in section"; + else + stream << "\nNo assertions in test case"; + stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; + } + if (m_config->showDurations() == ShowDurations::Always) { + stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + if (m_headerPrinted) { + m_headerPrinted = false; + } + StreamingReporterBase::sectionEnded(_sectionStats); +} + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +void ConsoleReporter::benchmarkPreparing(std::string const& name) { + lazyPrintWithoutClosingBenchmarkTable(); + + auto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2)); + + bool firstLine = true; + for (auto line : nameCol) { + if (!firstLine) + (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak(); + else + firstLine = false; + + (*m_tablePrinter) << line << ColumnBreak(); + } +} + +void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) { + (*m_tablePrinter) << info.samples << ColumnBreak() + << info.iterations << ColumnBreak(); + if (!m_config->benchmarkNoAnalysis()) + (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak(); +} +void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) { + if (m_config->benchmarkNoAnalysis()) + { + (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak(); + } + else + { + (*m_tablePrinter) << ColumnBreak() + << Duration(stats.mean.point.count()) << ColumnBreak() + << Duration(stats.mean.lower_bound.count()) << ColumnBreak() + << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak() + << Duration(stats.standardDeviation.point.count()) << ColumnBreak() + << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak() + << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak(); + } +} + +void ConsoleReporter::benchmarkFailed(std::string const& error) { + Colour colour(Colour::Red); + (*m_tablePrinter) + << "Benchmark failed (" << error << ')' + << ColumnBreak() << RowBreak(); +} +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) { + m_tablePrinter->close(); + StreamingReporterBase::testCaseEnded(_testCaseStats); + m_headerPrinted = false; +} +void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) { + if (currentGroupInfo.used) { + printSummaryDivider(); + stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; + printTotals(_testGroupStats.totals); + stream << '\n' << std::endl; + } + StreamingReporterBase::testGroupEnded(_testGroupStats); +} +void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) { + printTotalsDivider(_testRunStats.totals); + printTotals(_testRunStats.totals); + stream << std::endl; + StreamingReporterBase::testRunEnded(_testRunStats); +} +void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) { + StreamingReporterBase::testRunStarting(_testInfo); + printTestFilters(); +} + +void ConsoleReporter::lazyPrint() { + + m_tablePrinter->close(); + lazyPrintWithoutClosingBenchmarkTable(); +} + +void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() { + + if (!currentTestRunInfo.used) + lazyPrintRunInfo(); + if (!currentGroupInfo.used) + lazyPrintGroupInfo(); + + if (!m_headerPrinted) { + printTestCaseAndSectionHeader(); + m_headerPrinted = true; + } +} +void ConsoleReporter::lazyPrintRunInfo() { + stream << '\n' << getLineOfChars<'~'>() << '\n'; + Colour colour(Colour::SecondaryText); + stream << currentTestRunInfo->name + << " is a Catch v" << libraryVersion() << " host application.\n" + << "Run with -? for options\n\n"; + + if (m_config->rngSeed() != 0) + stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; + + currentTestRunInfo.used = true; +} +void ConsoleReporter::lazyPrintGroupInfo() { + if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) { + printClosedHeader("Group: " + currentGroupInfo->name); + currentGroupInfo.used = true; + } +} +void ConsoleReporter::printTestCaseAndSectionHeader() { + assert(!m_sectionStack.empty()); + printOpenHeader(currentTestCaseInfo->name); + + if (m_sectionStack.size() > 1) { + Colour colourGuard(Colour::Headers); + + auto + it = m_sectionStack.begin() + 1, // Skip first section (test case) + itEnd = m_sectionStack.end(); + for (; it != itEnd; ++it) + printHeaderString(it->name, 2); + } + + SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; + + stream << getLineOfChars<'-'>() << '\n'; + Colour colourGuard(Colour::FileName); + stream << lineInfo << '\n'; + stream << getLineOfChars<'.'>() << '\n' << std::endl; +} + +void ConsoleReporter::printClosedHeader(std::string const& _name) { + printOpenHeader(_name); + stream << getLineOfChars<'.'>() << '\n'; +} +void ConsoleReporter::printOpenHeader(std::string const& _name) { + stream << getLineOfChars<'-'>() << '\n'; + { + Colour colourGuard(Colour::Headers); + printHeaderString(_name); + } +} + +// if string has a : in first line will set indent to follow it on +// subsequent lines +void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) { + std::size_t i = _string.find(": "); + if (i != std::string::npos) + i += 2; + else + i = 0; + stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n'; +} + +struct SummaryColumn { + + SummaryColumn( std::string _label, Colour::Code _colour ) + : label( std::move( _label ) ), + colour( _colour ) {} + SummaryColumn addRow( std::size_t count ) { + ReusableStringStream rss; + rss << count; + std::string row = rss.str(); + for (auto& oldRow : rows) { + while (oldRow.size() < row.size()) + oldRow = ' ' + oldRow; + while (oldRow.size() > row.size()) + row = ' ' + row; + } + rows.push_back(row); + return *this; + } + + std::string label; + Colour::Code colour; + std::vector<std::string> rows; + +}; + +void ConsoleReporter::printTotals( Totals const& totals ) { + if (totals.testCases.total() == 0) { + stream << Colour(Colour::Warning) << "No tests ran\n"; + } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) { + stream << Colour(Colour::ResultSuccess) << "All tests passed"; + stream << " (" + << pluralise(totals.assertions.passed, "assertion") << " in " + << pluralise(totals.testCases.passed, "test case") << ')' + << '\n'; + } else { + + std::vector<SummaryColumn> columns; + columns.push_back(SummaryColumn("", Colour::None) + .addRow(totals.testCases.total()) + .addRow(totals.assertions.total())); + columns.push_back(SummaryColumn("passed", Colour::Success) + .addRow(totals.testCases.passed) + .addRow(totals.assertions.passed)); + columns.push_back(SummaryColumn("failed", Colour::ResultError) + .addRow(totals.testCases.failed) + .addRow(totals.assertions.failed)); + columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure) + .addRow(totals.testCases.failedButOk) + .addRow(totals.assertions.failedButOk)); + + printSummaryRow("test cases", columns, 0); + printSummaryRow("assertions", columns, 1); + } +} +void ConsoleReporter::printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row) { + for (auto col : cols) { + std::string value = col.rows[row]; + if (col.label.empty()) { + stream << label << ": "; + if (value != "0") + stream << value; + else + stream << Colour(Colour::Warning) << "- none -"; + } else if (value != "0") { + stream << Colour(Colour::LightGrey) << " | "; + stream << Colour(col.colour) + << value << ' ' << col.label; + } + } + stream << '\n'; +} + +void ConsoleReporter::printTotalsDivider(Totals const& totals) { + if (totals.testCases.total() > 0) { + std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total()); + std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total()); + std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total()); + while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1) + findMax(failedRatio, failedButOkRatio, passedRatio)++; + while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1) + findMax(failedRatio, failedButOkRatio, passedRatio)--; + + stream << Colour(Colour::Error) << std::string(failedRatio, '='); + stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '='); + if (totals.testCases.allPassed()) + stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '='); + else + stream << Colour(Colour::Success) << std::string(passedRatio, '='); + } else { + stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '='); + } + stream << '\n'; +} +void ConsoleReporter::printSummaryDivider() { + stream << getLineOfChars<'-'>() << '\n'; +} + +void ConsoleReporter::printTestFilters() { + if (m_config->testSpec().hasFilters()) { + Colour guard(Colour::BrightYellow); + stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n'; + } +} + +CATCH_REGISTER_REPORTER("console", ConsoleReporter) + +} // end namespace Catch + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif +// end catch_reporter_console.cpp +// start catch_reporter_junit.cpp + +#include <cassert> +#include <sstream> +#include <ctime> +#include <algorithm> + +namespace Catch { + + namespace { + std::string getCurrentTimestamp() { + // Beware, this is not reentrant because of backward compatibility issues + // Also, UTC only, again because of backward compatibility (%z is C++11) + time_t rawtime; + std::time(&rawtime); + auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &rawtime); +#else + std::tm* timeInfo; + timeInfo = std::gmtime(&rawtime); +#endif + + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + + std::string fileNameTag(const std::vector<std::string> &tags) { + auto it = std::find_if(begin(tags), + end(tags), + [] (std::string const& tag) {return tag.front() == '#'; }); + if (it != tags.end()) + return it->substr(1); + return std::string(); + } + } // anonymous namespace + + JunitReporter::JunitReporter( ReporterConfig const& _config ) + : CumulativeReporterBase( _config ), + xml( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + m_reporterPrefs.shouldReportAllAssertions = true; + } + + JunitReporter::~JunitReporter() {} + + std::string JunitReporter::getDescription() { + return "Reports test results in an XML format that looks like Ant's junitreport target"; + } + + void JunitReporter::noMatchingTestCases( std::string const& /*spec*/ ) {} + + void JunitReporter::testRunStarting( TestRunInfo const& runInfo ) { + CumulativeReporterBase::testRunStarting( runInfo ); + xml.startElement( "testsuites" ); + } + + void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) { + suiteTimer.start(); + stdOutForSuite.clear(); + stdErrForSuite.clear(); + unexpectedExceptions = 0; + CumulativeReporterBase::testGroupStarting( groupInfo ); + } + + void JunitReporter::testCaseStarting( TestCaseInfo const& testCaseInfo ) { + m_okToFail = testCaseInfo.okToFail(); + } + + bool JunitReporter::assertionEnded( AssertionStats const& assertionStats ) { + if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) + unexpectedExceptions++; + return CumulativeReporterBase::assertionEnded( assertionStats ); + } + + void JunitReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { + stdOutForSuite += testCaseStats.stdOut; + stdErrForSuite += testCaseStats.stdErr; + CumulativeReporterBase::testCaseEnded( testCaseStats ); + } + + void JunitReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { + double suiteTime = suiteTimer.getElapsedSeconds(); + CumulativeReporterBase::testGroupEnded( testGroupStats ); + writeGroup( *m_testGroups.back(), suiteTime ); + } + + void JunitReporter::testRunEndedCumulative() { + xml.endElement(); + } + + void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); + + TestGroupStats const& stats = groupNode.value; + xml.writeAttribute( "name", stats.groupInfo.name ); + xml.writeAttribute( "errors", unexpectedExceptions ); + xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); + xml.writeAttribute( "tests", stats.totals.assertions.total() ); + xml.writeAttribute( "hostname", "tbd" ); // !TBD + if( m_config->showDurations() == ShowDurations::Never ) + xml.writeAttribute( "time", "" ); + else + xml.writeAttribute( "time", suiteTime ); + xml.writeAttribute( "timestamp", getCurrentTimestamp() ); + + // Write properties if there are any + if (m_config->hasTestFilters() || m_config->rngSeed() != 0) { + auto properties = xml.scopedElement("properties"); + if (m_config->hasTestFilters()) { + xml.scopedElement("property") + .writeAttribute("name", "filters") + .writeAttribute("value", serializeFilters(m_config->getTestsOrTags())); + } + if (m_config->rngSeed() != 0) { + xml.scopedElement("property") + .writeAttribute("name", "random-seed") + .writeAttribute("value", m_config->rngSeed()); + } + } + + // Write test cases + for( auto const& child : groupNode.children ) + writeTestCase( *child ); + + xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), XmlFormatting::Newline ); + xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), XmlFormatting::Newline ); + } + + void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) { + TestCaseStats const& stats = testCaseNode.value; + + // All test cases have exactly one section - which represents the + // test case itself. That section may have 0-n nested sections + assert( testCaseNode.children.size() == 1 ); + SectionNode const& rootSection = *testCaseNode.children.front(); + + std::string className = stats.testInfo.className; + + if( className.empty() ) { + className = fileNameTag(stats.testInfo.tags); + if ( className.empty() ) + className = "global"; + } + + if ( !m_config->name().empty() ) + className = m_config->name() + "." + className; + + writeSection( className, "", rootSection ); + } + + void JunitReporter::writeSection( std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode ) { + std::string name = trim( sectionNode.stats.sectionInfo.name ); + if( !rootName.empty() ) + name = rootName + '/' + name; + + if( !sectionNode.assertions.empty() || + !sectionNode.stdOut.empty() || + !sectionNode.stdErr.empty() ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); + if( className.empty() ) { + xml.writeAttribute( "classname", name ); + xml.writeAttribute( "name", "root" ); + } + else { + xml.writeAttribute( "classname", className ); + xml.writeAttribute( "name", name ); + } + xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) ); + + writeAssertions( sectionNode ); + + if( !sectionNode.stdOut.empty() ) + xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), XmlFormatting::Newline ); + if( !sectionNode.stdErr.empty() ) + xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), XmlFormatting::Newline ); + } + for( auto const& childNode : sectionNode.childSections ) + if( className.empty() ) + writeSection( name, "", *childNode ); + else + writeSection( className, name, *childNode ); + } + + void JunitReporter::writeAssertions( SectionNode const& sectionNode ) { + for( auto const& assertion : sectionNode.assertions ) + writeAssertion( assertion ); + } + + void JunitReporter::writeAssertion( AssertionStats const& stats ) { + AssertionResult const& result = stats.assertionResult; + if( !result.isOk() ) { + std::string elementName; + switch( result.getResultType() ) { + case ResultWas::ThrewException: + case ResultWas::FatalErrorCondition: + elementName = "error"; + break; + case ResultWas::ExplicitFailure: + case ResultWas::ExpressionFailed: + case ResultWas::DidntThrowException: + elementName = "failure"; + break; + + // We should never see these here: + case ResultWas::Info: + case ResultWas::Warning: + case ResultWas::Ok: + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + elementName = "internalError"; + break; + } + + XmlWriter::ScopedElement e = xml.scopedElement( elementName ); + + xml.writeAttribute( "message", result.getExpression() ); + xml.writeAttribute( "type", result.getTestMacroName() ); + + ReusableStringStream rss; + if (stats.totals.assertions.total() > 0) { + rss << "FAILED" << ":\n"; + if (result.hasExpression()) { + rss << " "; + rss << result.getExpressionInMacro(); + rss << '\n'; + } + if (result.hasExpandedExpression()) { + rss << "with expansion:\n"; + rss << Column(result.getExpandedExpression()).indent(2) << '\n'; + } + } else { + rss << '\n'; + } + + if( !result.getMessage().empty() ) + rss << result.getMessage() << '\n'; + for( auto const& msg : stats.infoMessages ) + if( msg.type == ResultWas::Info ) + rss << msg.message << '\n'; + + rss << "at " << result.getSourceInfo(); + xml.writeText( rss.str(), XmlFormatting::Newline ); + } + } + + CATCH_REGISTER_REPORTER( "junit", JunitReporter ) + +} // end namespace Catch +// end catch_reporter_junit.cpp +// start catch_reporter_listening.cpp + +#include <cassert> + +namespace Catch { + + ListeningReporter::ListeningReporter() { + // We will assume that listeners will always want all assertions + m_preferences.shouldReportAllAssertions = true; + } + + void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) { + m_listeners.push_back( std::move( listener ) ); + } + + void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) { + assert(!m_reporter && "Listening reporter can wrap only 1 real reporter"); + m_reporter = std::move( reporter ); + m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut; + } + + ReporterPreferences ListeningReporter::getPreferences() const { + return m_preferences; + } + + std::set<Verbosity> ListeningReporter::getSupportedVerbosities() { + return std::set<Verbosity>{ }; + } + + void ListeningReporter::noMatchingTestCases( std::string const& spec ) { + for ( auto const& listener : m_listeners ) { + listener->noMatchingTestCases( spec ); + } + m_reporter->noMatchingTestCases( spec ); + } + + void ListeningReporter::reportInvalidArguments(std::string const&arg){ + for ( auto const& listener : m_listeners ) { + listener->reportInvalidArguments( arg ); + } + m_reporter->reportInvalidArguments( arg ); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void ListeningReporter::benchmarkPreparing( std::string const& name ) { + for (auto const& listener : m_listeners) { + listener->benchmarkPreparing(name); + } + m_reporter->benchmarkPreparing(name); + } + void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) { + for ( auto const& listener : m_listeners ) { + listener->benchmarkStarting( benchmarkInfo ); + } + m_reporter->benchmarkStarting( benchmarkInfo ); + } + void ListeningReporter::benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) { + for ( auto const& listener : m_listeners ) { + listener->benchmarkEnded( benchmarkStats ); + } + m_reporter->benchmarkEnded( benchmarkStats ); + } + + void ListeningReporter::benchmarkFailed( std::string const& error ) { + for (auto const& listener : m_listeners) { + listener->benchmarkFailed(error); + } + m_reporter->benchmarkFailed(error); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) { + for ( auto const& listener : m_listeners ) { + listener->testRunStarting( testRunInfo ); + } + m_reporter->testRunStarting( testRunInfo ); + } + + void ListeningReporter::testGroupStarting( GroupInfo const& groupInfo ) { + for ( auto const& listener : m_listeners ) { + listener->testGroupStarting( groupInfo ); + } + m_reporter->testGroupStarting( groupInfo ); + } + + void ListeningReporter::testCaseStarting( TestCaseInfo const& testInfo ) { + for ( auto const& listener : m_listeners ) { + listener->testCaseStarting( testInfo ); + } + m_reporter->testCaseStarting( testInfo ); + } + + void ListeningReporter::sectionStarting( SectionInfo const& sectionInfo ) { + for ( auto const& listener : m_listeners ) { + listener->sectionStarting( sectionInfo ); + } + m_reporter->sectionStarting( sectionInfo ); + } + + void ListeningReporter::assertionStarting( AssertionInfo const& assertionInfo ) { + for ( auto const& listener : m_listeners ) { + listener->assertionStarting( assertionInfo ); + } + m_reporter->assertionStarting( assertionInfo ); + } + + // The return value indicates if the messages buffer should be cleared: + bool ListeningReporter::assertionEnded( AssertionStats const& assertionStats ) { + for( auto const& listener : m_listeners ) { + static_cast<void>( listener->assertionEnded( assertionStats ) ); + } + return m_reporter->assertionEnded( assertionStats ); + } + + void ListeningReporter::sectionEnded( SectionStats const& sectionStats ) { + for ( auto const& listener : m_listeners ) { + listener->sectionEnded( sectionStats ); + } + m_reporter->sectionEnded( sectionStats ); + } + + void ListeningReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { + for ( auto const& listener : m_listeners ) { + listener->testCaseEnded( testCaseStats ); + } + m_reporter->testCaseEnded( testCaseStats ); + } + + void ListeningReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { + for ( auto const& listener : m_listeners ) { + listener->testGroupEnded( testGroupStats ); + } + m_reporter->testGroupEnded( testGroupStats ); + } + + void ListeningReporter::testRunEnded( TestRunStats const& testRunStats ) { + for ( auto const& listener : m_listeners ) { + listener->testRunEnded( testRunStats ); + } + m_reporter->testRunEnded( testRunStats ); + } + + void ListeningReporter::skipTest( TestCaseInfo const& testInfo ) { + for ( auto const& listener : m_listeners ) { + listener->skipTest( testInfo ); + } + m_reporter->skipTest( testInfo ); + } + + bool ListeningReporter::isMulti() const { + return true; + } + +} // end namespace Catch +// end catch_reporter_listening.cpp +// start catch_reporter_xml.cpp + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch + // Note that 4062 (not all labels are handled + // and default is missing) is enabled +#endif + +namespace Catch { + XmlReporter::XmlReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_xml(_config.stream()) + { + m_reporterPrefs.shouldRedirectStdOut = true; + m_reporterPrefs.shouldReportAllAssertions = true; + } + + XmlReporter::~XmlReporter() = default; + + std::string XmlReporter::getDescription() { + return "Reports test results as an XML document"; + } + + std::string XmlReporter::getStylesheetRef() const { + return std::string(); + } + + void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) { + m_xml + .writeAttribute( "filename", sourceInfo.file ) + .writeAttribute( "line", sourceInfo.line ); + } + + void XmlReporter::noMatchingTestCases( std::string const& s ) { + StreamingReporterBase::noMatchingTestCases( s ); + } + + void XmlReporter::testRunStarting( TestRunInfo const& testInfo ) { + StreamingReporterBase::testRunStarting( testInfo ); + std::string stylesheetRef = getStylesheetRef(); + if( !stylesheetRef.empty() ) + m_xml.writeStylesheetRef( stylesheetRef ); + m_xml.startElement( "Catch" ); + if( !m_config->name().empty() ) + m_xml.writeAttribute( "name", m_config->name() ); + if (m_config->testSpec().hasFilters()) + m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) ); + if( m_config->rngSeed() != 0 ) + m_xml.scopedElement( "Randomness" ) + .writeAttribute( "seed", m_config->rngSeed() ); + } + + void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) { + StreamingReporterBase::testGroupStarting( groupInfo ); + m_xml.startElement( "Group" ) + .writeAttribute( "name", groupInfo.name ); + } + + void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) { + StreamingReporterBase::testCaseStarting(testInfo); + m_xml.startElement( "TestCase" ) + .writeAttribute( "name", trim( testInfo.name ) ) + .writeAttribute( "description", testInfo.description ) + .writeAttribute( "tags", testInfo.tagsAsString() ); + + writeSourceInfo( testInfo.lineInfo ); + + if ( m_config->showDurations() == ShowDurations::Always ) + m_testCaseTimer.start(); + m_xml.ensureTagClosed(); + } + + void XmlReporter::sectionStarting( SectionInfo const& sectionInfo ) { + StreamingReporterBase::sectionStarting( sectionInfo ); + if( m_sectionDepth++ > 0 ) { + m_xml.startElement( "Section" ) + .writeAttribute( "name", trim( sectionInfo.name ) ); + writeSourceInfo( sectionInfo.lineInfo ); + m_xml.ensureTagClosed(); + } + } + + void XmlReporter::assertionStarting( AssertionInfo const& ) { } + + bool XmlReporter::assertionEnded( AssertionStats const& assertionStats ) { + + AssertionResult const& result = assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + if( includeResults || result.getResultType() == ResultWas::Warning ) { + // Print any info messages in <Info> tags. + for( auto const& msg : assertionStats.infoMessages ) { + if( msg.type == ResultWas::Info && includeResults ) { + m_xml.scopedElement( "Info" ) + .writeText( msg.message ); + } else if ( msg.type == ResultWas::Warning ) { + m_xml.scopedElement( "Warning" ) + .writeText( msg.message ); + } + } + } + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return true; + + // Print the expression if there is one. + if( result.hasExpression() ) { + m_xml.startElement( "Expression" ) + .writeAttribute( "success", result.succeeded() ) + .writeAttribute( "type", result.getTestMacroName() ); + + writeSourceInfo( result.getSourceInfo() ); + + m_xml.scopedElement( "Original" ) + .writeText( result.getExpression() ); + m_xml.scopedElement( "Expanded" ) + .writeText( result.getExpandedExpression() ); + } + + // And... Print a result applicable to each result type. + switch( result.getResultType() ) { + case ResultWas::ThrewException: + m_xml.startElement( "Exception" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::FatalErrorCondition: + m_xml.startElement( "FatalErrorCondition" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::Info: + m_xml.scopedElement( "Info" ) + .writeText( result.getMessage() ); + break; + case ResultWas::Warning: + // Warning will already have been written + break; + case ResultWas::ExplicitFailure: + m_xml.startElement( "Failure" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + default: + break; + } + + if( result.hasExpression() ) + m_xml.endElement(); + + return true; + } + + void XmlReporter::sectionEnded( SectionStats const& sectionStats ) { + StreamingReporterBase::sectionEnded( sectionStats ); + if( --m_sectionDepth > 0 ) { + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); + e.writeAttribute( "successes", sectionStats.assertions.passed ); + e.writeAttribute( "failures", sectionStats.assertions.failed ); + e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); + + m_xml.endElement(); + } + } + + void XmlReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { + StreamingReporterBase::testCaseEnded( testCaseStats ); + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); + e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); + + if( !testCaseStats.stdOut.empty() ) + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), XmlFormatting::Newline ); + if( !testCaseStats.stdErr.empty() ) + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), XmlFormatting::Newline ); + + m_xml.endElement(); + } + + void XmlReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { + StreamingReporterBase::testGroupEnded( testGroupStats ); + // TODO: Check testGroupStats.aborting and act accordingly. + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) + .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + + void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) { + StreamingReporterBase::testRunEnded( testRunStats ); + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testRunStats.totals.assertions.passed ) + .writeAttribute( "failures", testRunStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + m_xml.endElement(); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void XmlReporter::benchmarkPreparing(std::string const& name) { + m_xml.startElement("BenchmarkResults") + .writeAttribute("name", name); + } + + void XmlReporter::benchmarkStarting(BenchmarkInfo const &info) { + m_xml.writeAttribute("samples", info.samples) + .writeAttribute("resamples", info.resamples) + .writeAttribute("iterations", info.iterations) + .writeAttribute("clockResolution", info.clockResolution) + .writeAttribute("estimatedDuration", info.estimatedDuration) + .writeComment("All values in nano seconds"); + } + + void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) { + m_xml.startElement("mean") + .writeAttribute("value", benchmarkStats.mean.point.count()) + .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count()) + .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count()) + .writeAttribute("ci", benchmarkStats.mean.confidence_interval); + m_xml.endElement(); + m_xml.startElement("standardDeviation") + .writeAttribute("value", benchmarkStats.standardDeviation.point.count()) + .writeAttribute("lowerBound", benchmarkStats.standardDeviation.lower_bound.count()) + .writeAttribute("upperBound", benchmarkStats.standardDeviation.upper_bound.count()) + .writeAttribute("ci", benchmarkStats.standardDeviation.confidence_interval); + m_xml.endElement(); + m_xml.startElement("outliers") + .writeAttribute("variance", benchmarkStats.outlierVariance) + .writeAttribute("lowMild", benchmarkStats.outliers.low_mild) + .writeAttribute("lowSevere", benchmarkStats.outliers.low_severe) + .writeAttribute("highMild", benchmarkStats.outliers.high_mild) + .writeAttribute("highSevere", benchmarkStats.outliers.high_severe); + m_xml.endElement(); + m_xml.endElement(); + } + + void XmlReporter::benchmarkFailed(std::string const &error) { + m_xml.scopedElement("failed"). + writeAttribute("message", error); + m_xml.endElement(); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + CATCH_REGISTER_REPORTER( "xml", XmlReporter ) + +} // end namespace Catch + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif +// end catch_reporter_xml.cpp + +namespace Catch { + LeakDetector leakDetector; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_impl.hpp +#endif + +#ifdef CATCH_CONFIG_MAIN +// start catch_default_main.hpp + +#ifndef __OBJC__ + +#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) +// Standard C/C++ Win32 Unicode wmain entry point +extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { +#else +// Standard C/C++ main entry point +int main (int argc, char * argv[]) { +#endif + + return Catch::Session().run( argc, argv ); +} + +#else // __OBJC__ + +// Objective-C entry point +int main (int argc, char * const argv[]) { +#if !CATCH_ARC_ENABLED + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; +#endif + + Catch::registerTestMethods(); + int result = Catch::Session().run( argc, (char**)argv ); + +#if !CATCH_ARC_ENABLED + [pool drain]; +#endif + + return result; +} + +#endif // __OBJC__ + +// end catch_default_main.hpp +#endif + +#if !defined(CATCH_CONFIG_IMPL_ONLY) + +#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED +# undef CLARA_CONFIG_MAIN +#endif + +#if !defined(CATCH_CONFIG_DISABLE) +////// +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) + +#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr ) +#endif// CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ ) + +#define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) +#define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ ) + +#define CATCH_CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "CATCH_UNSCOPED_INFO", msg ) +#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE",__VA_ARGS__ ) + +#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) +#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#else +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#endif + +#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) +#define CATCH_STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__ , #__VA_ARGS__ ); CATCH_SUCCEED( #__VA_ARGS__ ) +#define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); CATCH_SUCCEED( #__VA_ARGS__ ) +#else +#define CATCH_STATIC_REQUIRE( ... ) CATCH_REQUIRE( __VA_ARGS__ ) +#define CATCH_STATIC_REQUIRE_FALSE( ... ) CATCH_REQUIRE_FALSE( __VA_ARGS__ ) +#endif + +// "BDD-style" convenience wrappers +#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#define CATCH_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) +#define CATCH_AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And given: " << desc ) +#define CATCH_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) +#define CATCH_AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And when: " << desc ) +#define CATCH_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) +#define CATCH_AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +#define CATCH_BENCHMARK(...) \ + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) +#define CATCH_BENCHMARK_ADVANCED(name) \ + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) + +#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ ) + +#define CHECK( ... ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) +#define CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ ) + +#define CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "UNSCOPED_INFO", msg ) +#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE",__VA_ARGS__ ) + +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) +#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__) +#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#else +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#endif + +#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) +#define STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ ) +#define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); SUCCEED( "!(" #__VA_ARGS__ ")" ) +#else +#define STATIC_REQUIRE( ... ) REQUIRE( __VA_ARGS__ ) +#define STATIC_REQUIRE_FALSE( ... ) REQUIRE_FALSE( __VA_ARGS__ ) +#endif + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) + +// "BDD-style" convenience wrappers +#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) + +#define GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) +#define AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And given: " << desc ) +#define WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) +#define AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And when: " << desc ) +#define THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) +#define AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +#define BENCHMARK(...) \ + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) +#define BENCHMARK_ADVANCED(name) \ + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +using Catch::Detail::Approx; + +#else // CATCH_CONFIG_DISABLE + +////// +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#define CATCH_REQUIRE( ... ) (void)(0) +#define CATCH_REQUIRE_FALSE( ... ) (void)(0) + +#define CATCH_REQUIRE_THROWS( ... ) (void)(0) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif// CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_REQUIRE_NOTHROW( ... ) (void)(0) + +#define CATCH_CHECK( ... ) (void)(0) +#define CATCH_CHECK_FALSE( ... ) (void)(0) +#define CATCH_CHECKED_IF( ... ) if (__VA_ARGS__) +#define CATCH_CHECKED_ELSE( ... ) if (!(__VA_ARGS__)) +#define CATCH_CHECK_NOFAIL( ... ) (void)(0) + +#define CATCH_CHECK_THROWS( ... ) (void)(0) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_CHECK_NOTHROW( ... ) (void)(0) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THAT( arg, matcher ) (void)(0) + +#define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define CATCH_INFO( msg ) (void)(0) +#define CATCH_UNSCOPED_INFO( msg ) (void)(0) +#define CATCH_WARN( msg ) (void)(0) +#define CATCH_CAPTURE( msg ) (void)(0) + +#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_METHOD_AS_TEST_CASE( method, ... ) +#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0) +#define CATCH_SECTION( ... ) +#define CATCH_DYNAMIC_SECTION( ... ) +#define CATCH_FAIL( ... ) (void)(0) +#define CATCH_FAIL_CHECK( ... ) (void)(0) +#define CATCH_SUCCEED( ... ) (void)(0) + +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#else +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) ) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#endif + +// "BDD-style" convenience wrappers +#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) +#define CATCH_GIVEN( desc ) +#define CATCH_AND_GIVEN( desc ) +#define CATCH_WHEN( desc ) +#define CATCH_AND_WHEN( desc ) +#define CATCH_THEN( desc ) +#define CATCH_AND_THEN( desc ) + +#define CATCH_STATIC_REQUIRE( ... ) (void)(0) +#define CATCH_STATIC_REQUIRE_FALSE( ... ) (void)(0) + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#define REQUIRE( ... ) (void)(0) +#define REQUIRE_FALSE( ... ) (void)(0) + +#define REQUIRE_THROWS( ... ) (void)(0) +#define REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0) +#define REQUIRE_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define REQUIRE_NOTHROW( ... ) (void)(0) + +#define CHECK( ... ) (void)(0) +#define CHECK_FALSE( ... ) (void)(0) +#define CHECKED_IF( ... ) if (__VA_ARGS__) +#define CHECKED_ELSE( ... ) if (!(__VA_ARGS__)) +#define CHECK_NOFAIL( ... ) (void)(0) + +#define CHECK_THROWS( ... ) (void)(0) +#define CHECK_THROWS_AS( expr, exceptionType ) (void)(0) +#define CHECK_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CHECK_NOTHROW( ... ) (void)(0) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THAT( arg, matcher ) (void)(0) + +#define REQUIRE_THAT( arg, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define INFO( msg ) (void)(0) +#define UNSCOPED_INFO( msg ) (void)(0) +#define WARN( msg ) (void)(0) +#define CAPTURE( msg ) (void)(0) + +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define METHOD_AS_TEST_CASE( method, ... ) +#define REGISTER_TEST_CASE( Function, ... ) (void)(0) +#define SECTION( ... ) +#define DYNAMIC_SECTION( ... ) +#define FAIL( ... ) (void)(0) +#define FAIL_CHECK( ... ) (void)(0) +#define SUCCEED( ... ) (void)(0) +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#else +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) ) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) ) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#endif + +#define STATIC_REQUIRE( ... ) (void)(0) +#define STATIC_REQUIRE_FALSE( ... ) (void)(0) + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) + +// "BDD-style" convenience wrappers +#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) + +#define GIVEN( desc ) +#define AND_GIVEN( desc ) +#define WHEN( desc ) +#define AND_WHEN( desc ) +#define THEN( desc ) +#define AND_THEN( desc ) + +using Catch::Detail::Approx; + +#endif + +#endif // ! CATCH_CONFIG_IMPL_ONLY + +// start catch_reenable_warnings.h + + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(pop) +# else +# pragma clang diagnostic pop +# endif +#elif defined __GNUC__ +# pragma GCC diagnostic pop +#endif + +// end catch_reenable_warnings.h +// end catch.hpp +#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + diff --git a/cpp/tests/experiment/array.cc b/cpp/tests/experiment/array.cc new file mode 100644 index 0000000000000000000000000000000000000000..6ad165720cbcf98e4cacc19683e48f13e10ac3d5 --- /dev/null +++ b/cpp/tests/experiment/array.cc @@ -0,0 +1,11 @@ +#include "array.hh" + +namespace experiment { + +void swap(Array& lhs, Array& rhs) noexcept { + using std::swap; + swap(lhs.arr_, rhs.arr_); + swap(lhs.size_, rhs.size_); +} + +} diff --git a/cpp/tests/experiment/array.hh b/cpp/tests/experiment/array.hh new file mode 100644 index 0000000000000000000000000000000000000000..e37bb2a724cdb80f1dcf13133c08a42df1752a30 --- /dev/null +++ b/cpp/tests/experiment/array.hh @@ -0,0 +1,96 @@ +#ifndef EXPERIMENT_ARRAY_HH_ +#define EXPERIMENT_ARRAY_HH_ + +#include <vector> +#include <string> +#include <iostream> + +namespace experiment { + +/** + * Array with c++11 move semantics for research purposes. + * + * @note Do not use this in real code. + */ +class Array { + public: + Array() : arr_{nullptr}, size_{0} { + std::cout << "default construct " << to_s() << "\n"; + } + + Array(std::initializer_list<int> l) + : arr_(new int[l.size()]{}) + , size_(l.size()) { + + std::copy(l.begin(), l.end(), arr_); + std::cout << "create list " << to_s() << "\n"; + } + + Array(const std::vector<int>& src) { + arr_ = new int[src.size()]{}; + size_ = src.size(); + std::copy(src.begin(), src.end(), arr_); + std::cout << "create " << to_s() << "\n"; + } + + Array(const Array& other) : arr_(new int[other.size_]{}), size_{other.size_} { + std::copy(other.arr_, other.arr_ + other.size_, arr_); + std::cout << "copy construct " << to_s() << "\n"; + } + + Array& operator=(const Array& other) { + Array tmp{other}; + swap(*this, tmp); + std::cout << "copy assign " << to_s() << "\n"; + return *this; + } + + Array(Array&& other) noexcept : arr_{other.arr_}, size_(other.size_) { + other.arr_ = nullptr; + other.size_ = 0; + std::cout << "move construct " << to_s() << "\n"; + } + + Array& operator=(Array&& other) noexcept { + swap(*this, other); + std::cout << "move assign " << to_s() << "\n"; + return *this; + } + + ~Array() { + std::cout << "destroy " << to_s() << "\n"; + if (arr_) { + delete [] arr_; + } + } + + std::string to_s() const { + std::string ret = std::to_string(intptr_t(this)) + " "; + if (!arr_) { + return ret; + } + + for (int i = 0; i < size_; i++) { + ret += std::to_string(arr_[i]) + " "; + } + + return ret; + } + + friend void swap(Array& lhs, Array& rhs) noexcept; + + private: + int* arr_; + int size_; +}; + +void swap(Array& lhs, Array& rhs) noexcept; + +//std::ostream& operator<<(std::ostream& o, const Array& arr) { +// o << arr.to_s(); +// return o; +//} + +} // namespace csandbox + +#endif diff --git a/cpp/tests/init_tests.cc b/cpp/tests/init_tests.cc new file mode 100644 index 0000000000000000000000000000000000000000..5a65d6b6b5f54924a8202147817972e0c3af3d99 --- /dev/null +++ b/cpp/tests/init_tests.cc @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include <catch2/catch.hpp> diff --git a/cpp/tests/integration/CMakeLists.txt b/cpp/tests/integration/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..885f35651888dbf67bbe1dfbd30a00ef915eaabc --- /dev/null +++ b/cpp/tests/integration/CMakeLists.txt @@ -0,0 +1,40 @@ +include_directories( + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/proto/cpp +) + +list(APPEND tests_src + ../init_tests.cc + + integration_test.cc +) +add_executable(integration_test ${tests_src}) + +target_link_libraries(integration_test + vereign + fmt::fmt + vereignproto + gRPC::grpc++_reflection + gRPC::grpc++ +) + +add_test( + NAME integration_test + COMMAND integration_test +) + +list(APPEND INIT_INTEGRATION_TEST_STORAGE_SRC + ../vereign/test/device.cc + ../vereign/test/service_context.cc + + init_integration_test_storage.cc +) + +add_executable(init_integration_test_storage ${INIT_INTEGRATION_TEST_STORAGE_SRC}) + +target_link_libraries(init_integration_test_storage + vereignlib + Threads::Threads +) + diff --git a/cpp/tests/integration/init_integration_test_storage.cc b/cpp/tests/integration/init_integration_test_storage.cc new file mode 100644 index 0000000000000000000000000000000000000000..ff234034cd50f576d43b70263a48f724013b4292 --- /dev/null +++ b/cpp/tests/integration/init_integration_test_storage.cc @@ -0,0 +1,34 @@ +#include <vereign/fs/util.hh> +#include <vereign/fs/path.hh> +#include <vereign/fs/operations.hh> +#include <vereign/test/device.hh> +#include <vereign/test/service_context.hh> +#include <util/env.hh> + +using namespace vereign; + +/** + * The init_integration_test_storage tool is used for creating a new device with + * initialized storage at ${HOME}/vereign_integration_test dir. + * + * FIXME: create a command line utility for this and other commands like starting a gRPC + * server for integration tests. + */ +auto main(int argc, char** argv) -> int { + boost::ignore_unused(argc); + boost::ignore_unused(argv); + + auto public_key = test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + auto storage_path = test::GetEnv("TEST_VEREIGN_INTEGRATION_STORAGE", ""); + auto pin = test::GetEnv("TEST_VEREIGN_PIN", "foo"); + + if (storage_path == "") { + storage_path = fs::path::Join(fs::HomePath(), "vereign_integration_test"); + } + + fs::CreateDir(storage_path); + + test::PrepareNewDevice(host, port, public_key, pin, storage_path); +} diff --git a/cpp/tests/integration/integration_test.cc b/cpp/tests/integration/integration_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..e3db4498e0af99e6d0e70d425f56ee9a55933a91 --- /dev/null +++ b/cpp/tests/integration/integration_test.cc @@ -0,0 +1,152 @@ +#include <vereign/vereign.h> + +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/client_library/passport_api.gen.grpc.pb.h> +#include <vereign/client_library/identity_api.gen.grpc.pb.h> +#include <vereign/core/scope_guard.hh> +#include <util/env.hh> + +#include <grpcpp/create_channel.h> +#include <catch2/catch.hpp> + +TEST_CASE("C API integration", "[.integration]") { + // NOTE: use the init_integration_storage tool to create a new test storage + auto storage_path = vereign::test::RequireEnv("TEST_VEREIGN_INTEGRATION_STORAGE"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + auto pin = vereign::test::GetEnv("TEST_VEREIGN_PIN", "foo"); + + // start the service + vereign_error* err = nullptr; + auto service = vereign_service_start( + "localhost:", + host.data(), + port.data(), + storage_path.data(), + &err + ); + CHECK(service != nullptr); + CHECK(err == nullptr); + auto on_exit = vereign::core::MakeScopeGuard([service] { + vereign_service_shutdown(service); + }); + + int listen_port = vereign_service_selected_port(service); + + // start using the gRPC API with a C++ gRPC client. + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(listen_port), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + login_req.set_pin(pin); + auto login_resp = vereign::client_library::EmptyResponse{}; + ::grpc::ClientContext login_ctx; + auto status = identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + REQUIRE(status.error_message() == ""); + REQUIRE(status.ok() == true); + REQUIRE(login_resp.error() == ""); + CHECK(login_resp.status() == "OK"); + CHECK(login_resp.code() == "200"); + + auto client = vereign::client_library::PassportAPI::NewStub(channel); + + vereign::client_library::ListPassportsForm req; + vereign::client_library::ListPassportsFormResponse resp; + ::grpc::ClientContext ctx; + status = client->ListPassports(&ctx, req, &resp); + + // std::cout << vereign::test::ProtobufToJson(resp) << std::endl; + + REQUIRE(status.error_message() == ""); + REQUIRE(resp.error() == ""); + CHECK(resp.status() == "OK"); + CHECK(resp.code() == "200"); + CHECK(resp.data().size() > 0); + for (auto& passport : resp.data()) { + CHECK(passport.uuid().size() == 36); + } + + vereign::client_library::GetInteractionsForm getInterReq; + getInterReq.set_uuid(resp.data().at(0).uuid()); + vereign::client_library::GetInteractionsFormResponse getInterResp; + ::grpc::ClientContext getInterCtx; + status = client->GetInteractions(&getInterCtx, getInterReq, &getInterResp); + CHECK(status.error_message() == ""); + CHECK(getInterResp.error() == ""); + CHECK(getInterResp.status() == "OK"); + CHECK(getInterResp.code() == "200"); + for (auto& interaction : getInterResp.data()) { + CHECK(interaction.subject().size() > 0); + CHECK(interaction.passport().size() == 36); + } + + // std::cout << vereign::test::ProtobufToJson(getDIDsResp) << std::endl; + + grpc_shutdown(); + google::protobuf::ShutdownProtobufLibrary(); +} + +TEST_CASE("vereign_service_start") { + SECTION("success") { + vereign_error* err = nullptr; + auto service = vereign_service_start( + "localhost:", + "", + "", + "", + &err + ); + + CHECK(service != nullptr); + CHECK(err == nullptr); + + vereign_service_shutdown(service); + } + + SECTION("invalid listen address") { + vereign_error* err = nullptr; + auto service = vereign_service_start( + "##$$", + "", + "", + "", + &err + ); + + CHECK(service == nullptr); + CHECK(err != nullptr); + CHECK(vereign_error_code(err) == VEREIGN_ERR_GRPC_BIND_FAILED); + std::string error_message = vereign_error_message(err); + CHECK(error_message == "gRPC listen failed"); + + vereign_error_free(err); + vereign_service_shutdown(service); + } +} + +TEST_CASE("vereign_service_selected_port") { + vereign_error* err = nullptr; + auto service = vereign_service_start( + "localhost:", + "", + "", + "", + &err + ); + + REQUIRE(service != nullptr); + REQUIRE(err == nullptr); + + auto port = vereign_service_selected_port(service); + CHECK((port > 0 && port <= 65535)); + + vereign_service_shutdown(service); +} + +TEST_CASE("vereign_service_shutdown") { + // shutdown must not fail with nullptr + vereign_service_shutdown(nullptr); +} diff --git a/cpp/tests/protobuf/CMakeLists.txt b/cpp/tests/protobuf/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..a23b8ac172bb5a4ec1eee0e84fbaed4bc70623b1 --- /dev/null +++ b/cpp/tests/protobuf/CMakeLists.txt @@ -0,0 +1,36 @@ + +# Proto file +get_filename_component(_proto "proto/messages.proto" ABSOLUTE) +get_filename_component(_proto_path "${_proto}" PATH) + +# Generated sources +set(_grpc_gen_dir "${CMAKE_SOURCE_DIR}/tests/protobuf/testpb") +set(_proto_src "${_grpc_gen_dir}/messages.pb.cc") +set(_proto_hdr "${_grpc_gen_dir}/messages.pb.h") +add_custom_command( + OUTPUT "${_proto_src}" "${_proto_hdr}" + COMMAND ${PROTOBUF_PROTOC} + ARGS + --cpp_out "${_grpc_gen_dir}" + -I "${_proto_path}" + "${_proto}" + DEPENDS "${_proto}") + +include_directories( + "./" +) + +list(APPEND protobuf_src + ../init_tests.cc + ${_proto_src} + json_test.cc +) +add_executable(protobuf_tests ${protobuf_src}) +target_link_libraries(protobuf_tests ${LIBS} + PRIVATE protobuf::libprotobuf +) + +add_test( + NAME protobuf_tests + COMMAND protobuf_tests +) diff --git a/cpp/tests/protobuf/json_test.cc b/cpp/tests/protobuf/json_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..9fbc9988807257b0e8b1cbafdab696a4ed2f28ab --- /dev/null +++ b/cpp/tests/protobuf/json_test.cc @@ -0,0 +1,338 @@ +#include <catch2/catch.hpp> +#include <google/protobuf/util/json_util.h> +#include <testpb/messages.pb.h> + +TEST_CASE("simple struct", "[protobuf]") { + auto json = R"( +{ + "int_value": 9223372036854775807, + "string_value": "foo bar", + "int_arr": [4, 2], + "string_arr": ["foo", "bar", "baz"], + "int_map": { + "42": 4, + "72": 2, + }, + "string_map": { + "foo": "foo_value", + "bar": "bar_value" + }, + "double_value": 42 +} +)"; + + testproto::SimpleStruct msg; + + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(msg.string_value() == "foo bar"); + CHECK(msg.int_value() == 9223372036854775807); + CHECK(msg.int_arr().size() == 2); + CHECK(msg.int_arr().Get(0) == 4); + CHECK(msg.int_arr().Get(1) == 2); + + CHECK(msg.string_arr().size() == 3); + std::vector<std::string> expected{"foo", "bar", "baz"}; + CHECK( + std::equal( + msg.string_arr().begin(), msg.string_arr().end(), + expected.begin(), expected.end() + ) + ); + + CHECK(msg.int_map_size() == 2); + CHECK(msg.int_map().at(42) == 4); + CHECK(msg.int_map().at(72) == 2); + + CHECK(msg.string_map_size() == 2); + CHECK(msg.string_map().at("foo") == "foo_value"); + CHECK(msg.string_map().at("bar") == "bar_value"); + CHECK(msg.double_value() == 42); +} + +TEST_CASE("unmarshal bytes", "[protobuf]") { + auto json = R"( +{ + "bytes_value": "AEJmb29iYXI=", +} +)"; + + testproto::BytesType msg; + + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + using namespace std::string_literals; + CHECK(msg.bytes_value() == "\x00\x42"s "foobar"); +} + +TEST_CASE("two dimensional array", "[protobuf]") { + auto json = R"( +{ + arr: [ + { + str_arr: ["foo", "bar"] + } + ] +} +)"; + + testproto::TwoDimensionalArray msg; + + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + REQUIRE(msg.arr().size() == 1); + REQUIRE(msg.arr().at(0).str_arr().size() == 2); + REQUIRE(msg.arr().at(0).str_arr().at(0) == "foo"); + REQUIRE(msg.arr().at(0).str_arr().at(1) == "bar"); +} + +TEST_CASE("invalid json", "[protobuf]") { + auto json = R"( +{ + "string_value": invalid, +} +)"; + + testproto::SimpleStruct msg; + + google::protobuf::util::JsonParseOptions options; + auto status = JsonStringToMessage(json, &msg, options); + + REQUIRE_FALSE(status.ok()); +} + +TEST_CASE("null/missing integer value", "[protobuf]") { + auto json = R"( +{ + "int_value": null, + "string_value": "foo bar", +} +)"; + + google::protobuf::util::JsonParseOptions options; + + testproto::SimpleStruct msg; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + REQUIRE(status.ok()); + REQUIRE(msg.string_value() == "foo bar"); + REQUIRE(msg.int_value() == 0); + + json = R"( +{ + "string_value": "foo bar", +} +)"; + + msg = testproto::SimpleStruct{}; + status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + REQUIRE(status.ok()); + REQUIRE(msg.string_value() == "foo bar"); + REQUIRE(msg.int_value() == 0); +} + +TEST_CASE("json marshal double", "[protobuf]") { + testproto::SimpleStruct msg; + msg.set_double_value(42); + + std::string json; + google::protobuf::util::JsonOptions options; + options.add_whitespace = true; + options.preserve_proto_field_names = true; + options.always_print_enums_as_ints = true; + auto status = google::protobuf::util::MessageToJsonString(msg, &json, options); + auto expected = R"({ + "double_value": 42 +} +)"; + + REQUIRE(json == expected); +} + +TEST_CASE("json marshal uint64", "[protobuf]") { + testproto::SimpleStruct msg; + msg.set_uint64_value(42); + + std::string json; + google::protobuf::util::JsonOptions options; + options.add_whitespace = true; + options.preserve_proto_field_names = true; + options.always_print_enums_as_ints = true; + auto status = google::protobuf::util::MessageToJsonString(msg, &json, options); + auto expected = R"({ + "uint64_value": "42" +} +)"; + + REQUIRE(json == expected); +} + +TEST_CASE("json marshal naming", "[protobuf]") { + testproto::JsonNaming msg; + msg.set_foo_value(1); + msg.set_barvalue(2); + msg.set_bazvalue(3); + msg.set_qux_value(4); + + std::string json; + google::protobuf::util::JsonOptions options; + options.add_whitespace = true; + options.preserve_proto_field_names = true; + options.always_print_primitive_fields = true; + options.always_print_enums_as_ints = true; + auto status = google::protobuf::util::MessageToJsonString(msg, &json, options); + auto expected = R"({ + "foo_value": 1, + "barValue": 2, + "BazValue": 3, + "quX_Value": 4 +} +)"; + + REQUIRE(json == expected); +} + +TEST_CASE("json unmarshal naming", "[protobuf]") { + SECTION("accept snake case") { + auto json = R"( +{ + "quX_Value": 42, +} +)"; + + testproto::JsonNaming msg; + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(msg.qux_value() == 42); + } + + SECTION("accept camelCase case") { + auto json = R"( +{ + "barValue": 42, +} +)"; + + testproto::JsonNaming msg; + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(msg.barvalue() == 42); + } + + SECTION("accept CamelCase case") { + auto json = R"( +{ + "BazValue": 42, +} +)"; + + testproto::JsonNaming msg; + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(msg.bazvalue() == 42); + } +} + +TEST_CASE("oneof unmarshal", "[protobuf]") { + SECTION("accept string value") { + auto json = R"( +{ + "string_value": "foo bar", +} + )"; + + testproto::OneofValue msg; + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(msg.data_case() == testproto::OneofValue::kStringValue); + CHECK_FALSE(msg.has_struct_value()); + CHECK(msg.string_value() == "foo bar"); + } + + SECTION("accept struct value") { + auto json = R"( +{ + "struct_value": { + "int_value": 42 + } +} + )"; + + testproto::OneofValue msg; + google::protobuf::util::JsonParseOptions options; + auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options); + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(msg.data_case() == testproto::OneofValue::kStructValue); + CHECK(msg.has_struct_value()); + CHECK(msg.struct_value().int_value() == 42); + } +} + +TEST_CASE("oneof marshal", "[protobuf]") { + SECTION("marshal string value") { + testproto::OneofValue msg; + msg.set_string_value("foo bar"); + google::protobuf::util::JsonPrintOptions options; + options.preserve_proto_field_names = true; + std::string json; + auto status = google::protobuf::util::MessageToJsonString(msg, &json, options); + + auto expected = R"({"string_value":"foo bar"})"; + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(json == expected); + } + + SECTION("marshal struct value") { + testproto::OneofValue msg; + msg.mutable_struct_value()->set_int_value(42); + google::protobuf::util::JsonPrintOptions options; + options.preserve_proto_field_names = true; + std::string json; + auto status = google::protobuf::util::MessageToJsonString(msg, &json, options); + + auto expected = R"({"struct_value":{"int_value":"42"}})"; + + CHECK(status.error_message() == ""); + REQUIRE(status.ok()); + CHECK(json == expected); + } + +} + +TEST_CASE("empty messages with OmitEmpty", "[protobuf]") { + testproto::MessageType msg; + msg.add_foo_arr(); + + google::protobuf::util::JsonPrintOptions options; + options.preserve_proto_field_names = true; + options.always_print_primitive_fields = false; + std::string json; + auto status = google::protobuf::util::MessageToJsonString(msg, &json, options); + + auto expected = R"({"foo_arr":[{}]})"; + + CHECK(json == expected); +} diff --git a/cpp/tests/protobuf/proto/messages.proto b/cpp/tests/protobuf/proto/messages.proto new file mode 100644 index 0000000000000000000000000000000000000000..1b036cbfc30330bcb4e972ea4fea56d8c5b2b3af --- /dev/null +++ b/cpp/tests/protobuf/proto/messages.proto @@ -0,0 +1,54 @@ +syntax = "proto3"; + +package testproto; + +message SimpleStruct { + int64 int_value = 1; + string string_value = 2; + repeated int64 int_arr = 3; + repeated string string_arr = 4; + map<int32, int32> int_map = 5; + map<string, string> string_map = 6; + double double_value = 7; + uint64 uint64_value = 8; +} + +message Bar { + string value = 2; +} + +message Foo { + string value = 1; + Bar bar = 2; +} + +message MessageType { + Foo foo = 1; + repeated Foo foo_arr = 2; +} + +message JsonNaming { + float foo_value = 1; + float barValue = 2; + float BazValue = 3; + float quX_Value = 4; +} + +message OneofValue { + oneof data { + string string_value = 1; + SimpleStruct struct_value = 2; + } +} + +message StringArray { + repeated string str_arr = 1; +} + +message TwoDimensionalArray { + repeated StringArray arr = 1; +} + +message BytesType { + bytes bytes_value = 1; +} diff --git a/cpp/tests/protobuf/testpb/messages.pb.cc b/cpp/tests/protobuf/testpb/messages.pb.cc new file mode 100644 index 0000000000000000000000000000000000000000..6d9de6ebdab26d1ce4eb4c989fca1f698e3f6df5 --- /dev/null +++ b/cpp/tests/protobuf/testpb/messages.pb.cc @@ -0,0 +1,2755 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: messages.proto + +#include "messages.pb.h" + +#include <algorithm> + +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/extension_set.h> +#include <google/protobuf/wire_format_lite.h> +#include <google/protobuf/descriptor.h> +#include <google/protobuf/generated_message_reflection.h> +#include <google/protobuf/reflection_ops.h> +#include <google/protobuf/wire_format.h> +// @@protoc_insertion_point(includes) +#include <google/protobuf/port_def.inc> +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Bar_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_Foo_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<2> scc_info_SimpleStruct_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_StringArray_messages_2eproto; +namespace testproto { +class SimpleStruct_IntMapEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<SimpleStruct_IntMapEntry_DoNotUse> _instance; +} _SimpleStruct_IntMapEntry_DoNotUse_default_instance_; +class SimpleStruct_StringMapEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<SimpleStruct_StringMapEntry_DoNotUse> _instance; +} _SimpleStruct_StringMapEntry_DoNotUse_default_instance_; +class SimpleStructDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<SimpleStruct> _instance; +} _SimpleStruct_default_instance_; +class BarDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<Bar> _instance; +} _Bar_default_instance_; +class FooDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<Foo> _instance; +} _Foo_default_instance_; +class MessageTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MessageType> _instance; +} _MessageType_default_instance_; +class JsonNamingDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<JsonNaming> _instance; +} _JsonNaming_default_instance_; +class OneofValueDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<OneofValue> _instance; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_; + const ::testproto::SimpleStruct* struct_value_; +} _OneofValue_default_instance_; +class StringArrayDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<StringArray> _instance; +} _StringArray_default_instance_; +class TwoDimensionalArrayDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<TwoDimensionalArray> _instance; +} _TwoDimensionalArray_default_instance_; +class BytesTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<BytesType> _instance; +} _BytesType_default_instance_; +} // namespace testproto +static void InitDefaultsscc_info_Bar_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_Bar_default_instance_; + new (ptr) ::testproto::Bar(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::Bar::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Bar_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_Bar_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_BytesType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_BytesType_default_instance_; + new (ptr) ::testproto::BytesType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::BytesType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_BytesType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_BytesType_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_Foo_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_Foo_default_instance_; + new (ptr) ::testproto::Foo(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::Foo::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_Foo_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_Foo_messages_2eproto}, { + &scc_info_Bar_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_JsonNaming_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_JsonNaming_default_instance_; + new (ptr) ::testproto::JsonNaming(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::JsonNaming::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_JsonNaming_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_JsonNaming_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MessageType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_MessageType_default_instance_; + new (ptr) ::testproto::MessageType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::MessageType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_MessageType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_MessageType_messages_2eproto}, { + &scc_info_Foo_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_OneofValue_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_OneofValue_default_instance_; + new (ptr) ::testproto::OneofValue(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::OneofValue::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_OneofValue_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_OneofValue_messages_2eproto}, { + &scc_info_SimpleStruct_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_SimpleStruct_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_SimpleStruct_default_instance_; + new (ptr) ::testproto::SimpleStruct(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::SimpleStruct::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<2> scc_info_SimpleStruct_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 2, 0, InitDefaultsscc_info_SimpleStruct_messages_2eproto}, { + &scc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto.base, + &scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_SimpleStruct_IntMapEntry_DoNotUse_default_instance_; + new (ptr) ::testproto::SimpleStruct_IntMapEntry_DoNotUse(); + } + ::testproto::SimpleStruct_IntMapEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_SimpleStruct_StringMapEntry_DoNotUse_default_instance_; + new (ptr) ::testproto::SimpleStruct_StringMapEntry_DoNotUse(); + } + ::testproto::SimpleStruct_StringMapEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_StringArray_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_StringArray_default_instance_; + new (ptr) ::testproto::StringArray(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::StringArray::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_StringArray_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_StringArray_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_TwoDimensionalArray_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::testproto::_TwoDimensionalArray_default_instance_; + new (ptr) ::testproto::TwoDimensionalArray(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::testproto::TwoDimensionalArray::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_TwoDimensionalArray_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_TwoDimensionalArray_messages_2eproto}, { + &scc_info_StringArray_messages_2eproto.base,}}; + +static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_messages_2eproto[11]; +static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_messages_2eproto = nullptr; +static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_messages_2eproto = nullptr; + +const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_messages_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_IntMapEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_IntMapEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_IntMapEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_IntMapEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_StringMapEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_StringMapEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_StringMapEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct_StringMapEntry_DoNotUse, value_), + 0, + 1, + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, int_value_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, string_value_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, int_arr_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, string_arr_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, int_map_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, string_map_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, double_value_), + PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, uint64_value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::Bar, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::Bar, value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::Foo, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::Foo, value_), + PROTOBUF_FIELD_OFFSET(::testproto::Foo, bar_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::MessageType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::MessageType, foo_), + PROTOBUF_FIELD_OFFSET(::testproto::MessageType, foo_arr_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::JsonNaming, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::JsonNaming, foo_value_), + PROTOBUF_FIELD_OFFSET(::testproto::JsonNaming, barvalue_), + PROTOBUF_FIELD_OFFSET(::testproto::JsonNaming, bazvalue_), + PROTOBUF_FIELD_OFFSET(::testproto::JsonNaming, qux_value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::OneofValue, _internal_metadata_), + ~0u, // no _extensions_ + PROTOBUF_FIELD_OFFSET(::testproto::OneofValue, _oneof_case_[0]), + ~0u, // no _weak_field_map_ + offsetof(::testproto::OneofValueDefaultTypeInternal, string_value_), + offsetof(::testproto::OneofValueDefaultTypeInternal, struct_value_), + PROTOBUF_FIELD_OFFSET(::testproto::OneofValue, data_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::StringArray, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::StringArray, str_arr_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::TwoDimensionalArray, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::TwoDimensionalArray, arr_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::testproto::BytesType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::testproto::BytesType, bytes_value_), +}; +static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + { 0, 7, sizeof(::testproto::SimpleStruct_IntMapEntry_DoNotUse)}, + { 9, 16, sizeof(::testproto::SimpleStruct_StringMapEntry_DoNotUse)}, + { 18, -1, sizeof(::testproto::SimpleStruct)}, + { 31, -1, sizeof(::testproto::Bar)}, + { 37, -1, sizeof(::testproto::Foo)}, + { 44, -1, sizeof(::testproto::MessageType)}, + { 51, -1, sizeof(::testproto::JsonNaming)}, + { 60, -1, sizeof(::testproto::OneofValue)}, + { 68, -1, sizeof(::testproto::StringArray)}, + { 74, -1, sizeof(::testproto::TwoDimensionalArray)}, + { 80, -1, sizeof(::testproto::BytesType)}, +}; + +static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = { + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_SimpleStruct_IntMapEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_SimpleStruct_StringMapEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_SimpleStruct_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_Bar_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_Foo_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_MessageType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_JsonNaming_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_OneofValue_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_StringArray_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_TwoDimensionalArray_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_BytesType_default_instance_), +}; + +const char descriptor_table_protodef_messages_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = + "\n\016messages.proto\022\ttestproto\"\333\002\n\014SimpleSt" + "ruct\022\021\n\tint_value\030\001 \001(\003\022\024\n\014string_value\030" + "\002 \001(\t\022\017\n\007int_arr\030\003 \003(\003\022\022\n\nstring_arr\030\004 \003" + "(\t\0224\n\007int_map\030\005 \003(\0132#.testproto.SimpleSt" + "ruct.IntMapEntry\022:\n\nstring_map\030\006 \003(\0132&.t" + "estproto.SimpleStruct.StringMapEntry\022\024\n\014" + "double_value\030\007 \001(\001\022\024\n\014uint64_value\030\010 \001(\004" + "\032-\n\013IntMapEntry\022\013\n\003key\030\001 \001(\005\022\r\n\005value\030\002 " + "\001(\005:\0028\001\0320\n\016StringMapEntry\022\013\n\003key\030\001 \001(\t\022\r" + "\n\005value\030\002 \001(\t:\0028\001\"\024\n\003Bar\022\r\n\005value\030\002 \001(\t\"" + "1\n\003Foo\022\r\n\005value\030\001 \001(\t\022\033\n\003bar\030\002 \001(\0132\016.tes" + "tproto.Bar\"K\n\013MessageType\022\033\n\003foo\030\001 \001(\0132\016" + ".testproto.Foo\022\037\n\007foo_arr\030\002 \003(\0132\016.testpr" + "oto.Foo\"V\n\nJsonNaming\022\021\n\tfoo_value\030\001 \001(\002" + "\022\020\n\010barValue\030\002 \001(\002\022\020\n\010BazValue\030\003 \001(\002\022\021\n\t" + "quX_Value\030\004 \001(\002\"]\n\nOneofValue\022\026\n\014string_" + "value\030\001 \001(\tH\000\022/\n\014struct_value\030\002 \001(\0132\027.te" + "stproto.SimpleStructH\000B\006\n\004data\"\036\n\013String" + "Array\022\017\n\007str_arr\030\001 \003(\t\":\n\023TwoDimensional" + "Array\022#\n\003arr\030\001 \003(\0132\026.testproto.StringArr" + "ay\" \n\tBytesType\022\023\n\013bytes_value\030\001 \001(\014b\006pr" + "oto3" + ; +static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_messages_2eproto_deps[1] = { +}; +static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_messages_2eproto_sccs[11] = { + &scc_info_Bar_messages_2eproto.base, + &scc_info_BytesType_messages_2eproto.base, + &scc_info_Foo_messages_2eproto.base, + &scc_info_JsonNaming_messages_2eproto.base, + &scc_info_MessageType_messages_2eproto.base, + &scc_info_OneofValue_messages_2eproto.base, + &scc_info_SimpleStruct_messages_2eproto.base, + &scc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto.base, + &scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto.base, + &scc_info_StringArray_messages_2eproto.base, + &scc_info_TwoDimensionalArray_messages_2eproto.base, +}; +static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_messages_2eproto_once; +static bool descriptor_table_messages_2eproto_initialized = false; +const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_messages_2eproto = { + &descriptor_table_messages_2eproto_initialized, descriptor_table_protodef_messages_2eproto, "messages.proto", 844, + &descriptor_table_messages_2eproto_once, descriptor_table_messages_2eproto_sccs, descriptor_table_messages_2eproto_deps, 11, 0, + schemas, file_default_instances, TableStruct_messages_2eproto::offsets, + file_level_metadata_messages_2eproto, 11, file_level_enum_descriptors_messages_2eproto, file_level_service_descriptors_messages_2eproto, +}; + +// Force running AddDescriptors() at dynamic initialization time. +static bool dynamic_init_dummy_messages_2eproto = ( ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_messages_2eproto), true); +namespace testproto { + +// =================================================================== + +SimpleStruct_IntMapEntry_DoNotUse::SimpleStruct_IntMapEntry_DoNotUse() {} +SimpleStruct_IntMapEntry_DoNotUse::SimpleStruct_IntMapEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void SimpleStruct_IntMapEntry_DoNotUse::MergeFrom(const SimpleStruct_IntMapEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata SimpleStruct_IntMapEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void SimpleStruct_IntMapEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +SimpleStruct_StringMapEntry_DoNotUse::SimpleStruct_StringMapEntry_DoNotUse() {} +SimpleStruct_StringMapEntry_DoNotUse::SimpleStruct_StringMapEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void SimpleStruct_StringMapEntry_DoNotUse::MergeFrom(const SimpleStruct_StringMapEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata SimpleStruct_StringMapEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void SimpleStruct_StringMapEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +void SimpleStruct::InitAsDefaultInstance() { +} +class SimpleStruct::_Internal { + public: +}; + +SimpleStruct::SimpleStruct() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.SimpleStruct) +} +SimpleStruct::SimpleStruct(const SimpleStruct& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + int_arr_(from.int_arr_), + string_arr_(from.string_arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + int_map_.MergeFrom(from.int_map_); + string_map_.MergeFrom(from.string_map_); + string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_string_value().empty()) { + string_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.string_value_); + } + ::memcpy(&int_value_, &from.int_value_, + static_cast<size_t>(reinterpret_cast<char*>(&uint64_value_) - + reinterpret_cast<char*>(&int_value_)) + sizeof(uint64_value_)); + // @@protoc_insertion_point(copy_constructor:testproto.SimpleStruct) +} + +void SimpleStruct::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SimpleStruct_messages_2eproto.base); + string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&int_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&uint64_value_) - + reinterpret_cast<char*>(&int_value_)) + sizeof(uint64_value_)); +} + +SimpleStruct::~SimpleStruct() { + // @@protoc_insertion_point(destructor:testproto.SimpleStruct) + SharedDtor(); +} + +void SimpleStruct::SharedDtor() { + string_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void SimpleStruct::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const SimpleStruct& SimpleStruct::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_SimpleStruct_messages_2eproto.base); + return *internal_default_instance(); +} + + +void SimpleStruct::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.SimpleStruct) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + int_arr_.Clear(); + string_arr_.Clear(); + int_map_.Clear(); + string_map_.Clear(); + string_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&int_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&uint64_value_) - + reinterpret_cast<char*>(&int_value_)) + sizeof(uint64_value_)); + _internal_metadata_.Clear(); +} + +const char* SimpleStruct::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // int64 int_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + int_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // string string_value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + auto str = _internal_mutable_string_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.SimpleStruct.string_value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated int64 int_arr = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt64Parser(_internal_mutable_int_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 24) { + _internal_add_int_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated string string_arr = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { + ptr -= 1; + do { + ptr += 1; + auto str = _internal_add_string_arr(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.SimpleStruct.string_arr")); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<34>(ptr)); + } else goto handle_unusual; + continue; + // map<int32, int32> int_map = 5; + case 5: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 42)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&int_map_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<42>(ptr)); + } else goto handle_unusual; + continue; + // map<string, string> string_map = 6; + case 6: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 50)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&string_map_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<50>(ptr)); + } else goto handle_unusual; + continue; + // double double_value = 7; + case 7: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 57)) { + double_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr); + ptr += sizeof(double); + } else goto handle_unusual; + continue; + // uint64 uint64_value = 8; + case 8: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 64)) { + uint64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* SimpleStruct::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.SimpleStruct) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // int64 int_value = 1; + if (this->int_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt64ToArray(1, this->_internal_int_value(), target); + } + + // string string_value = 2; + if (this->string_value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_string_value().data(), static_cast<int>(this->_internal_string_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.SimpleStruct.string_value"); + target = stream->WriteStringMaybeAliased( + 2, this->_internal_string_value(), target); + } + + // repeated int64 int_arr = 3; + { + int byte_size = _int_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteInt64Packed( + 3, _internal_int_arr(), byte_size, target); + } + } + + // repeated string string_arr = 4; + for (int i = 0, n = this->_internal_string_arr_size(); i < n; i++) { + const auto& s = this->_internal_string_arr(i); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast<int>(s.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.SimpleStruct.string_arr"); + target = stream->WriteString(4, s, target); + } + + // map<int32, int32> int_map = 5; + if (!this->_internal_int_map().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int32, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + + if (stream->IsSerializationDeterministic() && + this->_internal_int_map().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_int_map().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >::const_iterator + it = this->_internal_int_map().begin(); + it != this->_internal_int_map().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = SimpleStruct_IntMapEntry_DoNotUse::Funcs::InternalSerialize(5, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >::const_iterator + it = this->_internal_int_map().begin(); + it != this->_internal_int_map().end(); ++it) { + target = SimpleStruct_IntMapEntry_DoNotUse::Funcs::InternalSerialize(5, it->first, it->second, target, stream); + } + } + } + + // map<string, string> string_map = 6; + if (!this->_internal_string_map().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_pointer + ConstPtr; + typedef ConstPtr SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByDerefFirst<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->first.data(), static_cast<int>(p->first.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.SimpleStruct.StringMapEntry.key"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.SimpleStruct.StringMapEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_string_map().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_string_map().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_iterator + it = this->_internal_string_map().begin(); + it != this->_internal_string_map().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = SimpleStruct_StringMapEntry_DoNotUse::Funcs::InternalSerialize(6, items[static_cast<ptrdiff_t>(i)]->first, items[static_cast<ptrdiff_t>(i)]->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)])); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_iterator + it = this->_internal_string_map().begin(); + it != this->_internal_string_map().end(); ++it) { + target = SimpleStruct_StringMapEntry_DoNotUse::Funcs::InternalSerialize(6, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // double double_value = 7; + if (!(this->double_value() <= 0 && this->double_value() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteDoubleToArray(7, this->_internal_double_value(), target); + } + + // uint64 uint64_value = 8; + if (this->uint64_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(8, this->_internal_uint64_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.SimpleStruct) + return target; +} + +size_t SimpleStruct::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.SimpleStruct) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated int64 int_arr = 3; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + Int64Size(this->int_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _int_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated string string_arr = 4; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(string_arr_.size()); + for (int i = 0, n = string_arr_.size(); i < n; i++) { + total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + string_arr_.Get(i)); + } + + // map<int32, int32> int_map = 5; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_int_map_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >::const_iterator + it = this->_internal_int_map().begin(); + it != this->_internal_int_map().end(); ++it) { + total_size += SimpleStruct_IntMapEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<string, string> string_map = 6; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_string_map_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_iterator + it = this->_internal_string_map().begin(); + it != this->_internal_string_map().end(); ++it) { + total_size += SimpleStruct_StringMapEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // string string_value = 2; + if (this->string_value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_string_value()); + } + + // int64 int_value = 1; + if (this->int_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int64Size( + this->_internal_int_value()); + } + + // double double_value = 7; + if (!(this->double_value() <= 0 && this->double_value() >= 0)) { + total_size += 1 + 8; + } + + // uint64 uint64_value = 8; + if (this->uint64_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt64Size( + this->_internal_uint64_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void SimpleStruct::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.SimpleStruct) + GOOGLE_DCHECK_NE(&from, this); + const SimpleStruct* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<SimpleStruct>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.SimpleStruct) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.SimpleStruct) + MergeFrom(*source); + } +} + +void SimpleStruct::MergeFrom(const SimpleStruct& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.SimpleStruct) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + int_arr_.MergeFrom(from.int_arr_); + string_arr_.MergeFrom(from.string_arr_); + int_map_.MergeFrom(from.int_map_); + string_map_.MergeFrom(from.string_map_); + if (from.string_value().size() > 0) { + + string_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.string_value_); + } + if (from.int_value() != 0) { + _internal_set_int_value(from._internal_int_value()); + } + if (!(from.double_value() <= 0 && from.double_value() >= 0)) { + _internal_set_double_value(from._internal_double_value()); + } + if (from.uint64_value() != 0) { + _internal_set_uint64_value(from._internal_uint64_value()); + } +} + +void SimpleStruct::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.SimpleStruct) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void SimpleStruct::CopyFrom(const SimpleStruct& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.SimpleStruct) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool SimpleStruct::IsInitialized() const { + return true; +} + +void SimpleStruct::InternalSwap(SimpleStruct* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + int_arr_.InternalSwap(&other->int_arr_); + string_arr_.InternalSwap(&other->string_arr_); + int_map_.Swap(&other->int_map_); + string_map_.Swap(&other->string_map_); + string_value_.Swap(&other->string_value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(int_value_, other->int_value_); + swap(double_value_, other->double_value_); + swap(uint64_value_, other->uint64_value_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata SimpleStruct::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void Bar::InitAsDefaultInstance() { +} +class Bar::_Internal { + public: +}; + +Bar::Bar() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.Bar) +} +Bar::Bar(const Bar& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + // @@protoc_insertion_point(copy_constructor:testproto.Bar) +} + +void Bar::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Bar_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +Bar::~Bar() { + // @@protoc_insertion_point(destructor:testproto.Bar) + SharedDtor(); +} + +void Bar::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void Bar::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const Bar& Bar::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_Bar_messages_2eproto.base); + return *internal_default_instance(); +} + + +void Bar::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.Bar) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + _internal_metadata_.Clear(); +} + +const char* Bar::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.Bar.value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* Bar::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.Bar) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string value = 2; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.Bar.value"); + target = stream->WriteStringMaybeAliased( + 2, this->_internal_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.Bar) + return target; +} + +size_t Bar::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.Bar) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string value = 2; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void Bar::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.Bar) + GOOGLE_DCHECK_NE(&from, this); + const Bar* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<Bar>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.Bar) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.Bar) + MergeFrom(*source); + } +} + +void Bar::MergeFrom(const Bar& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.Bar) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } +} + +void Bar::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.Bar) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Bar::CopyFrom(const Bar& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.Bar) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Bar::IsInitialized() const { + return true; +} + +void Bar::InternalSwap(Bar* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); +} + +::PROTOBUF_NAMESPACE_ID::Metadata Bar::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void Foo::InitAsDefaultInstance() { + ::testproto::_Foo_default_instance_._instance.get_mutable()->bar_ = const_cast< ::testproto::Bar*>( + ::testproto::Bar::internal_default_instance()); +} +class Foo::_Internal { + public: + static const ::testproto::Bar& bar(const Foo* msg); +}; + +const ::testproto::Bar& +Foo::_Internal::bar(const Foo* msg) { + return *msg->bar_; +} +Foo::Foo() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.Foo) +} +Foo::Foo(const Foo& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from._internal_has_bar()) { + bar_ = new ::testproto::Bar(*from.bar_); + } else { + bar_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:testproto.Foo) +} + +void Foo::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Foo_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + bar_ = nullptr; +} + +Foo::~Foo() { + // @@protoc_insertion_point(destructor:testproto.Foo) + SharedDtor(); +} + +void Foo::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete bar_; +} + +void Foo::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const Foo& Foo::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_Foo_messages_2eproto.base); + return *internal_default_instance(); +} + + +void Foo::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.Foo) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == nullptr && bar_ != nullptr) { + delete bar_; + } + bar_ = nullptr; + _internal_metadata_.Clear(); +} + +const char* Foo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.Foo.value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .testproto.Bar bar = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_bar(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* Foo::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.Foo) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.Foo.value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_value(), target); + } + + // .testproto.Bar bar = 2; + if (this->has_bar()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 2, _Internal::bar(this), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.Foo) + return target; +} + +size_t Foo::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.Foo) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + // .testproto.Bar bar = 2; + if (this->has_bar()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *bar_); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void Foo::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.Foo) + GOOGLE_DCHECK_NE(&from, this); + const Foo* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<Foo>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.Foo) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.Foo) + MergeFrom(*source); + } +} + +void Foo::MergeFrom(const Foo& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.Foo) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from.has_bar()) { + _internal_mutable_bar()->::testproto::Bar::MergeFrom(from._internal_bar()); + } +} + +void Foo::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.Foo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Foo::CopyFrom(const Foo& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.Foo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Foo::IsInitialized() const { + return true; +} + +void Foo::InternalSwap(Foo* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(bar_, other->bar_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata Foo::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void MessageType::InitAsDefaultInstance() { + ::testproto::_MessageType_default_instance_._instance.get_mutable()->foo_ = const_cast< ::testproto::Foo*>( + ::testproto::Foo::internal_default_instance()); +} +class MessageType::_Internal { + public: + static const ::testproto::Foo& foo(const MessageType* msg); +}; + +const ::testproto::Foo& +MessageType::_Internal::foo(const MessageType* msg) { + return *msg->foo_; +} +MessageType::MessageType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.MessageType) +} +MessageType::MessageType(const MessageType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + foo_arr_(from.foo_arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + if (from._internal_has_foo()) { + foo_ = new ::testproto::Foo(*from.foo_); + } else { + foo_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:testproto.MessageType) +} + +void MessageType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MessageType_messages_2eproto.base); + foo_ = nullptr; +} + +MessageType::~MessageType() { + // @@protoc_insertion_point(destructor:testproto.MessageType) + SharedDtor(); +} + +void MessageType::SharedDtor() { + if (this != internal_default_instance()) delete foo_; +} + +void MessageType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const MessageType& MessageType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_MessageType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void MessageType::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.MessageType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + foo_arr_.Clear(); + if (GetArenaNoVirtual() == nullptr && foo_ != nullptr) { + delete foo_; + } + foo_ = nullptr; + _internal_metadata_.Clear(); +} + +const char* MessageType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .testproto.Foo foo = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr = ctx->ParseMessage(_internal_mutable_foo(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated .testproto.Foo foo_arr = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(_internal_add_foo_arr(), ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* MessageType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.MessageType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .testproto.Foo foo = 1; + if (this->has_foo()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 1, _Internal::foo(this), target, stream); + } + + // repeated .testproto.Foo foo_arr = 2; + for (unsigned int i = 0, + n = static_cast<unsigned int>(this->_internal_foo_arr_size()); i < n; i++) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage(2, this->_internal_foo_arr(i), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.MessageType) + return target; +} + +size_t MessageType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.MessageType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .testproto.Foo foo_arr = 2; + total_size += 1UL * this->_internal_foo_arr_size(); + for (const auto& msg : this->foo_arr_) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); + } + + // .testproto.Foo foo = 1; + if (this->has_foo()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *foo_); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void MessageType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.MessageType) + GOOGLE_DCHECK_NE(&from, this); + const MessageType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<MessageType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.MessageType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.MessageType) + MergeFrom(*source); + } +} + +void MessageType::MergeFrom(const MessageType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.MessageType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + foo_arr_.MergeFrom(from.foo_arr_); + if (from.has_foo()) { + _internal_mutable_foo()->::testproto::Foo::MergeFrom(from._internal_foo()); + } +} + +void MessageType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.MessageType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MessageType::CopyFrom(const MessageType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.MessageType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MessageType::IsInitialized() const { + return true; +} + +void MessageType::InternalSwap(MessageType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + foo_arr_.InternalSwap(&other->foo_arr_); + swap(foo_, other->foo_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata MessageType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void JsonNaming::InitAsDefaultInstance() { +} +class JsonNaming::_Internal { + public: +}; + +JsonNaming::JsonNaming() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.JsonNaming) +} +JsonNaming::JsonNaming(const JsonNaming& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::memcpy(&foo_value_, &from.foo_value_, + static_cast<size_t>(reinterpret_cast<char*>(&qux_value_) - + reinterpret_cast<char*>(&foo_value_)) + sizeof(qux_value_)); + // @@protoc_insertion_point(copy_constructor:testproto.JsonNaming) +} + +void JsonNaming::SharedCtor() { + ::memset(&foo_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&qux_value_) - + reinterpret_cast<char*>(&foo_value_)) + sizeof(qux_value_)); +} + +JsonNaming::~JsonNaming() { + // @@protoc_insertion_point(destructor:testproto.JsonNaming) + SharedDtor(); +} + +void JsonNaming::SharedDtor() { +} + +void JsonNaming::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const JsonNaming& JsonNaming::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_JsonNaming_messages_2eproto.base); + return *internal_default_instance(); +} + + +void JsonNaming::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.JsonNaming) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + ::memset(&foo_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&qux_value_) - + reinterpret_cast<char*>(&foo_value_)) + sizeof(qux_value_)); + _internal_metadata_.Clear(); +} + +const char* JsonNaming::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // float foo_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 13)) { + foo_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr); + ptr += sizeof(float); + } else goto handle_unusual; + continue; + // float barValue = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 21)) { + barvalue_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr); + ptr += sizeof(float); + } else goto handle_unusual; + continue; + // float BazValue = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 29)) { + bazvalue_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr); + ptr += sizeof(float); + } else goto handle_unusual; + continue; + // float quX_Value = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 37)) { + qux_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr); + ptr += sizeof(float); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* JsonNaming::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.JsonNaming) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // float foo_value = 1; + if (!(this->foo_value() <= 0 && this->foo_value() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFloatToArray(1, this->_internal_foo_value(), target); + } + + // float barValue = 2; + if (!(this->barvalue() <= 0 && this->barvalue() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFloatToArray(2, this->_internal_barvalue(), target); + } + + // float BazValue = 3; + if (!(this->bazvalue() <= 0 && this->bazvalue() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFloatToArray(3, this->_internal_bazvalue(), target); + } + + // float quX_Value = 4; + if (!(this->qux_value() <= 0 && this->qux_value() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFloatToArray(4, this->_internal_qux_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.JsonNaming) + return target; +} + +size_t JsonNaming::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.JsonNaming) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // float foo_value = 1; + if (!(this->foo_value() <= 0 && this->foo_value() >= 0)) { + total_size += 1 + 4; + } + + // float barValue = 2; + if (!(this->barvalue() <= 0 && this->barvalue() >= 0)) { + total_size += 1 + 4; + } + + // float BazValue = 3; + if (!(this->bazvalue() <= 0 && this->bazvalue() >= 0)) { + total_size += 1 + 4; + } + + // float quX_Value = 4; + if (!(this->qux_value() <= 0 && this->qux_value() >= 0)) { + total_size += 1 + 4; + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void JsonNaming::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.JsonNaming) + GOOGLE_DCHECK_NE(&from, this); + const JsonNaming* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<JsonNaming>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.JsonNaming) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.JsonNaming) + MergeFrom(*source); + } +} + +void JsonNaming::MergeFrom(const JsonNaming& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.JsonNaming) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (!(from.foo_value() <= 0 && from.foo_value() >= 0)) { + _internal_set_foo_value(from._internal_foo_value()); + } + if (!(from.barvalue() <= 0 && from.barvalue() >= 0)) { + _internal_set_barvalue(from._internal_barvalue()); + } + if (!(from.bazvalue() <= 0 && from.bazvalue() >= 0)) { + _internal_set_bazvalue(from._internal_bazvalue()); + } + if (!(from.qux_value() <= 0 && from.qux_value() >= 0)) { + _internal_set_qux_value(from._internal_qux_value()); + } +} + +void JsonNaming::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.JsonNaming) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void JsonNaming::CopyFrom(const JsonNaming& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.JsonNaming) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool JsonNaming::IsInitialized() const { + return true; +} + +void JsonNaming::InternalSwap(JsonNaming* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(foo_value_, other->foo_value_); + swap(barvalue_, other->barvalue_); + swap(bazvalue_, other->bazvalue_); + swap(qux_value_, other->qux_value_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata JsonNaming::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void OneofValue::InitAsDefaultInstance() { + ::testproto::_OneofValue_default_instance_.string_value_.UnsafeSetDefault( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::testproto::_OneofValue_default_instance_.struct_value_ = const_cast< ::testproto::SimpleStruct*>( + ::testproto::SimpleStruct::internal_default_instance()); +} +class OneofValue::_Internal { + public: + static const ::testproto::SimpleStruct& struct_value(const OneofValue* msg); +}; + +const ::testproto::SimpleStruct& +OneofValue::_Internal::struct_value(const OneofValue* msg) { + return *msg->data_.struct_value_; +} +void OneofValue::set_allocated_struct_value(::testproto::SimpleStruct* struct_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + clear_data(); + if (struct_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + struct_value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, struct_value, submessage_arena); + } + set_has_struct_value(); + data_.struct_value_ = struct_value; + } + // @@protoc_insertion_point(field_set_allocated:testproto.OneofValue.struct_value) +} +OneofValue::OneofValue() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.OneofValue) +} +OneofValue::OneofValue(const OneofValue& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + clear_has_data(); + switch (from.data_case()) { + case kStringValue: { + _internal_set_string_value(from._internal_string_value()); + break; + } + case kStructValue: { + _internal_mutable_struct_value()->::testproto::SimpleStruct::MergeFrom(from._internal_struct_value()); + break; + } + case DATA_NOT_SET: { + break; + } + } + // @@protoc_insertion_point(copy_constructor:testproto.OneofValue) +} + +void OneofValue::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OneofValue_messages_2eproto.base); + clear_has_data(); +} + +OneofValue::~OneofValue() { + // @@protoc_insertion_point(destructor:testproto.OneofValue) + SharedDtor(); +} + +void OneofValue::SharedDtor() { + if (has_data()) { + clear_data(); + } +} + +void OneofValue::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const OneofValue& OneofValue::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_OneofValue_messages_2eproto.base); + return *internal_default_instance(); +} + + +void OneofValue::clear_data() { +// @@protoc_insertion_point(one_of_clear_start:testproto.OneofValue) + switch (data_case()) { + case kStringValue: { + data_.string_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + break; + } + case kStructValue: { + delete data_.struct_value_; + break; + } + case DATA_NOT_SET: { + break; + } + } + _oneof_case_[0] = DATA_NOT_SET; +} + + +void OneofValue::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.OneofValue) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + clear_data(); + _internal_metadata_.Clear(); +} + +const char* OneofValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string string_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_string_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.OneofValue.string_value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .testproto.SimpleStruct struct_value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_struct_value(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* OneofValue::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.OneofValue) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string string_value = 1; + if (_internal_has_string_value()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_string_value().data(), static_cast<int>(this->_internal_string_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.OneofValue.string_value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_string_value(), target); + } + + // .testproto.SimpleStruct struct_value = 2; + if (_internal_has_struct_value()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 2, _Internal::struct_value(this), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.OneofValue) + return target; +} + +size_t OneofValue::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.OneofValue) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + switch (data_case()) { + // string string_value = 1; + case kStringValue: { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_string_value()); + break; + } + // .testproto.SimpleStruct struct_value = 2; + case kStructValue: { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *data_.struct_value_); + break; + } + case DATA_NOT_SET: { + break; + } + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void OneofValue::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.OneofValue) + GOOGLE_DCHECK_NE(&from, this); + const OneofValue* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<OneofValue>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.OneofValue) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.OneofValue) + MergeFrom(*source); + } +} + +void OneofValue::MergeFrom(const OneofValue& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.OneofValue) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + switch (from.data_case()) { + case kStringValue: { + _internal_set_string_value(from._internal_string_value()); + break; + } + case kStructValue: { + _internal_mutable_struct_value()->::testproto::SimpleStruct::MergeFrom(from._internal_struct_value()); + break; + } + case DATA_NOT_SET: { + break; + } + } +} + +void OneofValue::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.OneofValue) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OneofValue::CopyFrom(const OneofValue& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.OneofValue) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OneofValue::IsInitialized() const { + return true; +} + +void OneofValue::InternalSwap(OneofValue* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(data_, other->data_); + swap(_oneof_case_[0], other->_oneof_case_[0]); +} + +::PROTOBUF_NAMESPACE_ID::Metadata OneofValue::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void StringArray::InitAsDefaultInstance() { +} +class StringArray::_Internal { + public: +}; + +StringArray::StringArray() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.StringArray) +} +StringArray::StringArray(const StringArray& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + str_arr_(from.str_arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + // @@protoc_insertion_point(copy_constructor:testproto.StringArray) +} + +void StringArray::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_StringArray_messages_2eproto.base); +} + +StringArray::~StringArray() { + // @@protoc_insertion_point(destructor:testproto.StringArray) + SharedDtor(); +} + +void StringArray::SharedDtor() { +} + +void StringArray::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const StringArray& StringArray::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_StringArray_messages_2eproto.base); + return *internal_default_instance(); +} + + +void StringArray::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.StringArray) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + str_arr_.Clear(); + _internal_metadata_.Clear(); +} + +const char* StringArray::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // repeated string str_arr = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr -= 1; + do { + ptr += 1; + auto str = _internal_add_str_arr(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.StringArray.str_arr")); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* StringArray::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.StringArray) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // repeated string str_arr = 1; + for (int i = 0, n = this->_internal_str_arr_size(); i < n; i++) { + const auto& s = this->_internal_str_arr(i); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast<int>(s.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "testproto.StringArray.str_arr"); + target = stream->WriteString(1, s, target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.StringArray) + return target; +} + +size_t StringArray::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.StringArray) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated string str_arr = 1; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(str_arr_.size()); + for (int i = 0, n = str_arr_.size(); i < n; i++) { + total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + str_arr_.Get(i)); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void StringArray::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.StringArray) + GOOGLE_DCHECK_NE(&from, this); + const StringArray* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<StringArray>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.StringArray) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.StringArray) + MergeFrom(*source); + } +} + +void StringArray::MergeFrom(const StringArray& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.StringArray) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + str_arr_.MergeFrom(from.str_arr_); +} + +void StringArray::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.StringArray) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void StringArray::CopyFrom(const StringArray& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.StringArray) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool StringArray::IsInitialized() const { + return true; +} + +void StringArray::InternalSwap(StringArray* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + str_arr_.InternalSwap(&other->str_arr_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata StringArray::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void TwoDimensionalArray::InitAsDefaultInstance() { +} +class TwoDimensionalArray::_Internal { + public: +}; + +TwoDimensionalArray::TwoDimensionalArray() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.TwoDimensionalArray) +} +TwoDimensionalArray::TwoDimensionalArray(const TwoDimensionalArray& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + arr_(from.arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + // @@protoc_insertion_point(copy_constructor:testproto.TwoDimensionalArray) +} + +void TwoDimensionalArray::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_TwoDimensionalArray_messages_2eproto.base); +} + +TwoDimensionalArray::~TwoDimensionalArray() { + // @@protoc_insertion_point(destructor:testproto.TwoDimensionalArray) + SharedDtor(); +} + +void TwoDimensionalArray::SharedDtor() { +} + +void TwoDimensionalArray::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const TwoDimensionalArray& TwoDimensionalArray::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_TwoDimensionalArray_messages_2eproto.base); + return *internal_default_instance(); +} + + +void TwoDimensionalArray::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.TwoDimensionalArray) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + arr_.Clear(); + _internal_metadata_.Clear(); +} + +const char* TwoDimensionalArray::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // repeated .testproto.StringArray arr = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(_internal_add_arr(), ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* TwoDimensionalArray::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.TwoDimensionalArray) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // repeated .testproto.StringArray arr = 1; + for (unsigned int i = 0, + n = static_cast<unsigned int>(this->_internal_arr_size()); i < n; i++) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage(1, this->_internal_arr(i), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.TwoDimensionalArray) + return target; +} + +size_t TwoDimensionalArray::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.TwoDimensionalArray) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .testproto.StringArray arr = 1; + total_size += 1UL * this->_internal_arr_size(); + for (const auto& msg : this->arr_) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void TwoDimensionalArray::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.TwoDimensionalArray) + GOOGLE_DCHECK_NE(&from, this); + const TwoDimensionalArray* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<TwoDimensionalArray>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.TwoDimensionalArray) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.TwoDimensionalArray) + MergeFrom(*source); + } +} + +void TwoDimensionalArray::MergeFrom(const TwoDimensionalArray& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.TwoDimensionalArray) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + arr_.MergeFrom(from.arr_); +} + +void TwoDimensionalArray::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.TwoDimensionalArray) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void TwoDimensionalArray::CopyFrom(const TwoDimensionalArray& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.TwoDimensionalArray) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool TwoDimensionalArray::IsInitialized() const { + return true; +} + +void TwoDimensionalArray::InternalSwap(TwoDimensionalArray* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + arr_.InternalSwap(&other->arr_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata TwoDimensionalArray::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void BytesType::InitAsDefaultInstance() { +} +class BytesType::_Internal { + public: +}; + +BytesType::BytesType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:testproto.BytesType) +} +BytesType::BytesType(const BytesType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + bytes_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_bytes_value().empty()) { + bytes_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.bytes_value_); + } + // @@protoc_insertion_point(copy_constructor:testproto.BytesType) +} + +void BytesType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BytesType_messages_2eproto.base); + bytes_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +BytesType::~BytesType() { + // @@protoc_insertion_point(destructor:testproto.BytesType) + SharedDtor(); +} + +void BytesType::SharedDtor() { + bytes_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void BytesType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const BytesType& BytesType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_BytesType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void BytesType::Clear() { +// @@protoc_insertion_point(message_clear_start:testproto.BytesType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + bytes_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + _internal_metadata_.Clear(); +} + +const char* BytesType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // bytes bytes_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_bytes_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* BytesType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:testproto.BytesType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // bytes bytes_value = 1; + if (this->bytes_value().size() > 0) { + target = stream->WriteBytesMaybeAliased( + 1, this->_internal_bytes_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:testproto.BytesType) + return target; +} + +size_t BytesType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:testproto.BytesType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // bytes bytes_value = 1; + if (this->bytes_value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( + this->_internal_bytes_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void BytesType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:testproto.BytesType) + GOOGLE_DCHECK_NE(&from, this); + const BytesType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<BytesType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.BytesType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.BytesType) + MergeFrom(*source); + } +} + +void BytesType::MergeFrom(const BytesType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:testproto.BytesType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.bytes_value().size() > 0) { + + bytes_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.bytes_value_); + } +} + +void BytesType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:testproto.BytesType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void BytesType::CopyFrom(const BytesType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:testproto.BytesType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool BytesType::IsInitialized() const { + return true; +} + +void BytesType::InternalSwap(BytesType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + bytes_value_.Swap(&other->bytes_value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); +} + +::PROTOBUF_NAMESPACE_ID::Metadata BytesType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// @@protoc_insertion_point(namespace_scope) +} // namespace testproto +PROTOBUF_NAMESPACE_OPEN +template<> PROTOBUF_NOINLINE ::testproto::SimpleStruct_IntMapEntry_DoNotUse* Arena::CreateMaybeMessage< ::testproto::SimpleStruct_IntMapEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::testproto::SimpleStruct_IntMapEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::SimpleStruct_StringMapEntry_DoNotUse* Arena::CreateMaybeMessage< ::testproto::SimpleStruct_StringMapEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::testproto::SimpleStruct_StringMapEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::SimpleStruct* Arena::CreateMaybeMessage< ::testproto::SimpleStruct >(Arena* arena) { + return Arena::CreateInternal< ::testproto::SimpleStruct >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::Bar* Arena::CreateMaybeMessage< ::testproto::Bar >(Arena* arena) { + return Arena::CreateInternal< ::testproto::Bar >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::Foo* Arena::CreateMaybeMessage< ::testproto::Foo >(Arena* arena) { + return Arena::CreateInternal< ::testproto::Foo >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::MessageType* Arena::CreateMaybeMessage< ::testproto::MessageType >(Arena* arena) { + return Arena::CreateInternal< ::testproto::MessageType >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::JsonNaming* Arena::CreateMaybeMessage< ::testproto::JsonNaming >(Arena* arena) { + return Arena::CreateInternal< ::testproto::JsonNaming >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::OneofValue* Arena::CreateMaybeMessage< ::testproto::OneofValue >(Arena* arena) { + return Arena::CreateInternal< ::testproto::OneofValue >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::StringArray* Arena::CreateMaybeMessage< ::testproto::StringArray >(Arena* arena) { + return Arena::CreateInternal< ::testproto::StringArray >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::TwoDimensionalArray* Arena::CreateMaybeMessage< ::testproto::TwoDimensionalArray >(Arena* arena) { + return Arena::CreateInternal< ::testproto::TwoDimensionalArray >(arena); +} +template<> PROTOBUF_NOINLINE ::testproto::BytesType* Arena::CreateMaybeMessage< ::testproto::BytesType >(Arena* arena) { + return Arena::CreateInternal< ::testproto::BytesType >(arena); +} +PROTOBUF_NAMESPACE_CLOSE + +// @@protoc_insertion_point(global_scope) +#include <google/protobuf/port_undef.inc> diff --git a/cpp/tests/protobuf/testpb/messages.pb.h b/cpp/tests/protobuf/testpb/messages.pb.h new file mode 100644 index 0000000000000000000000000000000000000000..a786e2477199350f1c8e56c1990e0dabfecd5b98 --- /dev/null +++ b/cpp/tests/protobuf/testpb/messages.pb.h @@ -0,0 +1,2698 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: messages.proto + +#ifndef GOOGLE_PROTOBUF_INCLUDED_messages_2eproto +#define GOOGLE_PROTOBUF_INCLUDED_messages_2eproto + +#include <limits> +#include <string> + +#include <google/protobuf/port_def.inc> +#if PROTOBUF_VERSION < 3011000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include <google/protobuf/port_undef.inc> +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/arena.h> +#include <google/protobuf/arenastring.h> +#include <google/protobuf/generated_message_table_driven.h> +#include <google/protobuf/generated_message_util.h> +#include <google/protobuf/inlined_string_field.h> +#include <google/protobuf/metadata.h> +#include <google/protobuf/generated_message_reflection.h> +#include <google/protobuf/message.h> +#include <google/protobuf/repeated_field.h> // IWYU pragma: export +#include <google/protobuf/extension_set.h> // IWYU pragma: export +#include <google/protobuf/map.h> // IWYU pragma: export +#include <google/protobuf/map_entry.h> +#include <google/protobuf/map_field_inl.h> +#include <google/protobuf/unknown_field_set.h> +// @@protoc_insertion_point(includes) +#include <google/protobuf/port_def.inc> +#define PROTOBUF_INTERNAL_EXPORT_messages_2eproto +PROTOBUF_NAMESPACE_OPEN +namespace internal { +class AnyMetadata; +} // namespace internal +PROTOBUF_NAMESPACE_CLOSE + +// Internal implementation detail -- do not use these members. +struct TableStruct_messages_2eproto { + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTableField entries[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::AuxillaryParseTableField aux[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[11] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[]; + static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[]; + static const ::PROTOBUF_NAMESPACE_ID::uint32 offsets[]; +}; +extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_messages_2eproto; +namespace testproto { +class Bar; +class BarDefaultTypeInternal; +extern BarDefaultTypeInternal _Bar_default_instance_; +class BytesType; +class BytesTypeDefaultTypeInternal; +extern BytesTypeDefaultTypeInternal _BytesType_default_instance_; +class Foo; +class FooDefaultTypeInternal; +extern FooDefaultTypeInternal _Foo_default_instance_; +class JsonNaming; +class JsonNamingDefaultTypeInternal; +extern JsonNamingDefaultTypeInternal _JsonNaming_default_instance_; +class MessageType; +class MessageTypeDefaultTypeInternal; +extern MessageTypeDefaultTypeInternal _MessageType_default_instance_; +class OneofValue; +class OneofValueDefaultTypeInternal; +extern OneofValueDefaultTypeInternal _OneofValue_default_instance_; +class SimpleStruct; +class SimpleStructDefaultTypeInternal; +extern SimpleStructDefaultTypeInternal _SimpleStruct_default_instance_; +class SimpleStruct_IntMapEntry_DoNotUse; +class SimpleStruct_IntMapEntry_DoNotUseDefaultTypeInternal; +extern SimpleStruct_IntMapEntry_DoNotUseDefaultTypeInternal _SimpleStruct_IntMapEntry_DoNotUse_default_instance_; +class SimpleStruct_StringMapEntry_DoNotUse; +class SimpleStruct_StringMapEntry_DoNotUseDefaultTypeInternal; +extern SimpleStruct_StringMapEntry_DoNotUseDefaultTypeInternal _SimpleStruct_StringMapEntry_DoNotUse_default_instance_; +class StringArray; +class StringArrayDefaultTypeInternal; +extern StringArrayDefaultTypeInternal _StringArray_default_instance_; +class TwoDimensionalArray; +class TwoDimensionalArrayDefaultTypeInternal; +extern TwoDimensionalArrayDefaultTypeInternal _TwoDimensionalArray_default_instance_; +} // namespace testproto +PROTOBUF_NAMESPACE_OPEN +template<> ::testproto::Bar* Arena::CreateMaybeMessage<::testproto::Bar>(Arena*); +template<> ::testproto::BytesType* Arena::CreateMaybeMessage<::testproto::BytesType>(Arena*); +template<> ::testproto::Foo* Arena::CreateMaybeMessage<::testproto::Foo>(Arena*); +template<> ::testproto::JsonNaming* Arena::CreateMaybeMessage<::testproto::JsonNaming>(Arena*); +template<> ::testproto::MessageType* Arena::CreateMaybeMessage<::testproto::MessageType>(Arena*); +template<> ::testproto::OneofValue* Arena::CreateMaybeMessage<::testproto::OneofValue>(Arena*); +template<> ::testproto::SimpleStruct* Arena::CreateMaybeMessage<::testproto::SimpleStruct>(Arena*); +template<> ::testproto::SimpleStruct_IntMapEntry_DoNotUse* Arena::CreateMaybeMessage<::testproto::SimpleStruct_IntMapEntry_DoNotUse>(Arena*); +template<> ::testproto::SimpleStruct_StringMapEntry_DoNotUse* Arena::CreateMaybeMessage<::testproto::SimpleStruct_StringMapEntry_DoNotUse>(Arena*); +template<> ::testproto::StringArray* Arena::CreateMaybeMessage<::testproto::StringArray>(Arena*); +template<> ::testproto::TwoDimensionalArray* Arena::CreateMaybeMessage<::testproto::TwoDimensionalArray>(Arena*); +PROTOBUF_NAMESPACE_CLOSE +namespace testproto { + +// =================================================================== + +class SimpleStruct_IntMapEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<SimpleStruct_IntMapEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<SimpleStruct_IntMapEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + 0 > SuperType; + SimpleStruct_IntMapEntry_DoNotUse(); + SimpleStruct_IntMapEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const SimpleStruct_IntMapEntry_DoNotUse& other); + static const SimpleStruct_IntMapEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const SimpleStruct_IntMapEntry_DoNotUse*>(&_SimpleStruct_IntMapEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(void*) { return true; } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[0]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class SimpleStruct_StringMapEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<SimpleStruct_StringMapEntry_DoNotUse, + std::string, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<SimpleStruct_StringMapEntry_DoNotUse, + std::string, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + SimpleStruct_StringMapEntry_DoNotUse(); + SimpleStruct_StringMapEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const SimpleStruct_StringMapEntry_DoNotUse& other); + static const SimpleStruct_StringMapEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const SimpleStruct_StringMapEntry_DoNotUse*>(&_SimpleStruct_StringMapEntry_DoNotUse_default_instance_); } + static bool ValidateKey(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "testproto.SimpleStruct.StringMapEntry.key"); + } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "testproto.SimpleStruct.StringMapEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[1]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class SimpleStruct : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.SimpleStruct) */ { + public: + SimpleStruct(); + virtual ~SimpleStruct(); + + SimpleStruct(const SimpleStruct& from); + SimpleStruct(SimpleStruct&& from) noexcept + : SimpleStruct() { + *this = ::std::move(from); + } + + inline SimpleStruct& operator=(const SimpleStruct& from) { + CopyFrom(from); + return *this; + } + inline SimpleStruct& operator=(SimpleStruct&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const SimpleStruct& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const SimpleStruct* internal_default_instance() { + return reinterpret_cast<const SimpleStruct*>( + &_SimpleStruct_default_instance_); + } + static constexpr int kIndexInFileMessages = + 2; + + friend void swap(SimpleStruct& a, SimpleStruct& b) { + a.Swap(&b); + } + inline void Swap(SimpleStruct* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline SimpleStruct* New() const final { + return CreateMaybeMessage<SimpleStruct>(nullptr); + } + + SimpleStruct* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<SimpleStruct>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const SimpleStruct& from); + void MergeFrom(const SimpleStruct& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(SimpleStruct* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.SimpleStruct"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kIntArrFieldNumber = 3, + kStringArrFieldNumber = 4, + kIntMapFieldNumber = 5, + kStringMapFieldNumber = 6, + kStringValueFieldNumber = 2, + kIntValueFieldNumber = 1, + kDoubleValueFieldNumber = 7, + kUint64ValueFieldNumber = 8, + }; + // repeated int64 int_arr = 3; + int int_arr_size() const; + private: + int _internal_int_arr_size() const; + public: + void clear_int_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_int_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + _internal_int_arr() const; + void _internal_add_int_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + _internal_mutable_int_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int64 int_arr(int index) const; + void set_int_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value); + void add_int_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + int_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + mutable_int_arr(); + + // repeated string string_arr = 4; + int string_arr_size() const; + private: + int _internal_string_arr_size() const; + public: + void clear_string_arr(); + const std::string& string_arr(int index) const; + std::string* mutable_string_arr(int index); + void set_string_arr(int index, const std::string& value); + void set_string_arr(int index, std::string&& value); + void set_string_arr(int index, const char* value); + void set_string_arr(int index, const char* value, size_t size); + std::string* add_string_arr(); + void add_string_arr(const std::string& value); + void add_string_arr(std::string&& value); + void add_string_arr(const char* value); + void add_string_arr(const char* value, size_t size); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& string_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_string_arr(); + private: + const std::string& _internal_string_arr(int index) const; + std::string* _internal_add_string_arr(); + public: + + // map<int32, int32> int_map = 5; + int int_map_size() const; + private: + int _internal_int_map_size() const; + public: + void clear_int_map(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >& + _internal_int_map() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >* + _internal_mutable_int_map(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >& + int_map() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >* + mutable_int_map(); + + // map<string, string> string_map = 6; + int string_map_size() const; + private: + int _internal_string_map_size() const; + public: + void clear_string_map(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& + _internal_string_map() const; + ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* + _internal_mutable_string_map(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& + string_map() const; + ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* + mutable_string_map(); + + // string string_value = 2; + void clear_string_value(); + const std::string& string_value() const; + void set_string_value(const std::string& value); + void set_string_value(std::string&& value); + void set_string_value(const char* value); + void set_string_value(const char* value, size_t size); + std::string* mutable_string_value(); + std::string* release_string_value(); + void set_allocated_string_value(std::string* string_value); + private: + const std::string& _internal_string_value() const; + void _internal_set_string_value(const std::string& value); + std::string* _internal_mutable_string_value(); + public: + + // int64 int_value = 1; + void clear_int_value(); + ::PROTOBUF_NAMESPACE_ID::int64 int_value() const; + void set_int_value(::PROTOBUF_NAMESPACE_ID::int64 value); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_int_value() const; + void _internal_set_int_value(::PROTOBUF_NAMESPACE_ID::int64 value); + public: + + // double double_value = 7; + void clear_double_value(); + double double_value() const; + void set_double_value(double value); + private: + double _internal_double_value() const; + void _internal_set_double_value(double value); + public: + + // uint64 uint64_value = 8; + void clear_uint64_value(); + ::PROTOBUF_NAMESPACE_ID::uint64 uint64_value() const; + void set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value); + private: + ::PROTOBUF_NAMESPACE_ID::uint64 _internal_uint64_value() const; + void _internal_set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value); + public: + + // @@protoc_insertion_point(class_scope:testproto.SimpleStruct) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 > int_arr_; + mutable std::atomic<int> _int_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> string_arr_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + SimpleStruct_IntMapEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + 0 > int_map_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + SimpleStruct_StringMapEntry_DoNotUse, + std::string, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > string_map_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_; + ::PROTOBUF_NAMESPACE_ID::int64 int_value_; + double double_value_; + ::PROTOBUF_NAMESPACE_ID::uint64 uint64_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class Bar : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.Bar) */ { + public: + Bar(); + virtual ~Bar(); + + Bar(const Bar& from); + Bar(Bar&& from) noexcept + : Bar() { + *this = ::std::move(from); + } + + inline Bar& operator=(const Bar& from) { + CopyFrom(from); + return *this; + } + inline Bar& operator=(Bar&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Bar& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Bar* internal_default_instance() { + return reinterpret_cast<const Bar*>( + &_Bar_default_instance_); + } + static constexpr int kIndexInFileMessages = + 3; + + friend void swap(Bar& a, Bar& b) { + a.Swap(&b); + } + inline void Swap(Bar* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline Bar* New() const final { + return CreateMaybeMessage<Bar>(nullptr); + } + + Bar* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<Bar>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Bar& from); + void MergeFrom(const Bar& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Bar* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.Bar"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 2, + }; + // string value = 2; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // @@protoc_insertion_point(class_scope:testproto.Bar) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class Foo : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.Foo) */ { + public: + Foo(); + virtual ~Foo(); + + Foo(const Foo& from); + Foo(Foo&& from) noexcept + : Foo() { + *this = ::std::move(from); + } + + inline Foo& operator=(const Foo& from) { + CopyFrom(from); + return *this; + } + inline Foo& operator=(Foo&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Foo& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Foo* internal_default_instance() { + return reinterpret_cast<const Foo*>( + &_Foo_default_instance_); + } + static constexpr int kIndexInFileMessages = + 4; + + friend void swap(Foo& a, Foo& b) { + a.Swap(&b); + } + inline void Swap(Foo* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline Foo* New() const final { + return CreateMaybeMessage<Foo>(nullptr); + } + + Foo* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<Foo>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Foo& from); + void MergeFrom(const Foo& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Foo* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.Foo"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 1, + kBarFieldNumber = 2, + }; + // string value = 1; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // .testproto.Bar bar = 2; + bool has_bar() const; + private: + bool _internal_has_bar() const; + public: + void clear_bar(); + const ::testproto::Bar& bar() const; + ::testproto::Bar* release_bar(); + ::testproto::Bar* mutable_bar(); + void set_allocated_bar(::testproto::Bar* bar); + private: + const ::testproto::Bar& _internal_bar() const; + ::testproto::Bar* _internal_mutable_bar(); + public: + + // @@protoc_insertion_point(class_scope:testproto.Foo) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + ::testproto::Bar* bar_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class MessageType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.MessageType) */ { + public: + MessageType(); + virtual ~MessageType(); + + MessageType(const MessageType& from); + MessageType(MessageType&& from) noexcept + : MessageType() { + *this = ::std::move(from); + } + + inline MessageType& operator=(const MessageType& from) { + CopyFrom(from); + return *this; + } + inline MessageType& operator=(MessageType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const MessageType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const MessageType* internal_default_instance() { + return reinterpret_cast<const MessageType*>( + &_MessageType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 5; + + friend void swap(MessageType& a, MessageType& b) { + a.Swap(&b); + } + inline void Swap(MessageType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline MessageType* New() const final { + return CreateMaybeMessage<MessageType>(nullptr); + } + + MessageType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<MessageType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const MessageType& from); + void MergeFrom(const MessageType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(MessageType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.MessageType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kFooArrFieldNumber = 2, + kFooFieldNumber = 1, + }; + // repeated .testproto.Foo foo_arr = 2; + int foo_arr_size() const; + private: + int _internal_foo_arr_size() const; + public: + void clear_foo_arr(); + ::testproto::Foo* mutable_foo_arr(int index); + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::Foo >* + mutable_foo_arr(); + private: + const ::testproto::Foo& _internal_foo_arr(int index) const; + ::testproto::Foo* _internal_add_foo_arr(); + public: + const ::testproto::Foo& foo_arr(int index) const; + ::testproto::Foo* add_foo_arr(); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::Foo >& + foo_arr() const; + + // .testproto.Foo foo = 1; + bool has_foo() const; + private: + bool _internal_has_foo() const; + public: + void clear_foo(); + const ::testproto::Foo& foo() const; + ::testproto::Foo* release_foo(); + ::testproto::Foo* mutable_foo(); + void set_allocated_foo(::testproto::Foo* foo); + private: + const ::testproto::Foo& _internal_foo() const; + ::testproto::Foo* _internal_mutable_foo(); + public: + + // @@protoc_insertion_point(class_scope:testproto.MessageType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::Foo > foo_arr_; + ::testproto::Foo* foo_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class JsonNaming : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.JsonNaming) */ { + public: + JsonNaming(); + virtual ~JsonNaming(); + + JsonNaming(const JsonNaming& from); + JsonNaming(JsonNaming&& from) noexcept + : JsonNaming() { + *this = ::std::move(from); + } + + inline JsonNaming& operator=(const JsonNaming& from) { + CopyFrom(from); + return *this; + } + inline JsonNaming& operator=(JsonNaming&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const JsonNaming& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const JsonNaming* internal_default_instance() { + return reinterpret_cast<const JsonNaming*>( + &_JsonNaming_default_instance_); + } + static constexpr int kIndexInFileMessages = + 6; + + friend void swap(JsonNaming& a, JsonNaming& b) { + a.Swap(&b); + } + inline void Swap(JsonNaming* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline JsonNaming* New() const final { + return CreateMaybeMessage<JsonNaming>(nullptr); + } + + JsonNaming* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<JsonNaming>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const JsonNaming& from); + void MergeFrom(const JsonNaming& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(JsonNaming* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.JsonNaming"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kFooValueFieldNumber = 1, + kBarValueFieldNumber = 2, + kBazValueFieldNumber = 3, + kQuXValueFieldNumber = 4, + }; + // float foo_value = 1; + void clear_foo_value(); + float foo_value() const; + void set_foo_value(float value); + private: + float _internal_foo_value() const; + void _internal_set_foo_value(float value); + public: + + // float barValue = 2; + void clear_barvalue(); + float barvalue() const; + void set_barvalue(float value); + private: + float _internal_barvalue() const; + void _internal_set_barvalue(float value); + public: + + // float BazValue = 3; + void clear_bazvalue(); + float bazvalue() const; + void set_bazvalue(float value); + private: + float _internal_bazvalue() const; + void _internal_set_bazvalue(float value); + public: + + // float quX_Value = 4; + void clear_qux_value(); + float qux_value() const; + void set_qux_value(float value); + private: + float _internal_qux_value() const; + void _internal_set_qux_value(float value); + public: + + // @@protoc_insertion_point(class_scope:testproto.JsonNaming) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + float foo_value_; + float barvalue_; + float bazvalue_; + float qux_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class OneofValue : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.OneofValue) */ { + public: + OneofValue(); + virtual ~OneofValue(); + + OneofValue(const OneofValue& from); + OneofValue(OneofValue&& from) noexcept + : OneofValue() { + *this = ::std::move(from); + } + + inline OneofValue& operator=(const OneofValue& from) { + CopyFrom(from); + return *this; + } + inline OneofValue& operator=(OneofValue&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const OneofValue& default_instance(); + + enum DataCase { + kStringValue = 1, + kStructValue = 2, + DATA_NOT_SET = 0, + }; + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const OneofValue* internal_default_instance() { + return reinterpret_cast<const OneofValue*>( + &_OneofValue_default_instance_); + } + static constexpr int kIndexInFileMessages = + 7; + + friend void swap(OneofValue& a, OneofValue& b) { + a.Swap(&b); + } + inline void Swap(OneofValue* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline OneofValue* New() const final { + return CreateMaybeMessage<OneofValue>(nullptr); + } + + OneofValue* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<OneofValue>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const OneofValue& from); + void MergeFrom(const OneofValue& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(OneofValue* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.OneofValue"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kStringValueFieldNumber = 1, + kStructValueFieldNumber = 2, + }; + // string string_value = 1; + private: + bool _internal_has_string_value() const; + public: + void clear_string_value(); + const std::string& string_value() const; + void set_string_value(const std::string& value); + void set_string_value(std::string&& value); + void set_string_value(const char* value); + void set_string_value(const char* value, size_t size); + std::string* mutable_string_value(); + std::string* release_string_value(); + void set_allocated_string_value(std::string* string_value); + private: + const std::string& _internal_string_value() const; + void _internal_set_string_value(const std::string& value); + std::string* _internal_mutable_string_value(); + public: + + // .testproto.SimpleStruct struct_value = 2; + bool has_struct_value() const; + private: + bool _internal_has_struct_value() const; + public: + void clear_struct_value(); + const ::testproto::SimpleStruct& struct_value() const; + ::testproto::SimpleStruct* release_struct_value(); + ::testproto::SimpleStruct* mutable_struct_value(); + void set_allocated_struct_value(::testproto::SimpleStruct* struct_value); + private: + const ::testproto::SimpleStruct& _internal_struct_value() const; + ::testproto::SimpleStruct* _internal_mutable_struct_value(); + public: + + void clear_data(); + DataCase data_case() const; + // @@protoc_insertion_point(class_scope:testproto.OneofValue) + private: + class _Internal; + void set_has_string_value(); + void set_has_struct_value(); + + inline bool has_data() const; + inline void clear_has_data(); + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + union DataUnion { + DataUnion() {} + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_; + ::testproto::SimpleStruct* struct_value_; + } data_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + ::PROTOBUF_NAMESPACE_ID::uint32 _oneof_case_[1]; + + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class StringArray : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.StringArray) */ { + public: + StringArray(); + virtual ~StringArray(); + + StringArray(const StringArray& from); + StringArray(StringArray&& from) noexcept + : StringArray() { + *this = ::std::move(from); + } + + inline StringArray& operator=(const StringArray& from) { + CopyFrom(from); + return *this; + } + inline StringArray& operator=(StringArray&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const StringArray& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const StringArray* internal_default_instance() { + return reinterpret_cast<const StringArray*>( + &_StringArray_default_instance_); + } + static constexpr int kIndexInFileMessages = + 8; + + friend void swap(StringArray& a, StringArray& b) { + a.Swap(&b); + } + inline void Swap(StringArray* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline StringArray* New() const final { + return CreateMaybeMessage<StringArray>(nullptr); + } + + StringArray* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<StringArray>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const StringArray& from); + void MergeFrom(const StringArray& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(StringArray* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.StringArray"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kStrArrFieldNumber = 1, + }; + // repeated string str_arr = 1; + int str_arr_size() const; + private: + int _internal_str_arr_size() const; + public: + void clear_str_arr(); + const std::string& str_arr(int index) const; + std::string* mutable_str_arr(int index); + void set_str_arr(int index, const std::string& value); + void set_str_arr(int index, std::string&& value); + void set_str_arr(int index, const char* value); + void set_str_arr(int index, const char* value, size_t size); + std::string* add_str_arr(); + void add_str_arr(const std::string& value); + void add_str_arr(std::string&& value); + void add_str_arr(const char* value); + void add_str_arr(const char* value, size_t size); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& str_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_str_arr(); + private: + const std::string& _internal_str_arr(int index) const; + std::string* _internal_add_str_arr(); + public: + + // @@protoc_insertion_point(class_scope:testproto.StringArray) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> str_arr_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class TwoDimensionalArray : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.TwoDimensionalArray) */ { + public: + TwoDimensionalArray(); + virtual ~TwoDimensionalArray(); + + TwoDimensionalArray(const TwoDimensionalArray& from); + TwoDimensionalArray(TwoDimensionalArray&& from) noexcept + : TwoDimensionalArray() { + *this = ::std::move(from); + } + + inline TwoDimensionalArray& operator=(const TwoDimensionalArray& from) { + CopyFrom(from); + return *this; + } + inline TwoDimensionalArray& operator=(TwoDimensionalArray&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const TwoDimensionalArray& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const TwoDimensionalArray* internal_default_instance() { + return reinterpret_cast<const TwoDimensionalArray*>( + &_TwoDimensionalArray_default_instance_); + } + static constexpr int kIndexInFileMessages = + 9; + + friend void swap(TwoDimensionalArray& a, TwoDimensionalArray& b) { + a.Swap(&b); + } + inline void Swap(TwoDimensionalArray* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline TwoDimensionalArray* New() const final { + return CreateMaybeMessage<TwoDimensionalArray>(nullptr); + } + + TwoDimensionalArray* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<TwoDimensionalArray>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const TwoDimensionalArray& from); + void MergeFrom(const TwoDimensionalArray& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(TwoDimensionalArray* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.TwoDimensionalArray"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kArrFieldNumber = 1, + }; + // repeated .testproto.StringArray arr = 1; + int arr_size() const; + private: + int _internal_arr_size() const; + public: + void clear_arr(); + ::testproto::StringArray* mutable_arr(int index); + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >* + mutable_arr(); + private: + const ::testproto::StringArray& _internal_arr(int index) const; + ::testproto::StringArray* _internal_add_arr(); + public: + const ::testproto::StringArray& arr(int index) const; + ::testproto::StringArray* add_arr(); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >& + arr() const; + + // @@protoc_insertion_point(class_scope:testproto.TwoDimensionalArray) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray > arr_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class BytesType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.BytesType) */ { + public: + BytesType(); + virtual ~BytesType(); + + BytesType(const BytesType& from); + BytesType(BytesType&& from) noexcept + : BytesType() { + *this = ::std::move(from); + } + + inline BytesType& operator=(const BytesType& from) { + CopyFrom(from); + return *this; + } + inline BytesType& operator=(BytesType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const BytesType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const BytesType* internal_default_instance() { + return reinterpret_cast<const BytesType*>( + &_BytesType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 10; + + friend void swap(BytesType& a, BytesType& b) { + a.Swap(&b); + } + inline void Swap(BytesType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline BytesType* New() const final { + return CreateMaybeMessage<BytesType>(nullptr); + } + + BytesType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<BytesType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const BytesType& from); + void MergeFrom(const BytesType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(BytesType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "testproto.BytesType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kBytesValueFieldNumber = 1, + }; + // bytes bytes_value = 1; + void clear_bytes_value(); + const std::string& bytes_value() const; + void set_bytes_value(const std::string& value); + void set_bytes_value(std::string&& value); + void set_bytes_value(const char* value); + void set_bytes_value(const void* value, size_t size); + std::string* mutable_bytes_value(); + std::string* release_bytes_value(); + void set_allocated_bytes_value(std::string* bytes_value); + private: + const std::string& _internal_bytes_value() const; + void _internal_set_bytes_value(const std::string& value); + std::string* _internal_mutable_bytes_value(); + public: + + // @@protoc_insertion_point(class_scope:testproto.BytesType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr bytes_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// =================================================================== + + +// =================================================================== + +#ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// SimpleStruct + +// int64 int_value = 1; +inline void SimpleStruct::clear_int_value() { + int_value_ = PROTOBUF_LONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::_internal_int_value() const { + return int_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::int_value() const { + // @@protoc_insertion_point(field_get:testproto.SimpleStruct.int_value) + return _internal_int_value(); +} +inline void SimpleStruct::_internal_set_int_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + + int_value_ = value; +} +inline void SimpleStruct::set_int_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_set_int_value(value); + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.int_value) +} + +// string string_value = 2; +inline void SimpleStruct::clear_string_value() { + string_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& SimpleStruct::string_value() const { + // @@protoc_insertion_point(field_get:testproto.SimpleStruct.string_value) + return _internal_string_value(); +} +inline void SimpleStruct::set_string_value(const std::string& value) { + _internal_set_string_value(value); + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.string_value) +} +inline std::string* SimpleStruct::mutable_string_value() { + // @@protoc_insertion_point(field_mutable:testproto.SimpleStruct.string_value) + return _internal_mutable_string_value(); +} +inline const std::string& SimpleStruct::_internal_string_value() const { + return string_value_.GetNoArena(); +} +inline void SimpleStruct::_internal_set_string_value(const std::string& value) { + + string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void SimpleStruct::set_string_value(std::string&& value) { + + string_value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:testproto.SimpleStruct.string_value) +} +inline void SimpleStruct::set_string_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:testproto.SimpleStruct.string_value) +} +inline void SimpleStruct::set_string_value(const char* value, size_t size) { + + string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:testproto.SimpleStruct.string_value) +} +inline std::string* SimpleStruct::_internal_mutable_string_value() { + + return string_value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* SimpleStruct::release_string_value() { + // @@protoc_insertion_point(field_release:testproto.SimpleStruct.string_value) + + return string_value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void SimpleStruct::set_allocated_string_value(std::string* string_value) { + if (string_value != nullptr) { + + } else { + + } + string_value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), string_value); + // @@protoc_insertion_point(field_set_allocated:testproto.SimpleStruct.string_value) +} + +// repeated int64 int_arr = 3; +inline int SimpleStruct::_internal_int_arr_size() const { + return int_arr_.size(); +} +inline int SimpleStruct::int_arr_size() const { + return _internal_int_arr_size(); +} +inline void SimpleStruct::clear_int_arr() { + int_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::_internal_int_arr(int index) const { + return int_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::int_arr(int index) const { + // @@protoc_insertion_point(field_get:testproto.SimpleStruct.int_arr) + return _internal_int_arr(index); +} +inline void SimpleStruct::set_int_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value) { + int_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.int_arr) +} +inline void SimpleStruct::_internal_add_int_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + int_arr_.Add(value); +} +inline void SimpleStruct::add_int_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_add_int_arr(value); + // @@protoc_insertion_point(field_add:testproto.SimpleStruct.int_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +SimpleStruct::_internal_int_arr() const { + return int_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +SimpleStruct::int_arr() const { + // @@protoc_insertion_point(field_list:testproto.SimpleStruct.int_arr) + return _internal_int_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +SimpleStruct::_internal_mutable_int_arr() { + return &int_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +SimpleStruct::mutable_int_arr() { + // @@protoc_insertion_point(field_mutable_list:testproto.SimpleStruct.int_arr) + return _internal_mutable_int_arr(); +} + +// repeated string string_arr = 4; +inline int SimpleStruct::_internal_string_arr_size() const { + return string_arr_.size(); +} +inline int SimpleStruct::string_arr_size() const { + return _internal_string_arr_size(); +} +inline void SimpleStruct::clear_string_arr() { + string_arr_.Clear(); +} +inline std::string* SimpleStruct::add_string_arr() { + // @@protoc_insertion_point(field_add_mutable:testproto.SimpleStruct.string_arr) + return _internal_add_string_arr(); +} +inline const std::string& SimpleStruct::_internal_string_arr(int index) const { + return string_arr_.Get(index); +} +inline const std::string& SimpleStruct::string_arr(int index) const { + // @@protoc_insertion_point(field_get:testproto.SimpleStruct.string_arr) + return _internal_string_arr(index); +} +inline std::string* SimpleStruct::mutable_string_arr(int index) { + // @@protoc_insertion_point(field_mutable:testproto.SimpleStruct.string_arr) + return string_arr_.Mutable(index); +} +inline void SimpleStruct::set_string_arr(int index, const std::string& value) { + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.string_arr) + string_arr_.Mutable(index)->assign(value); +} +inline void SimpleStruct::set_string_arr(int index, std::string&& value) { + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.string_arr) + string_arr_.Mutable(index)->assign(std::move(value)); +} +inline void SimpleStruct::set_string_arr(int index, const char* value) { + GOOGLE_DCHECK(value != nullptr); + string_arr_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:testproto.SimpleStruct.string_arr) +} +inline void SimpleStruct::set_string_arr(int index, const char* value, size_t size) { + string_arr_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_set_pointer:testproto.SimpleStruct.string_arr) +} +inline std::string* SimpleStruct::_internal_add_string_arr() { + return string_arr_.Add(); +} +inline void SimpleStruct::add_string_arr(const std::string& value) { + string_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add:testproto.SimpleStruct.string_arr) +} +inline void SimpleStruct::add_string_arr(std::string&& value) { + string_arr_.Add(std::move(value)); + // @@protoc_insertion_point(field_add:testproto.SimpleStruct.string_arr) +} +inline void SimpleStruct::add_string_arr(const char* value) { + GOOGLE_DCHECK(value != nullptr); + string_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:testproto.SimpleStruct.string_arr) +} +inline void SimpleStruct::add_string_arr(const char* value, size_t size) { + string_arr_.Add()->assign(reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_add_pointer:testproto.SimpleStruct.string_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& +SimpleStruct::string_arr() const { + // @@protoc_insertion_point(field_list:testproto.SimpleStruct.string_arr) + return string_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* +SimpleStruct::mutable_string_arr() { + // @@protoc_insertion_point(field_mutable_list:testproto.SimpleStruct.string_arr) + return &string_arr_; +} + +// map<int32, int32> int_map = 5; +inline int SimpleStruct::_internal_int_map_size() const { + return int_map_.size(); +} +inline int SimpleStruct::int_map_size() const { + return _internal_int_map_size(); +} +inline void SimpleStruct::clear_int_map() { + int_map_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >& +SimpleStruct::_internal_int_map() const { + return int_map_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >& +SimpleStruct::int_map() const { + // @@protoc_insertion_point(field_map:testproto.SimpleStruct.int_map) + return _internal_int_map(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >* +SimpleStruct::_internal_mutable_int_map() { + return int_map_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::int32 >* +SimpleStruct::mutable_int_map() { + // @@protoc_insertion_point(field_mutable_map:testproto.SimpleStruct.int_map) + return _internal_mutable_int_map(); +} + +// map<string, string> string_map = 6; +inline int SimpleStruct::_internal_string_map_size() const { + return string_map_.size(); +} +inline int SimpleStruct::string_map_size() const { + return _internal_string_map_size(); +} +inline void SimpleStruct::clear_string_map() { + string_map_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& +SimpleStruct::_internal_string_map() const { + return string_map_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& +SimpleStruct::string_map() const { + // @@protoc_insertion_point(field_map:testproto.SimpleStruct.string_map) + return _internal_string_map(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* +SimpleStruct::_internal_mutable_string_map() { + return string_map_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* +SimpleStruct::mutable_string_map() { + // @@protoc_insertion_point(field_mutable_map:testproto.SimpleStruct.string_map) + return _internal_mutable_string_map(); +} + +// double double_value = 7; +inline void SimpleStruct::clear_double_value() { + double_value_ = 0; +} +inline double SimpleStruct::_internal_double_value() const { + return double_value_; +} +inline double SimpleStruct::double_value() const { + // @@protoc_insertion_point(field_get:testproto.SimpleStruct.double_value) + return _internal_double_value(); +} +inline void SimpleStruct::_internal_set_double_value(double value) { + + double_value_ = value; +} +inline void SimpleStruct::set_double_value(double value) { + _internal_set_double_value(value); + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.double_value) +} + +// uint64 uint64_value = 8; +inline void SimpleStruct::clear_uint64_value() { + uint64_value_ = PROTOBUF_ULONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::_internal_uint64_value() const { + return uint64_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::uint64_value() const { + // @@protoc_insertion_point(field_get:testproto.SimpleStruct.uint64_value) + return _internal_uint64_value(); +} +inline void SimpleStruct::_internal_set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) { + + uint64_value_ = value; +} +inline void SimpleStruct::set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) { + _internal_set_uint64_value(value); + // @@protoc_insertion_point(field_set:testproto.SimpleStruct.uint64_value) +} + +// ------------------------------------------------------------------- + +// Bar + +// string value = 2; +inline void Bar::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& Bar::value() const { + // @@protoc_insertion_point(field_get:testproto.Bar.value) + return _internal_value(); +} +inline void Bar::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:testproto.Bar.value) +} +inline std::string* Bar::mutable_value() { + // @@protoc_insertion_point(field_mutable:testproto.Bar.value) + return _internal_mutable_value(); +} +inline const std::string& Bar::_internal_value() const { + return value_.GetNoArena(); +} +inline void Bar::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void Bar::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:testproto.Bar.value) +} +inline void Bar::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:testproto.Bar.value) +} +inline void Bar::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:testproto.Bar.value) +} +inline std::string* Bar::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* Bar::release_value() { + // @@protoc_insertion_point(field_release:testproto.Bar.value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void Bar::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:testproto.Bar.value) +} + +// ------------------------------------------------------------------- + +// Foo + +// string value = 1; +inline void Foo::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& Foo::value() const { + // @@protoc_insertion_point(field_get:testproto.Foo.value) + return _internal_value(); +} +inline void Foo::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:testproto.Foo.value) +} +inline std::string* Foo::mutable_value() { + // @@protoc_insertion_point(field_mutable:testproto.Foo.value) + return _internal_mutable_value(); +} +inline const std::string& Foo::_internal_value() const { + return value_.GetNoArena(); +} +inline void Foo::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void Foo::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:testproto.Foo.value) +} +inline void Foo::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:testproto.Foo.value) +} +inline void Foo::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:testproto.Foo.value) +} +inline std::string* Foo::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* Foo::release_value() { + // @@protoc_insertion_point(field_release:testproto.Foo.value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void Foo::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:testproto.Foo.value) +} + +// .testproto.Bar bar = 2; +inline bool Foo::_internal_has_bar() const { + return this != internal_default_instance() && bar_ != nullptr; +} +inline bool Foo::has_bar() const { + return _internal_has_bar(); +} +inline void Foo::clear_bar() { + if (GetArenaNoVirtual() == nullptr && bar_ != nullptr) { + delete bar_; + } + bar_ = nullptr; +} +inline const ::testproto::Bar& Foo::_internal_bar() const { + const ::testproto::Bar* p = bar_; + return p != nullptr ? *p : *reinterpret_cast<const ::testproto::Bar*>( + &::testproto::_Bar_default_instance_); +} +inline const ::testproto::Bar& Foo::bar() const { + // @@protoc_insertion_point(field_get:testproto.Foo.bar) + return _internal_bar(); +} +inline ::testproto::Bar* Foo::release_bar() { + // @@protoc_insertion_point(field_release:testproto.Foo.bar) + + ::testproto::Bar* temp = bar_; + bar_ = nullptr; + return temp; +} +inline ::testproto::Bar* Foo::_internal_mutable_bar() { + + if (bar_ == nullptr) { + auto* p = CreateMaybeMessage<::testproto::Bar>(GetArenaNoVirtual()); + bar_ = p; + } + return bar_; +} +inline ::testproto::Bar* Foo::mutable_bar() { + // @@protoc_insertion_point(field_mutable:testproto.Foo.bar) + return _internal_mutable_bar(); +} +inline void Foo::set_allocated_bar(::testproto::Bar* bar) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete bar_; + } + if (bar) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + bar = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, bar, submessage_arena); + } + + } else { + + } + bar_ = bar; + // @@protoc_insertion_point(field_set_allocated:testproto.Foo.bar) +} + +// ------------------------------------------------------------------- + +// MessageType + +// .testproto.Foo foo = 1; +inline bool MessageType::_internal_has_foo() const { + return this != internal_default_instance() && foo_ != nullptr; +} +inline bool MessageType::has_foo() const { + return _internal_has_foo(); +} +inline void MessageType::clear_foo() { + if (GetArenaNoVirtual() == nullptr && foo_ != nullptr) { + delete foo_; + } + foo_ = nullptr; +} +inline const ::testproto::Foo& MessageType::_internal_foo() const { + const ::testproto::Foo* p = foo_; + return p != nullptr ? *p : *reinterpret_cast<const ::testproto::Foo*>( + &::testproto::_Foo_default_instance_); +} +inline const ::testproto::Foo& MessageType::foo() const { + // @@protoc_insertion_point(field_get:testproto.MessageType.foo) + return _internal_foo(); +} +inline ::testproto::Foo* MessageType::release_foo() { + // @@protoc_insertion_point(field_release:testproto.MessageType.foo) + + ::testproto::Foo* temp = foo_; + foo_ = nullptr; + return temp; +} +inline ::testproto::Foo* MessageType::_internal_mutable_foo() { + + if (foo_ == nullptr) { + auto* p = CreateMaybeMessage<::testproto::Foo>(GetArenaNoVirtual()); + foo_ = p; + } + return foo_; +} +inline ::testproto::Foo* MessageType::mutable_foo() { + // @@protoc_insertion_point(field_mutable:testproto.MessageType.foo) + return _internal_mutable_foo(); +} +inline void MessageType::set_allocated_foo(::testproto::Foo* foo) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete foo_; + } + if (foo) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + foo = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, foo, submessage_arena); + } + + } else { + + } + foo_ = foo; + // @@protoc_insertion_point(field_set_allocated:testproto.MessageType.foo) +} + +// repeated .testproto.Foo foo_arr = 2; +inline int MessageType::_internal_foo_arr_size() const { + return foo_arr_.size(); +} +inline int MessageType::foo_arr_size() const { + return _internal_foo_arr_size(); +} +inline void MessageType::clear_foo_arr() { + foo_arr_.Clear(); +} +inline ::testproto::Foo* MessageType::mutable_foo_arr(int index) { + // @@protoc_insertion_point(field_mutable:testproto.MessageType.foo_arr) + return foo_arr_.Mutable(index); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::Foo >* +MessageType::mutable_foo_arr() { + // @@protoc_insertion_point(field_mutable_list:testproto.MessageType.foo_arr) + return &foo_arr_; +} +inline const ::testproto::Foo& MessageType::_internal_foo_arr(int index) const { + return foo_arr_.Get(index); +} +inline const ::testproto::Foo& MessageType::foo_arr(int index) const { + // @@protoc_insertion_point(field_get:testproto.MessageType.foo_arr) + return _internal_foo_arr(index); +} +inline ::testproto::Foo* MessageType::_internal_add_foo_arr() { + return foo_arr_.Add(); +} +inline ::testproto::Foo* MessageType::add_foo_arr() { + // @@protoc_insertion_point(field_add:testproto.MessageType.foo_arr) + return _internal_add_foo_arr(); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::Foo >& +MessageType::foo_arr() const { + // @@protoc_insertion_point(field_list:testproto.MessageType.foo_arr) + return foo_arr_; +} + +// ------------------------------------------------------------------- + +// JsonNaming + +// float foo_value = 1; +inline void JsonNaming::clear_foo_value() { + foo_value_ = 0; +} +inline float JsonNaming::_internal_foo_value() const { + return foo_value_; +} +inline float JsonNaming::foo_value() const { + // @@protoc_insertion_point(field_get:testproto.JsonNaming.foo_value) + return _internal_foo_value(); +} +inline void JsonNaming::_internal_set_foo_value(float value) { + + foo_value_ = value; +} +inline void JsonNaming::set_foo_value(float value) { + _internal_set_foo_value(value); + // @@protoc_insertion_point(field_set:testproto.JsonNaming.foo_value) +} + +// float barValue = 2; +inline void JsonNaming::clear_barvalue() { + barvalue_ = 0; +} +inline float JsonNaming::_internal_barvalue() const { + return barvalue_; +} +inline float JsonNaming::barvalue() const { + // @@protoc_insertion_point(field_get:testproto.JsonNaming.barValue) + return _internal_barvalue(); +} +inline void JsonNaming::_internal_set_barvalue(float value) { + + barvalue_ = value; +} +inline void JsonNaming::set_barvalue(float value) { + _internal_set_barvalue(value); + // @@protoc_insertion_point(field_set:testproto.JsonNaming.barValue) +} + +// float BazValue = 3; +inline void JsonNaming::clear_bazvalue() { + bazvalue_ = 0; +} +inline float JsonNaming::_internal_bazvalue() const { + return bazvalue_; +} +inline float JsonNaming::bazvalue() const { + // @@protoc_insertion_point(field_get:testproto.JsonNaming.BazValue) + return _internal_bazvalue(); +} +inline void JsonNaming::_internal_set_bazvalue(float value) { + + bazvalue_ = value; +} +inline void JsonNaming::set_bazvalue(float value) { + _internal_set_bazvalue(value); + // @@protoc_insertion_point(field_set:testproto.JsonNaming.BazValue) +} + +// float quX_Value = 4; +inline void JsonNaming::clear_qux_value() { + qux_value_ = 0; +} +inline float JsonNaming::_internal_qux_value() const { + return qux_value_; +} +inline float JsonNaming::qux_value() const { + // @@protoc_insertion_point(field_get:testproto.JsonNaming.quX_Value) + return _internal_qux_value(); +} +inline void JsonNaming::_internal_set_qux_value(float value) { + + qux_value_ = value; +} +inline void JsonNaming::set_qux_value(float value) { + _internal_set_qux_value(value); + // @@protoc_insertion_point(field_set:testproto.JsonNaming.quX_Value) +} + +// ------------------------------------------------------------------- + +// OneofValue + +// string string_value = 1; +inline bool OneofValue::_internal_has_string_value() const { + return data_case() == kStringValue; +} +inline void OneofValue::set_has_string_value() { + _oneof_case_[0] = kStringValue; +} +inline void OneofValue::clear_string_value() { + if (_internal_has_string_value()) { + data_.string_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + clear_has_data(); + } +} +inline const std::string& OneofValue::string_value() const { + // @@protoc_insertion_point(field_get:testproto.OneofValue.string_value) + return _internal_string_value(); +} +inline void OneofValue::set_string_value(const std::string& value) { + _internal_set_string_value(value); + // @@protoc_insertion_point(field_set:testproto.OneofValue.string_value) +} +inline std::string* OneofValue::mutable_string_value() { + // @@protoc_insertion_point(field_mutable:testproto.OneofValue.string_value) + return _internal_mutable_string_value(); +} +inline const std::string& OneofValue::_internal_string_value() const { + if (_internal_has_string_value()) { + return data_.string_value_.GetNoArena(); + } + return *&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(); +} +inline void OneofValue::_internal_set_string_value(const std::string& value) { + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void OneofValue::set_string_value(std::string&& value) { + // @@protoc_insertion_point(field_set:testproto.OneofValue.string_value) + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:testproto.OneofValue.string_value) +} +inline void OneofValue::set_string_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(value)); + // @@protoc_insertion_point(field_set_char:testproto.OneofValue.string_value) +} +inline void OneofValue::set_string_value(const char* value, size_t size) { + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string( + reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:testproto.OneofValue.string_value) +} +inline std::string* OneofValue::_internal_mutable_string_value() { + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + return data_.string_value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* OneofValue::release_string_value() { + // @@protoc_insertion_point(field_release:testproto.OneofValue.string_value) + if (_internal_has_string_value()) { + clear_has_data(); + return data_.string_value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } else { + return nullptr; + } +} +inline void OneofValue::set_allocated_string_value(std::string* string_value) { + if (has_data()) { + clear_data(); + } + if (string_value != nullptr) { + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(string_value); + } + // @@protoc_insertion_point(field_set_allocated:testproto.OneofValue.string_value) +} + +// .testproto.SimpleStruct struct_value = 2; +inline bool OneofValue::_internal_has_struct_value() const { + return data_case() == kStructValue; +} +inline bool OneofValue::has_struct_value() const { + return _internal_has_struct_value(); +} +inline void OneofValue::set_has_struct_value() { + _oneof_case_[0] = kStructValue; +} +inline void OneofValue::clear_struct_value() { + if (_internal_has_struct_value()) { + delete data_.struct_value_; + clear_has_data(); + } +} +inline ::testproto::SimpleStruct* OneofValue::release_struct_value() { + // @@protoc_insertion_point(field_release:testproto.OneofValue.struct_value) + if (_internal_has_struct_value()) { + clear_has_data(); + ::testproto::SimpleStruct* temp = data_.struct_value_; + data_.struct_value_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline const ::testproto::SimpleStruct& OneofValue::_internal_struct_value() const { + return _internal_has_struct_value() + ? *data_.struct_value_ + : *reinterpret_cast< ::testproto::SimpleStruct*>(&::testproto::_SimpleStruct_default_instance_); +} +inline const ::testproto::SimpleStruct& OneofValue::struct_value() const { + // @@protoc_insertion_point(field_get:testproto.OneofValue.struct_value) + return _internal_struct_value(); +} +inline ::testproto::SimpleStruct* OneofValue::_internal_mutable_struct_value() { + if (!_internal_has_struct_value()) { + clear_data(); + set_has_struct_value(); + data_.struct_value_ = CreateMaybeMessage< ::testproto::SimpleStruct >( + GetArenaNoVirtual()); + } + return data_.struct_value_; +} +inline ::testproto::SimpleStruct* OneofValue::mutable_struct_value() { + // @@protoc_insertion_point(field_mutable:testproto.OneofValue.struct_value) + return _internal_mutable_struct_value(); +} + +inline bool OneofValue::has_data() const { + return data_case() != DATA_NOT_SET; +} +inline void OneofValue::clear_has_data() { + _oneof_case_[0] = DATA_NOT_SET; +} +inline OneofValue::DataCase OneofValue::data_case() const { + return OneofValue::DataCase(_oneof_case_[0]); +} +// ------------------------------------------------------------------- + +// StringArray + +// repeated string str_arr = 1; +inline int StringArray::_internal_str_arr_size() const { + return str_arr_.size(); +} +inline int StringArray::str_arr_size() const { + return _internal_str_arr_size(); +} +inline void StringArray::clear_str_arr() { + str_arr_.Clear(); +} +inline std::string* StringArray::add_str_arr() { + // @@protoc_insertion_point(field_add_mutable:testproto.StringArray.str_arr) + return _internal_add_str_arr(); +} +inline const std::string& StringArray::_internal_str_arr(int index) const { + return str_arr_.Get(index); +} +inline const std::string& StringArray::str_arr(int index) const { + // @@protoc_insertion_point(field_get:testproto.StringArray.str_arr) + return _internal_str_arr(index); +} +inline std::string* StringArray::mutable_str_arr(int index) { + // @@protoc_insertion_point(field_mutable:testproto.StringArray.str_arr) + return str_arr_.Mutable(index); +} +inline void StringArray::set_str_arr(int index, const std::string& value) { + // @@protoc_insertion_point(field_set:testproto.StringArray.str_arr) + str_arr_.Mutable(index)->assign(value); +} +inline void StringArray::set_str_arr(int index, std::string&& value) { + // @@protoc_insertion_point(field_set:testproto.StringArray.str_arr) + str_arr_.Mutable(index)->assign(std::move(value)); +} +inline void StringArray::set_str_arr(int index, const char* value) { + GOOGLE_DCHECK(value != nullptr); + str_arr_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:testproto.StringArray.str_arr) +} +inline void StringArray::set_str_arr(int index, const char* value, size_t size) { + str_arr_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_set_pointer:testproto.StringArray.str_arr) +} +inline std::string* StringArray::_internal_add_str_arr() { + return str_arr_.Add(); +} +inline void StringArray::add_str_arr(const std::string& value) { + str_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add:testproto.StringArray.str_arr) +} +inline void StringArray::add_str_arr(std::string&& value) { + str_arr_.Add(std::move(value)); + // @@protoc_insertion_point(field_add:testproto.StringArray.str_arr) +} +inline void StringArray::add_str_arr(const char* value) { + GOOGLE_DCHECK(value != nullptr); + str_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:testproto.StringArray.str_arr) +} +inline void StringArray::add_str_arr(const char* value, size_t size) { + str_arr_.Add()->assign(reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_add_pointer:testproto.StringArray.str_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& +StringArray::str_arr() const { + // @@protoc_insertion_point(field_list:testproto.StringArray.str_arr) + return str_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* +StringArray::mutable_str_arr() { + // @@protoc_insertion_point(field_mutable_list:testproto.StringArray.str_arr) + return &str_arr_; +} + +// ------------------------------------------------------------------- + +// TwoDimensionalArray + +// repeated .testproto.StringArray arr = 1; +inline int TwoDimensionalArray::_internal_arr_size() const { + return arr_.size(); +} +inline int TwoDimensionalArray::arr_size() const { + return _internal_arr_size(); +} +inline void TwoDimensionalArray::clear_arr() { + arr_.Clear(); +} +inline ::testproto::StringArray* TwoDimensionalArray::mutable_arr(int index) { + // @@protoc_insertion_point(field_mutable:testproto.TwoDimensionalArray.arr) + return arr_.Mutable(index); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >* +TwoDimensionalArray::mutable_arr() { + // @@protoc_insertion_point(field_mutable_list:testproto.TwoDimensionalArray.arr) + return &arr_; +} +inline const ::testproto::StringArray& TwoDimensionalArray::_internal_arr(int index) const { + return arr_.Get(index); +} +inline const ::testproto::StringArray& TwoDimensionalArray::arr(int index) const { + // @@protoc_insertion_point(field_get:testproto.TwoDimensionalArray.arr) + return _internal_arr(index); +} +inline ::testproto::StringArray* TwoDimensionalArray::_internal_add_arr() { + return arr_.Add(); +} +inline ::testproto::StringArray* TwoDimensionalArray::add_arr() { + // @@protoc_insertion_point(field_add:testproto.TwoDimensionalArray.arr) + return _internal_add_arr(); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >& +TwoDimensionalArray::arr() const { + // @@protoc_insertion_point(field_list:testproto.TwoDimensionalArray.arr) + return arr_; +} + +// ------------------------------------------------------------------- + +// BytesType + +// bytes bytes_value = 1; +inline void BytesType::clear_bytes_value() { + bytes_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& BytesType::bytes_value() const { + // @@protoc_insertion_point(field_get:testproto.BytesType.bytes_value) + return _internal_bytes_value(); +} +inline void BytesType::set_bytes_value(const std::string& value) { + _internal_set_bytes_value(value); + // @@protoc_insertion_point(field_set:testproto.BytesType.bytes_value) +} +inline std::string* BytesType::mutable_bytes_value() { + // @@protoc_insertion_point(field_mutable:testproto.BytesType.bytes_value) + return _internal_mutable_bytes_value(); +} +inline const std::string& BytesType::_internal_bytes_value() const { + return bytes_value_.GetNoArena(); +} +inline void BytesType::_internal_set_bytes_value(const std::string& value) { + + bytes_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void BytesType::set_bytes_value(std::string&& value) { + + bytes_value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:testproto.BytesType.bytes_value) +} +inline void BytesType::set_bytes_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + bytes_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:testproto.BytesType.bytes_value) +} +inline void BytesType::set_bytes_value(const void* value, size_t size) { + + bytes_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:testproto.BytesType.bytes_value) +} +inline std::string* BytesType::_internal_mutable_bytes_value() { + + return bytes_value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* BytesType::release_bytes_value() { + // @@protoc_insertion_point(field_release:testproto.BytesType.bytes_value) + + return bytes_value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void BytesType::set_allocated_bytes_value(std::string* bytes_value) { + if (bytes_value != nullptr) { + + } else { + + } + bytes_value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), bytes_value); + // @@protoc_insertion_point(field_set_allocated:testproto.BytesType.bytes_value) +} + +#ifdef __GNUC__ + #pragma GCC diagnostic pop +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace testproto + +// @@protoc_insertion_point(global_scope) + +#include <google/protobuf/port_undef.inc> +#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_messages_2eproto diff --git a/cpp/tests/util/env.hh b/cpp/tests/util/env.hh new file mode 100644 index 0000000000000000000000000000000000000000..d32fd97f8d66d0f25e76758425e426ae8b449079 --- /dev/null +++ b/cpp/tests/util/env.hh @@ -0,0 +1,29 @@ +#ifndef __VEREIGN_TEST_UTIL_ENV_HH +#define __VEREIGN_TEST_UTIL_ENV_HH + +#include <string> +#include <fmt/core.h> + +namespace vereign::test { + +inline auto RequireEnv(const std::string& name) -> std::string { + auto var = std::getenv(name.c_str()); + if (var == nullptr) { + throw std::runtime_error{fmt::format("{} env variable is required", name)}; + } + + return var; +} + +inline auto GetEnv(const std::string& name, const std::string& default_) -> std::string { + auto var = std::getenv(name.c_str()); + if (var == nullptr) { + return default_; + } + + return var; +} + +} // namespace test + +#endif // __VEREIGN_TEST_UTIL_ENV_HH diff --git a/cpp/tests/util/error.hh b/cpp/tests/util/error.hh new file mode 100644 index 0000000000000000000000000000000000000000..85d7951d333c60aa7c222cab272ff6737798fd95 --- /dev/null +++ b/cpp/tests/util/error.hh @@ -0,0 +1,22 @@ +#ifndef __VEREIGN_TEST_UTIL_ERROR_HH +#define __VEREIGN_TEST_UTIL_ERROR_HH + +#include <optional> + +namespace vereign::test { + +template <class Error, class Fun> +auto CatchError(Fun fn) -> std::optional<Error> { + try { + fn(); + + return {}; + } catch (const Error& err) { + + return err; + } +} + +} // namespace test + +#endif // __VEREIGN_TEST_UTIL_ERROR_HH diff --git a/cpp/tests/util/protobuf.cc b/cpp/tests/util/protobuf.cc new file mode 100644 index 0000000000000000000000000000000000000000..05e1c791a91878f1d09a4c0068227de89e7937e1 --- /dev/null +++ b/cpp/tests/util/protobuf.cc @@ -0,0 +1,19 @@ +#include <vereign/grpc/json/encoder.hh> +#include <util/protobuf.hh> + +#include <google/protobuf/util/json_util.h> + +#include <catch2/catch.hpp> + +namespace vereign { +namespace test { + +auto ProtobufToJson(const google::protobuf::Message& msg) -> std::string { + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + return result; +} + +} // namespace vereign +} // namespace test diff --git a/cpp/tests/util/protobuf.hh b/cpp/tests/util/protobuf.hh new file mode 100644 index 0000000000000000000000000000000000000000..09ca9be1f1b36d9d1444160333d0017ffc396b8e --- /dev/null +++ b/cpp/tests/util/protobuf.hh @@ -0,0 +1,15 @@ +#ifndef __VEREIGN_TEST_UTIL_PROTOBUF_HH +#define __VEREIGN_TEST_UTIL_PROTOBUF_HH + +#include <string> +#include <google/protobuf/message.h> + +namespace vereign { +namespace test { + +std::string ProtobufToJson(const google::protobuf::Message& msg); + +} // namespace vereign +} // namespace test + +#endif // __VEREIGN_TEST_UTIL_PROTOBUF_HH diff --git a/cpp/tests/vereign/CMakeLists.txt b/cpp/tests/vereign/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..0bcfbc6e919333d7cae2525229b4c53b0cf21247 --- /dev/null +++ b/cpp/tests/vereign/CMakeLists.txt @@ -0,0 +1,91 @@ + +if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + add_definitions(-DNOGDI -DNOMINMAX) +endif() + +include_directories( + ${CMAKE_SOURCE_DIR}/src + ${VENDOR_INSTALL_DIR}/include + ${CMAKE_SOURCE_DIR}/proto/cpp + ${Boost_INCLUDE_DIRS} +) + +list(APPEND TESTS_SRC + init_tests.cc + ../util/protobuf.cc + ../experiment/array.cc + test/device.cc + test/service_context.cc + + sync/channel_test.cc + + encoding/base64_test.cc + encoding/hex_test.cc + + bytes/buffer_test.cc + bytes/view_test.cc + + crypto/aes_test.cc + crypto/rsa_test.cc + crypto/digest_test.cc + + restapi/client_test.cc + restapi/client_session_test.cc + + kvstore/lock_test.cc + kvstore/sqlite_storage_test.cc + kvstore/crypto_storage_test.cc + + identity/provider_test.cc + + service/gen/passport_service_test.cc + service/identity_service_test.cc + + grpc/server_test.cc + grpc/json/encoder_test.cc + grpc/identity_api_test.cc +) + +if (WIN32) + list(APPEND TESTS_SRC + ncrypt/rsa_test.cc + ) +endif() + +add_executable(tests ${TESTS_SRC}) + +target_proto_generate( + TARGET tests + SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/grpc/json/proto + GEN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/grpc/json/pb + DEFINITIONS + grpc/json/proto/messages.proto +) + +target_link_libraries(tests + vereignlib + Threads::Threads +) + +if (VEREIGN_ENABLE_BENCHMARKING) + target_compile_definitions(tests PRIVATE CATCH_CONFIG_ENABLE_BENCHMARKING) +endif() + +if (VEREIGN_USE_TIME_TRACE AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + target_compile_options(tests + PRIVATE "-ftime-trace" + ) +endif() + +# add_custom_command( + # TARGET tests + # COMMENT "Run vereign tests" + # POST_BUILD + # WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + # COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/tests "Encode" +# ) + +add_test( + NAME tests + COMMAND tests +) diff --git a/cpp/tests/vereign/bytes/buffer_test.cc b/cpp/tests/vereign/bytes/buffer_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..710c3c184d2111aae21dc02c9b29a9939850842f --- /dev/null +++ b/cpp/tests/vereign/bytes/buffer_test.cc @@ -0,0 +1,491 @@ +#include <vereign/bytes/buffer.hh> + +#include <vereign/bytes/errors.hh> + +#include <catch2/catch.hpp> + +using namespace vereign; + +TEST_CASE("bytes::Buffer::Buffer", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK(buf.Size() == 0); + CHECK(buf.Cap() == 0); + CHECK(buf.FreeCap() == 0); + } + + SECTION("buffer with predefined capacity") { + auto buf = bytes::Buffer{16}; + + CHECK(buf.Size() == 0); + CHECK(buf.Cap() == 16); + CHECK(buf.FreeCap() == 16); + } + + SECTION("buffer from a view") { + auto buf = bytes::Buffer{bytes::View{"foo bar"}}; + + CHECK(buf.Size() == 7); + CHECK(buf.Cap() == 7); + CHECK(buf.FreeCap() == 0); + CHECK(buf.View().String() == "foo bar"); + } + + SECTION("move construct") { + auto old_buf = bytes::Buffer{bytes::View{"foo bar"}}; + auto buf = std::move(old_buf); + + CHECK(old_buf.Size() == 0); + CHECK(old_buf.Cap() == 0); + CHECK(old_buf.FreeCap() == 0); + + CHECK(buf.Size() == 7); + CHECK(buf.Cap() == 7); + CHECK(buf.FreeCap() == 0); + CHECK(buf.View().String() == "foo bar"); + + auto empty = bytes::Buffer{}; + auto new_empty = std::move(empty); + + CHECK(empty.Size() == 0); + CHECK(empty.Cap() == 0); + CHECK(empty.FreeCap() == 0); + + CHECK(new_empty.Size() == 0); + CHECK(new_empty.Cap() == 0); + CHECK(new_empty.FreeCap() == 0); + } + + SECTION("move assign") { + auto foo = bytes::Buffer{bytes::View{"foo"}}; + auto bar = bytes::Buffer{bytes::View{"bar"}}; + + foo = std::move(bar); + + CHECK(foo.Size() == 3); + CHECK(foo.Cap() == 3); + CHECK(foo.FreeCap() == 0); + CHECK(foo.View().String() == "bar"); + + CHECK(bar.Size() == 3); + CHECK(bar.Cap() == 3); + CHECK(bar.FreeCap() == 0); + CHECK(bar.View().String() == "foo"); + + auto empty = bytes::Buffer{}; + foo = std::move(empty); + + CHECK(foo.Size() == 0); + CHECK(foo.Cap() == 0); + CHECK(foo.FreeCap() == 0); + CHECK(foo.View().String() == ""); + + CHECK(empty.Size() == 3); + CHECK(empty.Cap() == 3); + CHECK(empty.FreeCap() == 0); + CHECK(empty.View().String() == "bar"); + + empty = std::move(foo); + + CHECK(empty.Size() == 0); + CHECK(empty.Cap() == 0); + CHECK(empty.FreeCap() == 0); + CHECK(empty.View().String() == ""); + + CHECK(foo.Size() == 3); + CHECK(foo.Cap() == 3); + CHECK(foo.FreeCap() == 0); + CHECK(foo.View().String() == "bar"); + } +} + +TEST_CASE("bytes::Buffer::begin", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK(buf.begin() == nullptr); + } + + SECTION("non empty buffer") { + auto buf = bytes::Buffer{bytes::View("foo bar")}; + + CHECK(buf.begin() != nullptr); + + std::string s; + for (auto& it : buf) { + s += it; + } + + CHECK(s == "foo bar"); + + for (auto& it : buf) { + it = 'x'; + } + + CHECK(buf.View().String() == "xxxxxxx"); + } +} + +TEST_CASE("bytes::Buffer::end", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK(buf.end() == nullptr); + } + + SECTION("non empty buffer") { + auto buf = bytes::Buffer{bytes::View("foo bar")}; + + CHECK(buf.end() != nullptr); + + std::string s; + for (const auto& it : buf) { + s += it; + } + + CHECK(s == "foo bar"); + + for (auto& it : buf) { + it = 'x'; + } + + CHECK(buf.View().String() == "xxxxxxx"); + } + + SECTION("append to the end") { + auto buf = bytes::Buffer{bytes::View("foo bar")}; + + buf.Reserve(4); + std::strncpy((char*)buf.end(), " baz", 4); + buf.IncSize(4); + + CHECK(buf.Size() == 11); + CHECK(buf.View().String() == "foo bar baz"); + } +} + +TEST_CASE("bytes::Buffer::operator[]", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK_THROWS_AS( + buf[0], + bytes::IndexOutOfBounds + ); + } + + SECTION("non empty buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + buf.Reserve(16); + + CHECK(buf.Cap() == 19); + CHECK(buf[0] == 'f'); + CHECK(buf[1] == 'o'); + CHECK(buf[2] == 'o'); + + CHECK_THROWS_AS( + buf[19], + bytes::IndexOutOfBounds + ); + } + + SECTION("modify buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + + buf[0] = 'b'; + buf[1] = 'a'; + buf[2] = 'r'; + + CHECK_THROWS_AS( + buf[3] = 'x', + bytes::IndexOutOfBounds + ); + + CHECK(buf.View().String() == "bar"); + } +} + +TEST_CASE("bytes::Buffer::Size", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK(buf.Size() == 0); + } + + SECTION("non empty buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Size() == 3); + } + + SECTION("append to buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + buf.Write(bytes::View(" bar")); + + CHECK(buf.Size() == 7); + } +} + +TEST_CASE("bytes::Buffer::Cap", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK(buf.Cap() == 0); + } + + SECTION("non empty buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Cap() == 3); + } + + SECTION("append to buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + + // capacity is doubled + buf.Write(bytes::View("b")); + + CHECK(buf.Cap() == 6); + } +} + +TEST_CASE("bytes::Buffer::FreeCap", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + CHECK(buf.FreeCap() == 0); + } + + SECTION("non empty buffer") { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Cap() == 3); + CHECK(buf.FreeCap() == 0); + + buf.Reserve(1); + + CHECK(buf.Cap() - buf.Size() == buf.FreeCap()); + } +} + +TEST_CASE("bytes::Buffer::Reserve", "[vereign/bytes]") { + SECTION("empty buffer") { + auto buf = bytes::Buffer{}; + + buf.Reserve(8); + CHECK(buf.Cap() == 8); + CHECK(buf.Size() == 0); + } + + SECTION("when the required reservation is less than the old capacity*2, it reserves 2*capacity") { + { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Cap() == 3); + CHECK(buf.Size() == 3); + + // capacity is doubled + buf.Reserve(1); + + CHECK(buf.Cap() == 6); + CHECK(buf.FreeCap() == 3); + CHECK(buf.Size() == 3); + } + + { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Cap() == 3); + CHECK(buf.Size() == 3); + + // capacity is doubled + buf.Reserve(2); + + CHECK(buf.Cap() == 6); + CHECK(buf.FreeCap() == 3); + CHECK(buf.Size() == 3); + } + + { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Cap() == 3); + CHECK(buf.Size() == 3); + + // capacity is doubled + buf.Reserve(3); + + CHECK(buf.Cap() == 6); + CHECK(buf.FreeCap() == 3); + CHECK(buf.Size() == 3); + } + } + + SECTION("when the required reservation is greater than the old capacity*2, " + "it reserves capacity+required size") { + auto buf = bytes::Buffer{bytes::View("foo")}; + + CHECK(buf.Cap() == 3); + CHECK(buf.Size() == 3); + + buf.Reserve(4); + + CHECK(buf.Cap() == 7); + CHECK(buf.FreeCap() == 4); + CHECK(buf.Size() == 3); + } +} + +TEST_CASE("bytes::Buffer::IncSize", "[vereign/bytes]") { + SECTION("when IncSize is called on empty buffer, it throws bytes::IncrementOutOfBounds") { + auto buf = bytes::Buffer{}; + + CHECK_THROWS_AS( + buf.IncSize(10), + bytes::IncrementOutOfBounds + ); + } + + SECTION("when IncSize is called with value bigger than the free cap, " + "it throws bytes::IncrementOutOfBounds") { + + auto buf = bytes::Buffer{3}; + + std::strncpy((char*)buf.end(), "bar", 3); + + CHECK_THROWS_AS( + buf.IncSize(4), + bytes::IncrementOutOfBounds + ); + } + + SECTION("when IncSize is called with zero, it does nothing") { + bytes::Buffer buf; + buf.IncSize(0); + + CHECK(buf.Size() == 0); + } + + SECTION("success") { + auto buf = bytes::Buffer{3}; + + std::strncpy((char*)buf.end(), "bar", 3); + + buf.IncSize(3); + + CHECK(buf.Size() == 3); + CHECK(buf.View().String() == "bar"); + } +} + +TEST_CASE("bytes::Buffer::WriteWithinCap", "[vereign/bytes]") { + SECTION("when WriteWithinCap is called on empty buffer, it does nothing") { + auto buf = bytes::Buffer{}; + buf.WriteWithinCap(bytes::View("foo")); + + CHECK(buf.Size() == 0); + CHECK(buf.Cap() == 0); + } + + SECTION("when WriteWithinCap is called with empty source, it does nothing") { + auto buf = bytes::Buffer{3}; + buf.WriteWithinCap(bytes::View()); + + CHECK(buf.Size() == 0); + CHECK(buf.Cap() == 3); + } + + SECTION("when WriteWithinCap is called with source bigger than the free cap, " + "it copies only free cap amount of bytes") { + + auto buf = bytes::Buffer{3}; + buf.WriteWithinCap(bytes::View("foo bar")); + + CHECK(buf.Size() == 3); + CHECK(buf.View().String() == "foo"); + } + + SECTION("when WriteWithinCap is called with source smaller than the free cap, " + "it copies the full source of bytes") { + + auto buf = bytes::Buffer{7}; + buf.WriteWithinCap(bytes::View("foo bar")); + + CHECK(buf.Size() == 7); + CHECK(buf.View().String() == "foo bar"); + } +} + +TEST_CASE("bytes::Buffer::Write", "[vereign/bytes]") { + SECTION("when Write is called on empty buffer, " + "it expands the buffer and writes all the source bytes") { + auto buf = bytes::Buffer{}; + buf.Write(bytes::View("foo")); + + CHECK(buf.Size() == 3); + CHECK(buf.Cap() == 3); + CHECK(buf.View().String() == "foo"); + } + + SECTION("when Write is called with empty source, it does nothing") { + auto buf = bytes::Buffer{3}; + buf.Write(bytes::View()); + + CHECK(buf.Size() == 0); + CHECK(buf.Cap() == 3); + } + + SECTION("when Write is called with source bigger than the free cap, " + "it expands the buffer and writes all the source bytes") { + + auto buf = bytes::Buffer{3}; + buf.Write(bytes::View("foo bar")); + + CHECK(buf.Size() == 7); + CHECK(buf.View().String() == "foo bar"); + } + + SECTION("when Write is called with source smaller than the free cap, " + "it copies the full source of bytes") { + + auto buf = bytes::Buffer{7}; + buf.Write(bytes::View("foo bar")); + + CHECK(buf.Size() == 7); + CHECK(buf.View().String() == "foo bar"); + } +} + +TEST_CASE("bytes::Buffer::View", "[vereign/bytes]") { + SECTION("when the buffer is empty, it returns empty view") { + auto buf = bytes::Buffer{}; + + auto v = buf.View(); + CHECK(v.Size() == 0); + } + + SECTION("when the buffer is not empty, it returns a view of the buffer") { + auto buf = bytes::Buffer{bytes::View("123")}; + + auto v = buf.View(); + CHECK(v.Size() == 3); + CHECK(v.String() == "123"); + + v = buf.View(1); + CHECK(v.Size() == 2); + CHECK(v.String() == "23"); + + v = buf.View(2); + CHECK(v.Size() == 1); + CHECK(v.String() == "3"); + + v = buf.View(3); + CHECK(v.Size() == 0); + CHECK(v.String() == ""); + + v = buf.View(4); + CHECK(v.Size() == 0); + CHECK(v.String() == ""); + } +} diff --git a/cpp/tests/vereign/bytes/view_test.cc b/cpp/tests/vereign/bytes/view_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..1f29ab454d9d40225c45c89adddf1dce7f06036d --- /dev/null +++ b/cpp/tests/vereign/bytes/view_test.cc @@ -0,0 +1,236 @@ +#include <vereign/bytes/view.hh> + +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/errors.hh> + +#include <catch2/catch.hpp> + +using namespace vereign; + +TEST_CASE("bytes::View::View", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.Size() == 0); + } + + SECTION("view from a pointer and a size") { + const uint8_t* data = (uint8_t*)"foo"; + auto v = bytes::View(data, 3); + + CHECK(v.Size() == 3); + CHECK(v.String() == "foo"); + } + + SECTION("view from a void pointer and a size") { + const void* data = (void*)"foo"; + auto v = bytes::View(data, 3); + + CHECK(v.Size() == 3); + CHECK(v.String() == "foo"); + } + + SECTION("view from a string") { + std::string data = "foo"; + auto v = bytes::View(data); + + CHECK(v.Size() == 3); + CHECK(v.String() == "foo"); + } + + SECTION("view from a wide string") { + std::wstring data = L"foo"; + auto v = bytes::View(data); + + CHECK(v.Size() == sizeof(wchar_t)*3); + CHECK(v.WideString() == L"foo"); + } +} + +TEST_CASE("bytes::View::Slice", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.Slice(1).Size() == 0); + } + + SECTION("non-empty view") { + std::string s = "123"; + auto v = bytes::View(s); + + CHECK(v.Slice(0).Size() == 3); + CHECK(v.Slice(0).String() == "123"); + + CHECK(v.Slice(1).Size() == 2); + CHECK(v.Slice(1).String() == "23"); + + CHECK(v.Slice(1, 2).Size() == 1); + CHECK(v.Slice(1, 2).String() == "2"); + + CHECK(v.Slice(1, 3).Size() == 2); + CHECK(v.Slice(1, 3).String() == "23"); + + CHECK(v.Slice(1, 4).Size() == 2); + CHECK(v.Slice(1, 4).String() == "23"); + } + + SECTION("start/end out of bounds") { + std::string s = "123"; + auto v = bytes::View(s); + + CHECK(v.Slice(0).Size() == 3); + CHECK(v.Slice(0).String() == "123"); + + CHECK(v.Slice(3).Size() == 0); + CHECK(v.Slice(3).String() == ""); + + CHECK(v.Slice(4).Size() == 0); + CHECK(v.Slice(4).String() == ""); + + CHECK(v.Slice(1, 4).Size() == 2); + CHECK(v.Slice(1, 4).String() == "23"); + } +} + +TEST_CASE("bytes::View::Data", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.Data() == nullptr); + } + + SECTION("non-empty view") { + std::string s = "123"; + auto v = bytes::View(s); + + CHECK(v.Data()[0] == '1'); + CHECK(v.Data()[1] == '2'); + } +} + +TEST_CASE("bytes::View::CharData", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.CharData() == nullptr); + } + + SECTION("non-empty view") { + std::string s = "123"; + auto v = bytes::View(s); + + const char* data = v.CharData(); + + CHECK(data[0] == '1'); + CHECK(data[1] == '2'); + } +} + +TEST_CASE("bytes::View::WideCharData", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.WideCharData() == nullptr); + } + + SECTION("non-empty view") { + std::wstring s = L"123"; + auto v = bytes::View(s); + + const wchar_t* data = v.WideCharData(); + + CHECK(data[0] == wchar_t('1')); + CHECK(data[1] == wchar_t('2')); + } +} + +TEST_CASE("bytes::View::String", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.String() == ""); + } + + SECTION("non-empty view") { + std::string s = "123"; + auto v = bytes::View(s); + + CHECK(v.String() == "123"); + } +} + +TEST_CASE("bytes::View::WideString", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK(v.WideString() == L""); + } + + SECTION("non-empty view") { + std::wstring s = L"123"; + auto v = bytes::View(s); + + CHECK(v.WideString() == L"123"); + } +} + +TEST_CASE("bytes::View::operator==", "[vereign/bytes]") { + auto s1 = std::string{"foo"}; + auto s2 = std::string{"foo"}; + + CHECK(bytes::View(s1) == bytes::View(s2)); + + s2 = "bar"; + CHECK((bytes::View(s1) == bytes::View(s2)) == false); + + s2 = ""; + CHECK((bytes::View(s1) == bytes::View(s2)) == false); + + auto b1 = crypto::Rand(16); + auto b2 = bytes::Buffer{b1.View()}; + + CHECK(bytes::View(b1.begin(), 16) == bytes::View(b2.begin(), 16)); +} + +TEST_CASE("bytes::View::operator!=", "[vereign/bytes]") { + auto s1 = std::string{"foo"}; + auto s2 = std::string{"foo"}; + + CHECK((bytes::View(s1) != bytes::View(s2)) == false); + + s2 = "bar"; + CHECK(bytes::View(s1) != bytes::View(s2)); + + s2 = ""; + CHECK(bytes::View(s1) != bytes::View(s2)); + + auto b1 = crypto::Rand(16); + auto b2 = bytes::Buffer{b1.View()}; + + CHECK((bytes::View(b1.begin(), 16) != bytes::View(b2.begin(), 16)) == false); +} + +TEST_CASE("bytes::View::operator[]", "[vereign/bytes]") { + SECTION("empty view") { + auto v = bytes::View{}; + + CHECK_THROWS_AS( + v[0], + bytes::IndexOutOfBounds + ); + } + + SECTION("non-empty view") { + auto s = std::string{"123"}; + auto v = bytes::View(s); + + CHECK(v[0] == '1'); + CHECK(v[1] == '2'); + CHECK(v[2] == '3'); + + CHECK_THROWS_AS( + v[3], + bytes::IndexOutOfBounds + ); + } +} diff --git a/cpp/tests/vereign/crypto/aes_test.cc b/cpp/tests/vereign/crypto/aes_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..cfbb694c4e2eaddfd922670ad528a6984ebb0850 --- /dev/null +++ b/cpp/tests/vereign/crypto/aes_test.cc @@ -0,0 +1,25 @@ +#include <vereign/crypto/aes.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/view_dump.hh> + +#include <catch2/catch.hpp> + +#include <iostream> + +using namespace vereign; + +TEST_CASE("aes::GCM256Encrypt", "[vereign/crypto/aes][vereign/crypto]") { + const std::string data{"foo bar"}; + auto key = crypto::Rand(32); + + bytes::Buffer iv; + bytes::Buffer tag; + bytes::Buffer encrypted; + + crypto::aes::GCM256Encrypt(bytes::View(data), key.View(), iv, tag, encrypted); + + bytes::Buffer decrypted; + crypto::aes::GCM256Decrypt(encrypted.View(), key.View(), iv.View(), tag.View(), decrypted); + + CHECK(decrypted.View().String() == data); +} diff --git a/cpp/tests/vereign/crypto/digest_test.cc b/cpp/tests/vereign/crypto/digest_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..0bf6018f3bcc7c1120dc699e8d80024f2c4f3cbb --- /dev/null +++ b/cpp/tests/vereign/crypto/digest_test.cc @@ -0,0 +1,22 @@ +#include <vereign/crypto/digest.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/encoding/hex.hh> + +#include <catch2/catch.hpp> + +#include <iostream> + +using namespace vereign; + +TEST_CASE("digest::sha1", "[vereign/crypto/digest][vereign/crypto]") { + const std::string data{"foo bar"}; + + bytes::Buffer hash; + crypto::digest::sha1(bytes::View(data), hash); + + bytes::Buffer encoded; + encoding::hex::Encode(hash.View(), encoded); + + CHECK(encoded.View().String() == "3773dea65156909838fa6c22825cafe090ff8030"); +} diff --git a/cpp/tests/vereign/crypto/rsa_test.cc b/cpp/tests/vereign/crypto/rsa_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..f9f27acb9b3a20cf0621dd886144a6a7f2b7306b --- /dev/null +++ b/cpp/tests/vereign/crypto/rsa_test.cc @@ -0,0 +1,100 @@ +#include <vereign/crypto/rsa.hh> + +#include <vereign/crypto/rand.hh> +#include <vereign/crypto/bio.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/bytes/buffer.hh> + +#include <catch2/catch.hpp> + +using namespace vereign; + +TEST_CASE("crypto::rsa PublicKeyEncrypt/PrivateKeyDecrypt", "[vereign/crypto/rsa][vereign/crypto]") { + SECTION("small input") { + auto key = crypto::rsa::GenerateKey(2048); + + const std::string input{"foo bar"}; + bytes::Buffer encrypted; + + crypto::rsa::PublicKeyEncrypt(key.get(), bytes::View(input), encrypted); + + bytes::Buffer decrypted; + crypto::rsa::PrivateKeyDecrypt(key.get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == bytes::View(input)); + } + + SECTION("zero input") { + auto key = crypto::rsa::GenerateKey(2048); + + const std::string input; + bytes::Buffer encrypted; + + crypto::rsa::PublicKeyEncrypt(key.get(), bytes::View(input), encrypted); + + bytes::Buffer decrypted; + crypto::rsa::PrivateKeyDecrypt(key.get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == bytes::View(input)); + } + + SECTION("max size input") { + auto key = crypto::rsa::GenerateKey(2048); + + auto input = crypto::Rand(214); + bytes::Buffer encrypted; + + crypto::rsa::PublicKeyEncrypt(key.get(), input.View(), encrypted); + + bytes::Buffer decrypted; + crypto::rsa::PrivateKeyDecrypt(key.get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == input.View()); + } + + SECTION("invalid big input") { + auto key = crypto::rsa::GenerateKey(2048); + + auto input = crypto::Rand(215); + bytes::Buffer encrypted; + + CHECK_THROWS_WITH( + crypto::rsa::PublicKeyEncrypt(key.get(), input.View(), encrypted), + "encrypting failed: DATA_TOO_LARGE_FOR_KEY_SIZE" + ); + + CHECK(encrypted.Size() == 0); + } +} + +TEST_CASE("crypto::rsa::ExportPublicKeyToPEM", "[vereign/crypto/rsa][vereign/crypto]") { + const std::string input{"foo bar"}; + auto key = crypto::rsa::GenerateKey(2048); + + auto bio = crypto::rsa::ExportPublicKeyToPEM(key.get()); + auto imported_key = crypto::rsa::ImportPublicKeyFromPEM(crypto::bio::View(bio.get())); + + bytes::Buffer encrypted; + crypto::rsa::PublicKeyEncrypt(imported_key.get(), bytes::View(input), encrypted); + + bytes::Buffer decrypted; + crypto::rsa::PrivateKeyDecrypt(key.get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == bytes::View(input)); +} + +TEST_CASE("crypto::rsa::ExportPrivateKeyToPEM", "[vereign/crypto/rsa][vereign/crypto]") { + const std::string input{"foo bar"}; + auto key = crypto::rsa::GenerateKey(2048); + + auto bio = crypto::rsa::ExportPrivateKeyToPEM(key.get()); + auto imported_key = crypto::rsa::ImportPrivateKeyFromPEM(crypto::bio::View(bio.get())); + + bytes::Buffer encrypted; + crypto::rsa::PublicKeyEncrypt(key.get(), bytes::View(input), encrypted); + + bytes::Buffer decrypted; + crypto::rsa::PrivateKeyDecrypt(imported_key.get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == bytes::View(input)); +} diff --git a/cpp/tests/vereign/encoding/base64_test.cc b/cpp/tests/vereign/encoding/base64_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..0e6316b90d2de75e8f9cefcf9c4772259355982b --- /dev/null +++ b/cpp/tests/vereign/encoding/base64_test.cc @@ -0,0 +1,86 @@ +#include <vereign/encoding/base64.hh> + +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/view_dump.hh> + +#include <catch2/catch.hpp> + +#include <iostream> + +using namespace vereign; + +TEST_CASE("base64::Encode", "[vereign/encoding/base64][vereign/encoding]") { + SECTION("RFC 4648 test cases plus some extras") { + struct Test { + std::string Input; + std::string Expected; + }; + + using namespace std::string_literals; + + std::vector<Test> tests{ + // taken from RFC 4648 + {"f", "Zg=="}, + {"fo", "Zm8="}, + {"foo", "Zm9v"}, + {"foob", "Zm9vYg=="}, + {"fooba", "Zm9vYmE="}, + {"foobar", "Zm9vYmFy"}, + + // additional test cases + {"", ""}, + {"\x00\x42"s "foobar", "AEJmb29iYXI="} + }; + + for (auto& test : tests) { + bytes::Buffer encoded; + encoding::base64::Encode(bytes::View(test.Input), encoded); + CHECK(test.Expected == encoded.View().String()); + } + } + + SECTION("big input must not contain new lines") { + auto input = crypto::Rand(1024); + bytes::Buffer encoded; + encoding::base64::Encode(input.View(), encoded); + + CHECK(encoded.View().String().find('\n') == std::string::npos); + CHECK(encoded.View().String().find('\r') == std::string::npos); + + bytes::Buffer decoded; + encoding::base64::Decode(encoded.View(), decoded); + + CHECK(input.View() == decoded.View()); + } +} + +TEST_CASE("base64::Decode", "[vereign/encoding/base64][vereign/encoding]") { + SECTION("RFC 4648 test cases plus some extras") { + struct Test { + std::string Expected; + std::string Input; + }; + + using namespace std::string_literals; + + std::vector<Test> tests{ + // taken from RFC 4648 + {"f", "Zg=="}, + {"fo", "Zm8="}, + {"foo", "Zm9v"}, + {"foob", "Zm9vYg=="}, + {"fooba", "Zm9vYmE="}, + {"foobar", "Zm9vYmFy"}, + + // additional test cases + {"", ""}, + {"\x00\x42"s "foobar", "AEJmb29iYXI="} + }; + + for (auto& test : tests) { + bytes::Buffer encoded; + encoding::base64::Decode(bytes::View(test.Input), encoded); + CHECK(test.Expected == encoded.View().String()); + } + } +} diff --git a/cpp/tests/vereign/encoding/hex_test.cc b/cpp/tests/vereign/encoding/hex_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..9b4fefea84b7de42c502de478613888a736578d9 --- /dev/null +++ b/cpp/tests/vereign/encoding/hex_test.cc @@ -0,0 +1,96 @@ +#include <vereign/encoding/hex.hh> + +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/view_dump.hh> + +#include <catch2/catch.hpp> + +using namespace vereign; + +TEST_CASE("encoding::hex::Encode", "[vereign/encoding/hex][vereign/encoding]") { + struct Test { + std::string Input; + std::string Expected; + }; + + using namespace std::string_literals; + + std::vector<Test> tests{ + {"", ""}, + {"f", "66"}, + {"fo", "666f"}, + {"foo", "666f6f"}, + {"foob", "666f6f62"}, + {"fooba", "666f6f6261"}, + {"foobar", "666f6f626172"}, + {"\x00\x42"s "foobar", "0042666f6f626172"} + }; + + for (auto& test : tests) { + bytes::Buffer encoded; + encoding::hex::Encode(bytes::View(test.Input), encoded); + CHECK(test.Expected == encoded.View().String()); + } +} + +TEST_CASE("encoding::hex::Decode", "[vereign/encoding/hex][vereign/encoding]") { + struct Test { + std::string Expected; + std::string Input; + }; + + using namespace std::string_literals; + + std::vector<Test> tests{ + {"", ""}, + {"f", "66"}, + {"fo", "666f"}, + {"foo", "666f6f"}, + {"foob", "666f6f62"}, + {"fooba", "666f6f6261"}, + {"foobar", "666f6f626172"}, + {"\x00\x42"s "foobar", "0042666f6f626172"} + }; + + for (auto& test : tests) { + bytes::Buffer decoded; + encoding::hex::Decode(bytes::View(test.Input), decoded); + CHECK(test.Expected == decoded.View().String()); + } + + auto input = crypto::Rand(16); + + bytes::Buffer encoded; + encoding::hex::Encode(input.View(), encoded); + + bytes::Buffer decoded; + encoding::hex::Decode(encoded.View(), decoded); + + CHECK(input.View() == decoded.View()); +} + +TEST_CASE("encoding::hex::EncodeReverse", "[vereign/encoding/hex][vereign/encoding]") { + struct Test { + std::string Input; + std::string Expected; + }; + + using namespace std::string_literals; + + std::vector<Test> tests{ + {"", ""}, + {"f", "66"}, + {"fo", "6f66"}, + {"foo", "6f6f66"}, + {"foob", "626f6f66"}, + {"fooba", "61626f6f66"}, + {"foobar", "7261626f6f66"}, + {"\x00\x42"s "foobar", "7261626f6f664200"} + }; + + for (auto& test : tests) { + bytes::Buffer encoded; + encoding::hex::EncodeReverse(bytes::View(test.Input), encoded); + CHECK(test.Expected == encoded.View().String()); + } +} diff --git a/cpp/tests/vereign/filesystem/temp.hh b/cpp/tests/vereign/filesystem/temp.hh new file mode 100644 index 0000000000000000000000000000000000000000..62c03d0c08c812e86ae7f9268d6936989db3ac3b --- /dev/null +++ b/cpp/tests/vereign/filesystem/temp.hh @@ -0,0 +1,31 @@ +#ifndef __VEREIGN_FILESYSTEM_TEMP_HH +#define __VEREIGN_FILESYSTEM_TEMP_HH + +namespace vereign::filesystem { + +std::filesystem::path CreateTmpDir() { + // auto tmp_dir = std::filesystem::temp_directory_path(); + // unsigned long long i = 0; + // std::random_device dev; + // std::mt19937 prng(dev()); + // std::uniform_int_distribution<uint64_t> rand(0); + // std::filesystem::path path; + // while (true) { + // std::stringstream ss; + // ss << std::hex << rand(prng); + // path = tmp_dir / ss.str(); + // // true if the directory was created. + // if (std::filesystem::create_directory(path)) { + // break; + // } + // if (i == max_tries) { + // throw std::runtime_error("could not find non-existing directory"); + // } + // i++; + // } + return path; +} + +} // namespace vereign::filesystem + +#endif // __VEREIGN_FILESYSTEM_TEMP_HH diff --git a/cpp/tests/vereign/grpc/identity_api_test.cc b/cpp/tests/vereign/grpc/identity_api_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..516aa71338dbf10660e61d48b0451f55cb647fc6 --- /dev/null +++ b/cpp/tests/vereign/grpc/identity_api_test.cc @@ -0,0 +1,337 @@ +#include <vereign/grpc/server.hh> + +#include <vereign/grpc/error_code.hh> +#include <vereign/core/scope_guard.hh> +#include <vereign/client_library/passport_api.gen.grpc.pb.h> +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/client_library/identity_api.gen.grpc.pb.h> +#include <vereign/service/identity_service.hh> +#include <vereign/fs/util.hh> +#include <vereign/fs/path.hh> +#include <vereign/test/device.hh> +#include <vereign/test/service_context.hh> + +#ifdef _WIN32 +# include <vereign/ncrypt/rsa.hh> +#endif + +#include <util/env.hh> +#include <util/protobuf.hh> +#include <grpcpp/create_channel.h> + +#include <catch2/catch.hpp> + +TEST_CASE("grpc::IdentityAPI::LoginWithPreviouslyAddedDevice", "[vereign/grpc][.integration]") { +#ifdef _WIN32 + SECTION("when the device is not registered yet, it must fail with DeviceNotRegistered error") { + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + + auto provider = vereign::ncrypt::rsa::OpenStorageProvider(); + auto key = vereign::ncrypt::rsa::LoadKey( + provider.Get(), + std::string(vereign::kvstore::VereignKeyName) + ); + if (key) { + vereign::ncrypt::rsa::DeleteKey(key.Get()); + } + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() != ""); + CHECK(login_resp.status() == vereign::grpc::ClientErrorStatus); + REQUIRE(login_resp.code() == vereign::grpc::ErrorCodeAsString( + vereign::grpc::ErrorCode::DeviceNotRegistered + )); + } + + SECTION("when the device key has been changed, it must fail with InvalidIdentity error") { + auto public_key = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + vereign::test::PrepareNewDevice(host, port, public_key, "", storage_path); + + auto provider = vereign::ncrypt::rsa::OpenStorageProvider(); + auto key = vereign::ncrypt::rsa::LoadKey( + provider.Get(), + std::string(vereign::kvstore::VereignKeyName) + ); + if (key) { + vereign::ncrypt::rsa::DeleteKey(key.Get()); + } + + vereign::ncrypt::rsa::CreateKey( + provider.Get(), + 2048, + std::string(vereign::kvstore::VereignKeyName), + {} + ); + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() == "invalid identity"); + CHECK(login_resp.status() == vereign::grpc::ClientErrorStatus); + REQUIRE(login_resp.code() == vereign::grpc::ErrorCodeAsString( + vereign::grpc::ErrorCode::InvalidIdentity + )); + } +#else + SECTION("when the device is not registered yet, it must fail with DeviceNotRegistered error") { + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + login_req.set_pin("foo"); + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() != ""); + CHECK(login_resp.status() == vereign::grpc::ClientErrorStatus); + REQUIRE(login_resp.code() == vereign::grpc::ErrorCodeAsString( + vereign::grpc::ErrorCode::DeviceNotRegistered + )); + } + + SECTION("when the pin is wrong, it must fail with InvalidPinCode error") { + auto public_key = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + const std::string pin = "foo"; + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + vereign::test::PrepareNewDevice(host, port, public_key, pin, storage_path); + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + login_req.set_pin("invalid_pin"); + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() == "invalid pin code"); + CHECK(login_resp.status() == vereign::grpc::ClientErrorStatus); + REQUIRE(login_resp.code() == vereign::grpc::ErrorCodeAsString( + vereign::grpc::ErrorCode::InvalidPinCode + )); + } + + SECTION("when the pin is empty, it must fail with InvalidPinCode error") { + auto public_key = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + const std::string pin = "foo"; + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + vereign::test::PrepareNewDevice(host, port, public_key, pin, storage_path); + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + login_req.set_pin(""); + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() == "invalid pin code"); + CHECK(login_resp.status() == vereign::grpc::ClientErrorStatus); + REQUIRE(login_resp.code() == vereign::grpc::ErrorCodeAsString( + vereign::grpc::ErrorCode::InvalidPinCode + )); + } + +#endif + + SECTION("when the device is not authorized, it must fail with DeviceNotRegistered error") { + auto public_key = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + // the old device is used later for new device confirmation and authorization + auto old_storage_path = vereign::fs::TempFilePath("test_db_"); + auto rm_old_storage_path = vereign::fs::RemoveFileGuard{old_storage_path}; + auto old_device_ctx = vereign::test::ServiceContext{host, port, old_storage_path}; + auto old_device = vereign::test::Device{old_device_ctx}; + old_device.Login(public_key); + + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + const std::string pin = "foo"; + + std::string qr_code; + std::string action_id; + + { + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + + auto register_req = vereign::client_library::LoginFormNewDevice{}; + auto register_resp = vereign::client_library::LoginFormNewDeviceResponse{}; + register_req.set_pin(pin); + + ::grpc::ClientContext register_ctx; + identity_client->LoginWithNewDevice(®ister_ctx, register_req, ®ister_resp); + + CHECK(register_resp.error() == ""); + CHECK(register_resp.status() == "OK"); + REQUIRE(register_resp.code() == "200"); + + qr_code = register_resp.data().qrcode(); + action_id = register_resp.data().actionid(); + } + + { + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + login_req.set_pin(pin); + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() == "Error retrieving entity "); + CHECK(login_resp.status() == "Error while login"); + REQUIRE(login_resp.code() == "400"); + + old_device.ConfirmNewDevice(qr_code, action_id); + + ::grpc::ClientContext login_ctx_confirmed; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx_confirmed, login_req, &login_resp); + + CHECK(login_resp.error() == "Device unauthorized"); + CHECK(login_resp.status() == "Error while login"); + REQUIRE(login_resp.code() == "400"); + } + } +} + +TEST_CASE("grpc::IdentityAPI::LoginWithNewDevice", "[vereign/grpc][.integration]") { +#ifdef _WIN32 +#else + SECTION("when the pin is empty, it must fail with InvalidPinCode error") { + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormNewDevice{}; + auto login_resp = vereign::client_library::LoginFormNewDeviceResponse{}; + login_req.set_pin(""); + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithNewDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() == "invalid pin code"); + CHECK(login_resp.status() == vereign::grpc::ClientErrorStatus); + REQUIRE(login_resp.code() == vereign::grpc::ErrorCodeAsString( + vereign::grpc::ErrorCode::InvalidPinCode + )); + } +#endif // _WIN32 +} diff --git a/cpp/tests/vereign/grpc/json/encoder_test.cc b/cpp/tests/vereign/grpc/json/encoder_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..7cd3095d85dff462f18cf8b8765a4fdbe1d485bb --- /dev/null +++ b/cpp/tests/vereign/grpc/json/encoder_test.cc @@ -0,0 +1,650 @@ +#include <vereign/grpc/json/encoder.hh> +#include <vereign/grpc/json/pb/messages.pb.h> +#include <boost/math/constants/constants.hpp> + +#include <catch2/catch.hpp> + +using namespace vereign; +namespace pb = test::vereign::grpc::json::pb; + +TEST_CASE("grpc::json::Encode scalars", "[vereign/grpc/json]") { + pb::SimpleStruct msg; + msg.set_int32_value(2147483647); + msg.set_int64_value(9223372036854775807); + + msg.set_uint32_value(4294967295); + msg.set_uint64_value(18446744073709551615ULL); + + msg.set_sint32_value(2147483647); + msg.set_sint64_value(9223372036854775807); + + msg.set_fixed32_value(4294967295); + msg.set_fixed64_value(18446744073709551615ULL); + + msg.set_sfixed32_value(2147483647); + msg.set_sfixed64_value(9223372036854775807); + + msg.set_float_value(boost::math::constants::pi<float>()); + msg.set_double_value(boost::math::constants::pi<double>()); + + msg.set_bool_value(true); + msg.set_string_value("foo"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "bool_value": true, + "double_value": 3.141592653589793, + "fixed32_value": 4294967295, + "fixed64_value": 18446744073709551615, + "float_value": 3.1415927410125732, + "int32_value": 2147483647, + "int64_value": 9223372036854775807, + "sfixed32_value": 2147483647, + "sfixed64_value": 9223372036854775807, + "sint32_value": 2147483647, + "sint64_value": 9223372036854775807, + "string_value": "foo", + "uint32_value": 4294967295, + "uint64_value": 18446744073709551615 +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode scalars with OmitEmpty", "[vereign/grpc/json]") { + pb::SimpleStruct msg; + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({"bool_value":false})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode repeated scalars", "[vereign/grpc/json]") { + pb::RepeatedTypes msg; + msg.add_int32_arr(1); + msg.add_int32_arr(2147483647); + + msg.add_int64_arr(2); + msg.add_int64_arr(9223372036854775807); + + msg.add_uint32_arr(3); + msg.add_uint32_arr(4294967295); + + msg.add_uint64_arr(4); + msg.add_uint64_arr(18446744073709551615ULL); + + msg.add_sint32_arr(5); + msg.add_sint32_arr(2147483647); + + msg.add_sint64_arr(6); + msg.add_sint64_arr(9223372036854775807); + + msg.add_fixed32_arr(7); + msg.add_fixed32_arr(4294967295); + + msg.add_fixed64_arr(8); + msg.add_fixed64_arr(18446744073709551615ULL); + + msg.add_sfixed32_arr(9); + msg.add_sfixed32_arr(2147483647); + + msg.add_sfixed64_arr(10); + msg.add_sfixed64_arr(9223372036854775807); + + msg.add_float_arr(11.5); + msg.add_float_arr(boost::math::constants::pi<float>()); + + msg.add_double_arr(12.5); + msg.add_double_arr(boost::math::constants::pi<double>()); + + msg.add_bool_arr(false); + msg.add_bool_arr(true); + + msg.add_string_arr("foo"); + msg.add_string_arr("bar"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "bool_arr": [ + false, + true + ], + "double_arr": [ + 12.5, + 3.141592653589793 + ], + "fixed32_arr": [ + 7, + 4294967295 + ], + "fixed64_arr": [ + 8, + 18446744073709551615 + ], + "float_arr": [ + 11.5, + 3.1415927410125732 + ], + "int32_arr": [ + 1, + 2147483647 + ], + "int64_arr": [ + 2, + 9223372036854775807 + ], + "sfixed32_arr": [ + 9, + 2147483647 + ], + "sfixed64_arr": [ + 10, + 9223372036854775807 + ], + "sint32_arr": [ + 5, + 2147483647 + ], + "sint64_arr": [ + 6, + 9223372036854775807 + ], + "string_arr": [ + "foo", + "bar" + ], + "uint32_arr": [ + 3, + 4294967295 + ], + "uint64_arr": [ + 4, + 18446744073709551615 + ] +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode empty repeated scalars without OmitEmpty", "[vereign/grpc/json]") { + pb::RepeatedTypes msg; + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "bool_arr": [], + "double_arr": [], + "fixed32_arr": [], + "fixed64_arr": [], + "float_arr": [], + "int32_arr": [], + "int64_arr": [], + "sfixed32_arr": [], + "sfixed64_arr": [], + "sint32_arr": [], + "sint64_arr": [], + "string_arr": [], + "uint32_arr": [], + "uint64_arr": [] +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode empty repeated scalars with OmitEmpty", "[vereign/grpc/json]") { + pb::RepeatedTypes msg; + msg.add_int32_arr(0); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({"int32_arr":[0]})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode nested messages", "[vereign/grpc/json]") { + pb::MessageType msg; + msg.mutable_foo()->set_value("foo"); + msg.mutable_foo()->mutable_bar()->set_value("bar"); + + auto foo_arr = msg.add_foo_arr(); + foo_arr->set_value("foo1"); + foo_arr->mutable_bar()->set_value("bar1"); + + foo_arr = msg.add_foo_arr(); + foo_arr->set_value("foo2"); + foo_arr->mutable_bar()->set_value("bar2"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "foo": { + "bar": { + "value": "bar" + }, + "value": "foo" + }, + "foo_arr": [ + { + "bar": { + "value": "bar1" + }, + "value": "foo1" + }, + { + "bar": { + "value": "bar2" + }, + "value": "foo2" + } + ] +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode empty messages without OmitEmpty", "[vereign/grpc/json]") { + pb::MessageType msg; + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + + auto expected = R"({ + "foo": { + "bar": { + "value": "" + }, + "value": "" + }, + "foo_arr": [] +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode empty messages with OmitEmpty", "[vereign/grpc/json]") { + pb::MessageType msg; + msg.add_foo_arr(); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty().Pretty(2)); + + auto expected = R"({ + "foo_arr": [ + {} + ] +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode map", "[vereign/grpc/json]") { + pb::MapType msg; + auto& map = *msg.mutable_int32_key(); + map[2147483647] = "foo"; + map[-1] = "bar"; + (*msg.mutable_int64_key())[9223372036854775807] = "foo"; + + (*msg.mutable_uint32_key())[4294967295] = "foo"; + (*msg.mutable_uint64_key())[18446744073709551615ULL] = "foo"; + + (*msg.mutable_sint32_key())[2147483647] = "foo"; + (*msg.mutable_sint64_key())[9223372036854775807] = "foo"; + + (*msg.mutable_fixed32_key())[4294967295] = "foo"; + (*msg.mutable_fixed64_key())[18446744073709551615ULL] = "foo"; + + (*msg.mutable_sfixed32_key())[2147483647] = "foo"; + (*msg.mutable_sfixed64_key())[9223372036854775807] = "foo"; + + (*msg.mutable_string_key())["bar"] = "foo"; + (*msg.mutable_string_key())["baz"] = "qux"; + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2).WithOmitEmpty()); + + auto expected = R"({ + "fixed32_key": { + "4294967295": "foo" + }, + "fixed64_key": { + "18446744073709551615": "foo" + }, + "int32_key": { + "-1": "bar", + "2147483647": "foo" + }, + "int64_key": { + "9223372036854775807": "foo" + }, + "sfixed32_key": { + "2147483647": "foo" + }, + "sfixed64_key": { + "9223372036854775807": "foo" + }, + "sint32_key": { + "2147483647": "foo" + }, + "sint64_key": { + "9223372036854775807": "foo" + }, + "string_key": { + "bar": "foo", + "baz": "qux" + }, + "uint32_key": { + "4294967295": "foo" + }, + "uint64_key": { + "18446744073709551615": "foo" + } +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode empty map without OmitEmpty", "[vereign/grpc/json]") { + pb::MapType msg; + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "fixed32_key": {}, + "fixed64_key": {}, + "int32_key": {}, + "int64_key": {}, + "sfixed32_key": {}, + "sfixed64_key": {}, + "sint32_key": {}, + "sint64_key": {}, + "string_key": {}, + "uint32_key": {}, + "uint64_key": {} +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode empty map with OmitEmpty", "[vereign/grpc/json]") { + pb::MapType msg; + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode map with Message value", "[vereign/grpc/json]") { + pb::MapMessageType msg; + + auto& map = *msg.mutable_msg(); + map["fred"].mutable_foo()->set_value("foo"); + map["fred"].mutable_foo()->mutable_bar()->set_value("bar"); + + auto fred_arr = map["fred"].add_foo_arr(); + fred_arr->set_value("fred.foo1"); + fred_arr->mutable_bar()->set_value("fred.bar1"); + + fred_arr = map["fred"].add_foo_arr(); + fred_arr->set_value("fred.foo2"); + fred_arr->mutable_bar()->set_value("fred.bar2"); + + auto barney_arr = map["barney"].add_foo_arr(); + barney_arr->set_value("barney.foo1"); + barney_arr->mutable_bar()->set_value("barney.bar1"); + + barney_arr = map["barney"].add_foo_arr(); + barney_arr->set_value("barney.foo2"); + barney_arr->mutable_bar()->set_value("barney.bar2"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "msg": { + "barney": { + "foo": { + "bar": { + "value": "" + }, + "value": "" + }, + "foo_arr": [ + { + "bar": { + "value": "barney.bar1" + }, + "value": "barney.foo1" + }, + { + "bar": { + "value": "barney.bar2" + }, + "value": "barney.foo2" + } + ] + }, + "fred": { + "foo": { + "bar": { + "value": "bar" + }, + "value": "foo" + }, + "foo_arr": [ + { + "bar": { + "value": "fred.bar1" + }, + "value": "fred.foo1" + }, + { + "bar": { + "value": "fred.bar2" + }, + "value": "fred.foo2" + } + ] + } + } +})"; + + CHECK(result == expected); +} + +TEST_CASE("grpc::json::Encode bytes", "[vereign/grpc/json]") { + SECTION("bytes") { + pb::BytesType msg; + + using namespace std::string_literals; + msg.set_bytes_value("\x00\x42"s "foobar"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2).WithOmitEmpty()); + + auto expected = R"({ + "bytes_value": "AEJmb29iYXI=" +})"; + + CHECK(result == expected); + } + + SECTION("repeated bytes") { + using namespace std::string_literals; + + pb::BytesType msg; + msg.add_bytes_arr("\x00\x42"s "foobar"); + msg.add_bytes_arr("\x00\x42"s "foobar"); + msg.add_bytes_arr(""); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2).WithOmitEmpty()); + + auto expected = R"({ + "bytes_arr": [ + "AEJmb29iYXI=", + "AEJmb29iYXI=", + "" + ] +})"; + + CHECK(result == expected); + } +} + +TEST_CASE("grpc::json::Encode naming", "[vereign/grpc/json]") { + pb::JsonNaming msg; + msg.set_foo_value(1); + msg.set_barvalue(2); + msg.set_bazvalue(3); + msg.set_qux_value(4); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "BazValue": 3, + "barValue": 2, + "foo_value": 1, + "quX_Value": 4 +})"; + + REQUIRE(result == expected); +} + +TEST_CASE("grpc::json::Encode oneof", "[vereign/grpc/json]") { + SECTION("marshal string value") { + pb::OneofValue msg; + msg.set_string_value("foo bar"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}); + + auto expected = R"({"string_value":"foo bar"})"; + + CHECK(result == expected); + } + + SECTION("marshal struct value") { + pb::OneofValue msg; + msg.mutable_struct_value()->set_int32_value(42); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({"struct_value":{"bool_value":false,"int32_value":42}})"; + + CHECK(result == expected); + } +} + +TEST_CASE("grpc::json::Encode nested message", "[vereign/grpc/json]") { + SECTION("without OmitEmpty") { + pb::NestedType msg; + msg.set_value("nested value"); + msg.mutable_foo_value()->set_value("nested foo"); + msg.mutable_foo_value()->mutable_bar_value()->set_value("nested bar"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + + auto expected = R"({ + "foo_value": { + "bar_value": { + "Value": "nested bar" + }, + "value": "nested foo" + }, + "value": "nested value" +})"; + + CHECK(result == expected); + } + + SECTION("with OmitEmpty") { + pb::NestedType msg; + msg.set_value("nested value"); + msg.mutable_foo_value()->set_value("nested foo"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2).WithOmitEmpty()); + + auto expected = R"({ + "foo_value": { + "value": "nested foo" + }, + "value": "nested value" +})"; + + CHECK(result == expected); + } +} + +TEST_CASE("grpc::json::Encode enum", "[vereign/grpc/json]") { + SECTION("non-zero value") { + pb::EnumType msg; + msg.set_corpus(pb::EnumType::Corpus::EnumType_Corpus_PRODUCTS); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({"corpus":5})"; + + CHECK(result == expected); + } + + SECTION("zero enum value with OmitEmpty") { + pb::EnumType msg; + msg.set_corpus(pb::EnumType::Corpus::EnumType_Corpus_UNIVERSAL); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({})"; + + CHECK(result == expected); + } + + SECTION("repeated") { + pb::RepeatedEnumType msg; + msg.add_corpus(pb::RepeatedEnumType::Corpus::RepeatedEnumType_Corpus_UNIVERSAL); + msg.add_corpus(pb::RepeatedEnumType::Corpus::RepeatedEnumType_Corpus_PRODUCTS); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.WithOmitEmpty()); + + auto expected = R"({"corpus":[0,5]})"; + + CHECK(result == expected); + } +} + +#ifdef CATCH_CONFIG_ENABLE_BENCHMARKING + +TEST_CASE("grpc::json::Encode nested messages benchmark", "[vereign/grpc/json]") { + BENCHMARK("nested messages") { + pb::MessageType msg; + msg.mutable_foo()->set_value("foo"); + msg.mutable_foo()->mutable_bar()->set_value("bar"); + + std::string result; + grpc::json::Encode(msg, result, grpc::json::EncodeOptions{}.Pretty(2)); + }; +} + +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING diff --git a/cpp/tests/vereign/grpc/json/pb/messages.pb.cc b/cpp/tests/vereign/grpc/json/pb/messages.pb.cc new file mode 100644 index 0000000000000000000000000000000000000000..99aa41e099abeed695f18fb6ef397cf3a0692800 --- /dev/null +++ b/cpp/tests/vereign/grpc/json/pb/messages.pb.cc @@ -0,0 +1,6149 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: messages.proto + +#include "messages.pb.h" + +#include <algorithm> + +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/extension_set.h> +#include <google/protobuf/wire_format_lite.h> +#include <google/protobuf/descriptor.h> +#include <google/protobuf/generated_message_reflection.h> +#include <google/protobuf/reflection_ops.h> +#include <google/protobuf/wire_format.h> +// @@protoc_insertion_point(includes) +#include <google/protobuf/port_def.inc> +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Bar_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_Foo_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_MapMessageType_MsgEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Fixed32KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Fixed64KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Int32KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Int64KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sfixed32KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sfixed64KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sint32KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sint64KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_StringKeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Uint32KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Uint64KeyEntry_DoNotUse_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_MessageType_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_NestedType_NestedFoo_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_NestedType_NestedFoo_NestedBar_messages_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_messages_2eproto; +namespace test { +namespace vereign { +namespace grpc { +namespace json { +namespace pb { +class SimpleStructDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<SimpleStruct> _instance; +} _SimpleStruct_default_instance_; +class RepeatedTypesDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<RepeatedTypes> _instance; +} _RepeatedTypes_default_instance_; +class BarDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<Bar> _instance; +} _Bar_default_instance_; +class FooDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<Foo> _instance; +} _Foo_default_instance_; +class MessageTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MessageType> _instance; +} _MessageType_default_instance_; +class MapType_Int32KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Int32KeyEntry_DoNotUse> _instance; +} _MapType_Int32KeyEntry_DoNotUse_default_instance_; +class MapType_Int64KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Int64KeyEntry_DoNotUse> _instance; +} _MapType_Int64KeyEntry_DoNotUse_default_instance_; +class MapType_Uint32KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Uint32KeyEntry_DoNotUse> _instance; +} _MapType_Uint32KeyEntry_DoNotUse_default_instance_; +class MapType_Uint64KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Uint64KeyEntry_DoNotUse> _instance; +} _MapType_Uint64KeyEntry_DoNotUse_default_instance_; +class MapType_Sint32KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Sint32KeyEntry_DoNotUse> _instance; +} _MapType_Sint32KeyEntry_DoNotUse_default_instance_; +class MapType_Sint64KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Sint64KeyEntry_DoNotUse> _instance; +} _MapType_Sint64KeyEntry_DoNotUse_default_instance_; +class MapType_Fixed32KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Fixed32KeyEntry_DoNotUse> _instance; +} _MapType_Fixed32KeyEntry_DoNotUse_default_instance_; +class MapType_Fixed64KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Fixed64KeyEntry_DoNotUse> _instance; +} _MapType_Fixed64KeyEntry_DoNotUse_default_instance_; +class MapType_Sfixed32KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Sfixed32KeyEntry_DoNotUse> _instance; +} _MapType_Sfixed32KeyEntry_DoNotUse_default_instance_; +class MapType_Sfixed64KeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_Sfixed64KeyEntry_DoNotUse> _instance; +} _MapType_Sfixed64KeyEntry_DoNotUse_default_instance_; +class MapType_StringKeyEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType_StringKeyEntry_DoNotUse> _instance; +} _MapType_StringKeyEntry_DoNotUse_default_instance_; +class MapTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapType> _instance; +} _MapType_default_instance_; +class MapMessageType_MsgEntry_DoNotUseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapMessageType_MsgEntry_DoNotUse> _instance; +} _MapMessageType_MsgEntry_DoNotUse_default_instance_; +class MapMessageTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<MapMessageType> _instance; +} _MapMessageType_default_instance_; +class BytesTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<BytesType> _instance; +} _BytesType_default_instance_; +class JsonNamingDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<JsonNaming> _instance; +} _JsonNaming_default_instance_; +class OneofValueDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<OneofValue> _instance; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_; + const ::test::vereign::grpc::json::pb::SimpleStruct* struct_value_; +} _OneofValue_default_instance_; +class EnumTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<EnumType> _instance; +} _EnumType_default_instance_; +class RepeatedEnumTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<RepeatedEnumType> _instance; +} _RepeatedEnumType_default_instance_; +class NestedType_NestedFoo_NestedBarDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<NestedType_NestedFoo_NestedBar> _instance; +} _NestedType_NestedFoo_NestedBar_default_instance_; +class NestedType_NestedFooDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<NestedType_NestedFoo> _instance; +} _NestedType_NestedFoo_default_instance_; +class NestedTypeDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<NestedType> _instance; +} _NestedType_default_instance_; +} // namespace pb +} // namespace json +} // namespace grpc +} // namespace vereign +} // namespace test +static void InitDefaultsscc_info_Bar_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_Bar_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::Bar(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::Bar::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Bar_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_Bar_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_BytesType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_BytesType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::BytesType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::BytesType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_BytesType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_BytesType_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_EnumType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_EnumType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::EnumType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::EnumType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_EnumType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_EnumType_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_Foo_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_Foo_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::Foo(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::Foo::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_Foo_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_Foo_messages_2eproto}, { + &scc_info_Bar_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_JsonNaming_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_JsonNaming_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::JsonNaming(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::JsonNaming::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_JsonNaming_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_JsonNaming_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapMessageType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapMessageType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapMessageType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::MapMessageType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_MapMessageType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_MapMessageType_messages_2eproto}, { + &scc_info_MapMessageType_MsgEntry_DoNotUse_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_MapMessageType_MsgEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapMessageType_MsgEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_MapMessageType_MsgEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_MapMessageType_MsgEntry_DoNotUse_messages_2eproto}, { + &scc_info_MessageType_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_MapType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::MapType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<11> scc_info_MapType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 11, 0, InitDefaultsscc_info_MapType_messages_2eproto}, { + &scc_info_MapType_Int32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Int64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Uint32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Uint64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sint32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sint64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Fixed32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Fixed64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sfixed32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sfixed64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_StringKeyEntry_DoNotUse_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_MapType_Fixed32KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Fixed32KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Fixed32KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Fixed32KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Fixed64KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Fixed64KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Fixed64KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Fixed64KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Int32KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Int32KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Int32KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Int32KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Int64KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Int64KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Int64KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Int64KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Sfixed32KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Sfixed32KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sfixed32KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Sfixed32KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Sfixed64KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Sfixed64KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sfixed64KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Sfixed64KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Sint32KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Sint32KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sint32KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Sint32KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Sint64KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Sint64KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Sint64KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Sint64KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_StringKeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_StringKeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_StringKeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_StringKeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Uint32KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Uint32KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Uint32KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Uint32KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MapType_Uint64KeyEntry_DoNotUse_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MapType_Uint64KeyEntry_DoNotUse_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse(); + } + ::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_MapType_Uint64KeyEntry_DoNotUse_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_MapType_Uint64KeyEntry_DoNotUse_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_MessageType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_MessageType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::MessageType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::MessageType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_MessageType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_MessageType_messages_2eproto}, { + &scc_info_Foo_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_NestedType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_NestedType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::NestedType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::NestedType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_NestedType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_NestedType_messages_2eproto}, { + &scc_info_NestedType_NestedFoo_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_NestedType_NestedFoo_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_NestedType_NestedFoo_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::NestedType_NestedFoo(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::NestedType_NestedFoo::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_NestedType_NestedFoo_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_NestedType_NestedFoo_messages_2eproto}, { + &scc_info_NestedType_NestedFoo_NestedBar_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_NestedType_NestedFoo_NestedBar_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_NestedType_NestedFoo_NestedBar_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_NestedType_NestedFoo_NestedBar_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_NestedType_NestedFoo_NestedBar_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_OneofValue_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_OneofValue_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::OneofValue(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::OneofValue::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_OneofValue_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_OneofValue_messages_2eproto}, { + &scc_info_SimpleStruct_messages_2eproto.base,}}; + +static void InitDefaultsscc_info_RepeatedEnumType_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_RepeatedEnumType_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::RepeatedEnumType(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::RepeatedEnumType::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_RepeatedEnumType_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_RepeatedEnumType_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_RepeatedTypes_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_RepeatedTypes_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::RepeatedTypes(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::RepeatedTypes::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_RepeatedTypes_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_RepeatedTypes_messages_2eproto}, {}}; + +static void InitDefaultsscc_info_SimpleStruct_messages_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::test::vereign::grpc::json::pb::_SimpleStruct_default_instance_; + new (ptr) ::test::vereign::grpc::json::pb::SimpleStruct(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::test::vereign::grpc::json::pb::SimpleStruct::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_messages_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_SimpleStruct_messages_2eproto}, {}}; + +static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_messages_2eproto[27]; +static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_messages_2eproto[2]; +static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_messages_2eproto = nullptr; + +const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_messages_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, int32_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, int64_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, uint32_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, uint64_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, sint32_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, sint64_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, fixed32_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, fixed64_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, sfixed32_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, sfixed64_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, float_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, double_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, bool_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::SimpleStruct, string_value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, int32_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, int64_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, uint32_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, uint64_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, sint32_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, sint64_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, fixed32_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, fixed64_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, sfixed32_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, sfixed64_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, float_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, double_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, bool_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedTypes, string_arr_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::Bar, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::Bar, value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::Foo, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::Foo, value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::Foo, bar_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MessageType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MessageType, foo_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MessageType, foo_arr_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse, value_), + 0, + 1, + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse, value_), + 0, + 1, + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, int32_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, int64_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, uint32_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, uint64_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, sint32_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, sint64_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, fixed32_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, fixed64_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, sfixed32_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, sfixed64_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapType, string_key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse, _has_bits_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse, key_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse, value_), + 0, + 1, + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapMessageType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::MapMessageType, msg_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::BytesType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::BytesType, bytes_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::BytesType, bytes_arr_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::JsonNaming, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::JsonNaming, foo_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::JsonNaming, barvalue_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::JsonNaming, bazvalue_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::JsonNaming, qux_value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::OneofValue, _internal_metadata_), + ~0u, // no _extensions_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::OneofValue, _oneof_case_[0]), + ~0u, // no _weak_field_map_ + offsetof(::test::vereign::grpc::json::pb::OneofValueDefaultTypeInternal, string_value_), + offsetof(::test::vereign::grpc::json::pb::OneofValueDefaultTypeInternal, struct_value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::OneofValue, data_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::EnumType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::EnumType, corpus_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedEnumType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::RepeatedEnumType, corpus_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar, value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType_NestedFoo, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType_NestedFoo, value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType_NestedFoo, bar_value_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType, value_), + PROTOBUF_FIELD_OFFSET(::test::vereign::grpc::json::pb::NestedType, foo_value_), +}; +static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + { 0, -1, sizeof(::test::vereign::grpc::json::pb::SimpleStruct)}, + { 19, -1, sizeof(::test::vereign::grpc::json::pb::RepeatedTypes)}, + { 38, -1, sizeof(::test::vereign::grpc::json::pb::Bar)}, + { 44, -1, sizeof(::test::vereign::grpc::json::pb::Foo)}, + { 51, -1, sizeof(::test::vereign::grpc::json::pb::MessageType)}, + { 58, 65, sizeof(::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse)}, + { 67, 74, sizeof(::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse)}, + { 76, 83, sizeof(::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse)}, + { 85, 92, sizeof(::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse)}, + { 94, 101, sizeof(::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse)}, + { 103, 110, sizeof(::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse)}, + { 112, 119, sizeof(::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse)}, + { 121, 128, sizeof(::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse)}, + { 130, 137, sizeof(::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse)}, + { 139, 146, sizeof(::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse)}, + { 148, 155, sizeof(::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse)}, + { 157, -1, sizeof(::test::vereign::grpc::json::pb::MapType)}, + { 173, 180, sizeof(::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse)}, + { 182, -1, sizeof(::test::vereign::grpc::json::pb::MapMessageType)}, + { 188, -1, sizeof(::test::vereign::grpc::json::pb::BytesType)}, + { 195, -1, sizeof(::test::vereign::grpc::json::pb::JsonNaming)}, + { 204, -1, sizeof(::test::vereign::grpc::json::pb::OneofValue)}, + { 212, -1, sizeof(::test::vereign::grpc::json::pb::EnumType)}, + { 218, -1, sizeof(::test::vereign::grpc::json::pb::RepeatedEnumType)}, + { 224, -1, sizeof(::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar)}, + { 230, -1, sizeof(::test::vereign::grpc::json::pb::NestedType_NestedFoo)}, + { 237, -1, sizeof(::test::vereign::grpc::json::pb::NestedType)}, +}; + +static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = { + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_SimpleStruct_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_RepeatedTypes_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_Bar_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_Foo_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MessageType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Int32KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Int64KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Uint32KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Uint64KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Sint32KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Sint64KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Fixed32KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Fixed64KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Sfixed32KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_Sfixed64KeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_StringKeyEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapMessageType_MsgEntry_DoNotUse_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_MapMessageType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_BytesType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_JsonNaming_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_OneofValue_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_EnumType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_RepeatedEnumType_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_NestedType_NestedFoo_NestedBar_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_NestedType_NestedFoo_default_instance_), + reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::test::vereign::grpc::json::pb::_NestedType_default_instance_), +}; + +const char descriptor_table_protodef_messages_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = + "\n\016messages.proto\022\031test.vereign.grpc.json" + ".pb\"\303\002\n\014SimpleStruct\022\023\n\013int32_value\030\001 \001(" + "\005\022\023\n\013int64_value\030\002 \001(\003\022\024\n\014uint32_value\030\003" + " \001(\r\022\024\n\014uint64_value\030\004 \001(\004\022\024\n\014sint32_val" + "ue\030\005 \001(\021\022\024\n\014sint64_value\030\006 \001(\022\022\025\n\rfixed3" + "2_value\030\007 \001(\007\022\025\n\rfixed64_value\030\010 \001(\006\022\026\n\016" + "sfixed32_value\030\t \001(\017\022\026\n\016sfixed64_value\030\n" + " \001(\020\022\023\n\013float_value\030\013 \001(\002\022\024\n\014double_valu" + "e\030\014 \001(\001\022\022\n\nbool_value\030\r \001(\010\022\024\n\014string_va" + "lue\030\016 \001(\t\"\250\002\n\rRepeatedTypes\022\021\n\tint32_arr" + "\030\001 \003(\005\022\021\n\tint64_arr\030\002 \003(\003\022\022\n\nuint32_arr\030" + "\003 \003(\r\022\022\n\nuint64_arr\030\004 \003(\004\022\022\n\nsint32_arr\030" + "\005 \003(\021\022\022\n\nsint64_arr\030\006 \003(\022\022\023\n\013fixed32_arr" + "\030\007 \003(\007\022\023\n\013fixed64_arr\030\010 \003(\006\022\024\n\014sfixed32_" + "arr\030\t \003(\017\022\024\n\014sfixed64_arr\030\n \003(\020\022\021\n\tfloat" + "_arr\030\013 \003(\002\022\022\n\ndouble_arr\030\014 \003(\001\022\020\n\010bool_a" + "rr\030\r \003(\010\022\022\n\nstring_arr\030\016 \003(\t\"\024\n\003Bar\022\r\n\005v" + "alue\030\002 \001(\t\"A\n\003Foo\022\r\n\005value\030\001 \001(\t\022+\n\003bar\030" + "\002 \001(\0132\036.test.vereign.grpc.json.pb.Bar\"k\n" + "\013MessageType\022+\n\003foo\030\001 \001(\0132\036.test.vereign" + ".grpc.json.pb.Foo\022/\n\007foo_arr\030\002 \003(\0132\036.tes" + "t.vereign.grpc.json.pb.Foo\"\310\n\n\007MapType\022C" + "\n\tint32_key\030\001 \003(\01320.test.vereign.grpc.js" + "on.pb.MapType.Int32KeyEntry\022C\n\tint64_key" + "\030\002 \003(\01320.test.vereign.grpc.json.pb.MapTy" + "pe.Int64KeyEntry\022E\n\nuint32_key\030\003 \003(\01321.t" + "est.vereign.grpc.json.pb.MapType.Uint32K" + "eyEntry\022E\n\nuint64_key\030\004 \003(\01321.test.verei" + "gn.grpc.json.pb.MapType.Uint64KeyEntry\022E" + "\n\nsint32_key\030\005 \003(\01321.test.vereign.grpc.j" + "son.pb.MapType.Sint32KeyEntry\022E\n\nsint64_" + "key\030\006 \003(\01321.test.vereign.grpc.json.pb.Ma" + "pType.Sint64KeyEntry\022G\n\013fixed32_key\030\007 \003(" + "\01322.test.vereign.grpc.json.pb.MapType.Fi" + "xed32KeyEntry\022G\n\013fixed64_key\030\010 \003(\01322.tes" + "t.vereign.grpc.json.pb.MapType.Fixed64Ke" + "yEntry\022I\n\014sfixed32_key\030\t \003(\01323.test.vere" + "ign.grpc.json.pb.MapType.Sfixed32KeyEntr" + "y\022I\n\014sfixed64_key\030\n \003(\01323.test.vereign.g" + "rpc.json.pb.MapType.Sfixed64KeyEntry\022E\n\n" + "string_key\030\013 \003(\01321.test.vereign.grpc.jso" + "n.pb.MapType.StringKeyEntry\032/\n\rInt32KeyE" + "ntry\022\013\n\003key\030\001 \001(\005\022\r\n\005value\030\002 \001(\t:\0028\001\032/\n\r" + "Int64KeyEntry\022\013\n\003key\030\001 \001(\003\022\r\n\005value\030\002 \001(" + "\t:\0028\001\0320\n\016Uint32KeyEntry\022\013\n\003key\030\001 \001(\r\022\r\n\005" + "value\030\002 \001(\t:\0028\001\0320\n\016Uint64KeyEntry\022\013\n\003key" + "\030\001 \001(\004\022\r\n\005value\030\002 \001(\t:\0028\001\0320\n\016Sint32KeyEn" + "try\022\013\n\003key\030\001 \001(\021\022\r\n\005value\030\002 \001(\t:\0028\001\0320\n\016S" + "int64KeyEntry\022\013\n\003key\030\001 \001(\022\022\r\n\005value\030\002 \001(" + "\t:\0028\001\0321\n\017Fixed32KeyEntry\022\013\n\003key\030\001 \001(\007\022\r\n" + "\005value\030\002 \001(\t:\0028\001\0321\n\017Fixed64KeyEntry\022\013\n\003k" + "ey\030\001 \001(\006\022\r\n\005value\030\002 \001(\t:\0028\001\0322\n\020Sfixed32K" + "eyEntry\022\013\n\003key\030\001 \001(\017\022\r\n\005value\030\002 \001(\t:\0028\001\032" + "2\n\020Sfixed64KeyEntry\022\013\n\003key\030\001 \001(\020\022\r\n\005valu" + "e\030\002 \001(\t:\0028\001\0320\n\016StringKeyEntry\022\013\n\003key\030\001 \001" + "(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"\245\001\n\016MapMessageType" + "\022\?\n\003msg\030\001 \003(\01322.test.vereign.grpc.json.p" + "b.MapMessageType.MsgEntry\032R\n\010MsgEntry\022\013\n" + "\003key\030\001 \001(\t\0225\n\005value\030\002 \001(\0132&.test.vereign" + ".grpc.json.pb.MessageType:\0028\001\"3\n\tBytesTy" + "pe\022\023\n\013bytes_value\030\001 \001(\014\022\021\n\tbytes_arr\030\002 \003" + "(\014\"V\n\nJsonNaming\022\021\n\tfoo_value\030\001 \001(\005\022\020\n\010b" + "arValue\030\002 \001(\005\022\020\n\010BazValue\030\003 \001(\005\022\021\n\tquX_V" + "alue\030\004 \001(\005\"m\n\nOneofValue\022\026\n\014string_value" + "\030\001 \001(\tH\000\022\?\n\014struct_value\030\002 \001(\0132\'.test.ve" + "reign.grpc.json.pb.SimpleStructH\000B\006\n\004dat" + "a\"\242\001\n\010EnumType\022:\n\006corpus\030\004 \001(\0162*.test.ve" + "reign.grpc.json.pb.EnumType.Corpus\"Z\n\006Co" + "rpus\022\r\n\tUNIVERSAL\020\000\022\007\n\003WEB\020\001\022\n\n\006IMAGES\020\002" + "\022\t\n\005LOCAL\020\003\022\010\n\004NEWS\020\004\022\014\n\010PRODUCTS\020\005\022\t\n\005V" + "IDEO\020\006\"\262\001\n\020RepeatedEnumType\022B\n\006corpus\030\004 " + "\003(\01622.test.vereign.grpc.json.pb.Repeated" + "EnumType.Corpus\"Z\n\006Corpus\022\r\n\tUNIVERSAL\020\000" + "\022\007\n\003WEB\020\001\022\n\n\006IMAGES\020\002\022\t\n\005LOCAL\020\003\022\010\n\004NEWS" + "\020\004\022\014\n\010PRODUCTS\020\005\022\t\n\005VIDEO\020\006\"\346\001\n\nNestedTy" + "pe\022\r\n\005value\030\001 \001(\t\022B\n\tfoo_value\030\002 \001(\0132/.t" + "est.vereign.grpc.json.pb.NestedType.Nest" + "edFoo\032\204\001\n\tNestedFoo\022\r\n\005value\030\001 \001(\t\022L\n\tba" + "r_value\030\002 \001(\01329.test.vereign.grpc.json.p" + "b.NestedType.NestedFoo.NestedBar\032\032\n\tNest" + "edBar\022\r\n\005Value\030\001 \001(\tb\006proto3" + ; +static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_messages_2eproto_deps[1] = { +}; +static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_messages_2eproto_sccs[27] = { + &scc_info_Bar_messages_2eproto.base, + &scc_info_BytesType_messages_2eproto.base, + &scc_info_EnumType_messages_2eproto.base, + &scc_info_Foo_messages_2eproto.base, + &scc_info_JsonNaming_messages_2eproto.base, + &scc_info_MapMessageType_messages_2eproto.base, + &scc_info_MapMessageType_MsgEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_messages_2eproto.base, + &scc_info_MapType_Fixed32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Fixed64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Int32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Int64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sfixed32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sfixed64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sint32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Sint64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_StringKeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Uint32KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MapType_Uint64KeyEntry_DoNotUse_messages_2eproto.base, + &scc_info_MessageType_messages_2eproto.base, + &scc_info_NestedType_messages_2eproto.base, + &scc_info_NestedType_NestedFoo_messages_2eproto.base, + &scc_info_NestedType_NestedFoo_NestedBar_messages_2eproto.base, + &scc_info_OneofValue_messages_2eproto.base, + &scc_info_RepeatedEnumType_messages_2eproto.base, + &scc_info_RepeatedTypes_messages_2eproto.base, + &scc_info_SimpleStruct_messages_2eproto.base, +}; +static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_messages_2eproto_once; +static bool descriptor_table_messages_2eproto_initialized = false; +const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_messages_2eproto = { + &descriptor_table_messages_2eproto_initialized, descriptor_table_protodef_messages_2eproto, "messages.proto", 3228, + &descriptor_table_messages_2eproto_once, descriptor_table_messages_2eproto_sccs, descriptor_table_messages_2eproto_deps, 27, 0, + schemas, file_default_instances, TableStruct_messages_2eproto::offsets, + file_level_metadata_messages_2eproto, 27, file_level_enum_descriptors_messages_2eproto, file_level_service_descriptors_messages_2eproto, +}; + +// Force running AddDescriptors() at dynamic initialization time. +static bool dynamic_init_dummy_messages_2eproto = ( ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_messages_2eproto), true); +namespace test { +namespace vereign { +namespace grpc { +namespace json { +namespace pb { +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* EnumType_Corpus_descriptor() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_messages_2eproto); + return file_level_enum_descriptors_messages_2eproto[0]; +} +bool EnumType_Corpus_IsValid(int value) { + switch (value) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + return true; + default: + return false; + } +} + +#if (__cplusplus < 201703) && (!defined(_MSC_VER) || _MSC_VER >= 1900) +constexpr EnumType_Corpus EnumType::UNIVERSAL; +constexpr EnumType_Corpus EnumType::WEB; +constexpr EnumType_Corpus EnumType::IMAGES; +constexpr EnumType_Corpus EnumType::LOCAL; +constexpr EnumType_Corpus EnumType::NEWS; +constexpr EnumType_Corpus EnumType::PRODUCTS; +constexpr EnumType_Corpus EnumType::VIDEO; +constexpr EnumType_Corpus EnumType::Corpus_MIN; +constexpr EnumType_Corpus EnumType::Corpus_MAX; +constexpr int EnumType::Corpus_ARRAYSIZE; +#endif // (__cplusplus < 201703) && (!defined(_MSC_VER) || _MSC_VER >= 1900) +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* RepeatedEnumType_Corpus_descriptor() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_messages_2eproto); + return file_level_enum_descriptors_messages_2eproto[1]; +} +bool RepeatedEnumType_Corpus_IsValid(int value) { + switch (value) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + return true; + default: + return false; + } +} + +#if (__cplusplus < 201703) && (!defined(_MSC_VER) || _MSC_VER >= 1900) +constexpr RepeatedEnumType_Corpus RepeatedEnumType::UNIVERSAL; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::WEB; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::IMAGES; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::LOCAL; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::NEWS; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::PRODUCTS; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::VIDEO; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::Corpus_MIN; +constexpr RepeatedEnumType_Corpus RepeatedEnumType::Corpus_MAX; +constexpr int RepeatedEnumType::Corpus_ARRAYSIZE; +#endif // (__cplusplus < 201703) && (!defined(_MSC_VER) || _MSC_VER >= 1900) + +// =================================================================== + +void SimpleStruct::InitAsDefaultInstance() { +} +class SimpleStruct::_Internal { + public: +}; + +SimpleStruct::SimpleStruct() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.SimpleStruct) +} +SimpleStruct::SimpleStruct(const SimpleStruct& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_string_value().empty()) { + string_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.string_value_); + } + ::memcpy(&int64_value_, &from.int64_value_, + static_cast<size_t>(reinterpret_cast<char*>(&bool_value_) - + reinterpret_cast<char*>(&int64_value_)) + sizeof(bool_value_)); + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.SimpleStruct) +} + +void SimpleStruct::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SimpleStruct_messages_2eproto.base); + string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&int64_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&bool_value_) - + reinterpret_cast<char*>(&int64_value_)) + sizeof(bool_value_)); +} + +SimpleStruct::~SimpleStruct() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.SimpleStruct) + SharedDtor(); +} + +void SimpleStruct::SharedDtor() { + string_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void SimpleStruct::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const SimpleStruct& SimpleStruct::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_SimpleStruct_messages_2eproto.base); + return *internal_default_instance(); +} + + +void SimpleStruct::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.SimpleStruct) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + string_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&int64_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&bool_value_) - + reinterpret_cast<char*>(&int64_value_)) + sizeof(bool_value_)); + _internal_metadata_.Clear(); +} + +const char* SimpleStruct::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // int32 int32_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + int32_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // int64 int64_value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 16)) { + int64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // uint32 uint32_value = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 24)) { + uint32_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // uint64 uint64_value = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) { + uint64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // sint32 sint32_value = 5; + case 5: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 40)) { + sint32_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarintZigZag32(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // sint64 sint64_value = 6; + case 6: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 48)) { + sint64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarintZigZag64(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // fixed32 fixed32_value = 7; + case 7: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 61)) { + fixed32_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint32>(ptr); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::uint32); + } else goto handle_unusual; + continue; + // fixed64 fixed64_value = 8; + case 8: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 65)) { + fixed64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::uint64); + } else goto handle_unusual; + continue; + // sfixed32 sfixed32_value = 9; + case 9: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 77)) { + sfixed32_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::int32>(ptr); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::int32); + } else goto handle_unusual; + continue; + // sfixed64 sfixed64_value = 10; + case 10: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 81)) { + sfixed64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::int64>(ptr); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::int64); + } else goto handle_unusual; + continue; + // float float_value = 11; + case 11: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 93)) { + float_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr); + ptr += sizeof(float); + } else goto handle_unusual; + continue; + // double double_value = 12; + case 12: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 97)) { + double_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr); + ptr += sizeof(double); + } else goto handle_unusual; + continue; + // bool bool_value = 13; + case 13: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 104)) { + bool_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // string string_value = 14; + case 14: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 114)) { + auto str = _internal_mutable_string_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.SimpleStruct.string_value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* SimpleStruct::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.SimpleStruct) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // int32 int32_value = 1; + if (this->int32_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(1, this->_internal_int32_value(), target); + } + + // int64 int64_value = 2; + if (this->int64_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt64ToArray(2, this->_internal_int64_value(), target); + } + + // uint32 uint32_value = 3; + if (this->uint32_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32ToArray(3, this->_internal_uint32_value(), target); + } + + // uint64 uint64_value = 4; + if (this->uint64_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(4, this->_internal_uint64_value(), target); + } + + // sint32 sint32_value = 5; + if (this->sint32_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteSInt32ToArray(5, this->_internal_sint32_value(), target); + } + + // sint64 sint64_value = 6; + if (this->sint64_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteSInt64ToArray(6, this->_internal_sint64_value(), target); + } + + // fixed32 fixed32_value = 7; + if (this->fixed32_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFixed32ToArray(7, this->_internal_fixed32_value(), target); + } + + // fixed64 fixed64_value = 8; + if (this->fixed64_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFixed64ToArray(8, this->_internal_fixed64_value(), target); + } + + // sfixed32 sfixed32_value = 9; + if (this->sfixed32_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteSFixed32ToArray(9, this->_internal_sfixed32_value(), target); + } + + // sfixed64 sfixed64_value = 10; + if (this->sfixed64_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteSFixed64ToArray(10, this->_internal_sfixed64_value(), target); + } + + // float float_value = 11; + if (!(this->float_value() <= 0 && this->float_value() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteFloatToArray(11, this->_internal_float_value(), target); + } + + // double double_value = 12; + if (!(this->double_value() <= 0 && this->double_value() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteDoubleToArray(12, this->_internal_double_value(), target); + } + + // bool bool_value = 13; + if (this->bool_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteBoolToArray(13, this->_internal_bool_value(), target); + } + + // string string_value = 14; + if (this->string_value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_string_value().data(), static_cast<int>(this->_internal_string_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.SimpleStruct.string_value"); + target = stream->WriteStringMaybeAliased( + 14, this->_internal_string_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.SimpleStruct) + return target; +} + +size_t SimpleStruct::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.SimpleStruct) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string string_value = 14; + if (this->string_value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_string_value()); + } + + // int64 int64_value = 2; + if (this->int64_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int64Size( + this->_internal_int64_value()); + } + + // int32 int32_value = 1; + if (this->int32_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + this->_internal_int32_value()); + } + + // uint32 uint32_value = 3; + if (this->uint32_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt32Size( + this->_internal_uint32_value()); + } + + // uint64 uint64_value = 4; + if (this->uint64_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt64Size( + this->_internal_uint64_value()); + } + + // sint64 sint64_value = 6; + if (this->sint64_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SInt64Size( + this->_internal_sint64_value()); + } + + // sint32 sint32_value = 5; + if (this->sint32_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SInt32Size( + this->_internal_sint32_value()); + } + + // fixed32 fixed32_value = 7; + if (this->fixed32_value() != 0) { + total_size += 1 + 4; + } + + // fixed64 fixed64_value = 8; + if (this->fixed64_value() != 0) { + total_size += 1 + 8; + } + + // sfixed64 sfixed64_value = 10; + if (this->sfixed64_value() != 0) { + total_size += 1 + 8; + } + + // sfixed32 sfixed32_value = 9; + if (this->sfixed32_value() != 0) { + total_size += 1 + 4; + } + + // float float_value = 11; + if (!(this->float_value() <= 0 && this->float_value() >= 0)) { + total_size += 1 + 4; + } + + // double double_value = 12; + if (!(this->double_value() <= 0 && this->double_value() >= 0)) { + total_size += 1 + 8; + } + + // bool bool_value = 13; + if (this->bool_value() != 0) { + total_size += 1 + 1; + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void SimpleStruct::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.SimpleStruct) + GOOGLE_DCHECK_NE(&from, this); + const SimpleStruct* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<SimpleStruct>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.SimpleStruct) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.SimpleStruct) + MergeFrom(*source); + } +} + +void SimpleStruct::MergeFrom(const SimpleStruct& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.SimpleStruct) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.string_value().size() > 0) { + + string_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.string_value_); + } + if (from.int64_value() != 0) { + _internal_set_int64_value(from._internal_int64_value()); + } + if (from.int32_value() != 0) { + _internal_set_int32_value(from._internal_int32_value()); + } + if (from.uint32_value() != 0) { + _internal_set_uint32_value(from._internal_uint32_value()); + } + if (from.uint64_value() != 0) { + _internal_set_uint64_value(from._internal_uint64_value()); + } + if (from.sint64_value() != 0) { + _internal_set_sint64_value(from._internal_sint64_value()); + } + if (from.sint32_value() != 0) { + _internal_set_sint32_value(from._internal_sint32_value()); + } + if (from.fixed32_value() != 0) { + _internal_set_fixed32_value(from._internal_fixed32_value()); + } + if (from.fixed64_value() != 0) { + _internal_set_fixed64_value(from._internal_fixed64_value()); + } + if (from.sfixed64_value() != 0) { + _internal_set_sfixed64_value(from._internal_sfixed64_value()); + } + if (from.sfixed32_value() != 0) { + _internal_set_sfixed32_value(from._internal_sfixed32_value()); + } + if (!(from.float_value() <= 0 && from.float_value() >= 0)) { + _internal_set_float_value(from._internal_float_value()); + } + if (!(from.double_value() <= 0 && from.double_value() >= 0)) { + _internal_set_double_value(from._internal_double_value()); + } + if (from.bool_value() != 0) { + _internal_set_bool_value(from._internal_bool_value()); + } +} + +void SimpleStruct::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.SimpleStruct) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void SimpleStruct::CopyFrom(const SimpleStruct& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.SimpleStruct) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool SimpleStruct::IsInitialized() const { + return true; +} + +void SimpleStruct::InternalSwap(SimpleStruct* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + string_value_.Swap(&other->string_value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(int64_value_, other->int64_value_); + swap(int32_value_, other->int32_value_); + swap(uint32_value_, other->uint32_value_); + swap(uint64_value_, other->uint64_value_); + swap(sint64_value_, other->sint64_value_); + swap(sint32_value_, other->sint32_value_); + swap(fixed32_value_, other->fixed32_value_); + swap(fixed64_value_, other->fixed64_value_); + swap(sfixed64_value_, other->sfixed64_value_); + swap(sfixed32_value_, other->sfixed32_value_); + swap(float_value_, other->float_value_); + swap(double_value_, other->double_value_); + swap(bool_value_, other->bool_value_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata SimpleStruct::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void RepeatedTypes::InitAsDefaultInstance() { +} +class RepeatedTypes::_Internal { + public: +}; + +RepeatedTypes::RepeatedTypes() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.RepeatedTypes) +} +RepeatedTypes::RepeatedTypes(const RepeatedTypes& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + int32_arr_(from.int32_arr_), + int64_arr_(from.int64_arr_), + uint32_arr_(from.uint32_arr_), + uint64_arr_(from.uint64_arr_), + sint32_arr_(from.sint32_arr_), + sint64_arr_(from.sint64_arr_), + fixed32_arr_(from.fixed32_arr_), + fixed64_arr_(from.fixed64_arr_), + sfixed32_arr_(from.sfixed32_arr_), + sfixed64_arr_(from.sfixed64_arr_), + float_arr_(from.float_arr_), + double_arr_(from.double_arr_), + bool_arr_(from.bool_arr_), + string_arr_(from.string_arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.RepeatedTypes) +} + +void RepeatedTypes::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_RepeatedTypes_messages_2eproto.base); +} + +RepeatedTypes::~RepeatedTypes() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.RepeatedTypes) + SharedDtor(); +} + +void RepeatedTypes::SharedDtor() { +} + +void RepeatedTypes::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const RepeatedTypes& RepeatedTypes::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_RepeatedTypes_messages_2eproto.base); + return *internal_default_instance(); +} + + +void RepeatedTypes::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.RepeatedTypes) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + int32_arr_.Clear(); + int64_arr_.Clear(); + uint32_arr_.Clear(); + uint64_arr_.Clear(); + sint32_arr_.Clear(); + sint64_arr_.Clear(); + fixed32_arr_.Clear(); + fixed64_arr_.Clear(); + sfixed32_arr_.Clear(); + sfixed64_arr_.Clear(); + float_arr_.Clear(); + double_arr_.Clear(); + bool_arr_.Clear(); + string_arr_.Clear(); + _internal_metadata_.Clear(); +} + +const char* RepeatedTypes::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // repeated int32 int32_arr = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt32Parser(_internal_mutable_int32_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8) { + _internal_add_int32_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated int64 int64_arr = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt64Parser(_internal_mutable_int64_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 16) { + _internal_add_int64_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated uint32 uint32_arr = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedUInt32Parser(_internal_mutable_uint32_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 24) { + _internal_add_uint32_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated uint64 uint64_arr = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedUInt64Parser(_internal_mutable_uint64_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32) { + _internal_add_uint64_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated sint32 sint32_arr = 5; + case 5: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 42)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedSInt32Parser(_internal_mutable_sint32_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 40) { + _internal_add_sint32_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarintZigZag32(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated sint64 sint64_arr = 6; + case 6: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 50)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedSInt64Parser(_internal_mutable_sint64_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 48) { + _internal_add_sint64_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarintZigZag64(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated fixed32 fixed32_arr = 7; + case 7: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 58)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedFixed32Parser(_internal_mutable_fixed32_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 61) { + _internal_add_fixed32_arr(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint32>(ptr)); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::uint32); + } else goto handle_unusual; + continue; + // repeated fixed64 fixed64_arr = 8; + case 8: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 66)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedFixed64Parser(_internal_mutable_fixed64_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 65) { + _internal_add_fixed64_arr(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr)); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::uint64); + } else goto handle_unusual; + continue; + // repeated sfixed32 sfixed32_arr = 9; + case 9: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 74)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedSFixed32Parser(_internal_mutable_sfixed32_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 77) { + _internal_add_sfixed32_arr(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::int32>(ptr)); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::int32); + } else goto handle_unusual; + continue; + // repeated sfixed64 sfixed64_arr = 10; + case 10: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 82)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedSFixed64Parser(_internal_mutable_sfixed64_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 81) { + _internal_add_sfixed64_arr(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::int64>(ptr)); + ptr += sizeof(::PROTOBUF_NAMESPACE_ID::int64); + } else goto handle_unusual; + continue; + // repeated float float_arr = 11; + case 11: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 90)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedFloatParser(_internal_mutable_float_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 93) { + _internal_add_float_arr(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr)); + ptr += sizeof(float); + } else goto handle_unusual; + continue; + // repeated double double_arr = 12; + case 12: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 98)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedDoubleParser(_internal_mutable_double_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 97) { + _internal_add_double_arr(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr)); + ptr += sizeof(double); + } else goto handle_unusual; + continue; + // repeated bool bool_arr = 13; + case 13: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 106)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedBoolParser(_internal_mutable_bool_arr(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 104) { + _internal_add_bool_arr(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr)); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated string string_arr = 14; + case 14: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 114)) { + ptr -= 1; + do { + ptr += 1; + auto str = _internal_add_string_arr(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.RepeatedTypes.string_arr")); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<114>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* RepeatedTypes::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.RepeatedTypes) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // repeated int32 int32_arr = 1; + { + int byte_size = _int32_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteInt32Packed( + 1, _internal_int32_arr(), byte_size, target); + } + } + + // repeated int64 int64_arr = 2; + { + int byte_size = _int64_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteInt64Packed( + 2, _internal_int64_arr(), byte_size, target); + } + } + + // repeated uint32 uint32_arr = 3; + { + int byte_size = _uint32_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteUInt32Packed( + 3, _internal_uint32_arr(), byte_size, target); + } + } + + // repeated uint64 uint64_arr = 4; + { + int byte_size = _uint64_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteUInt64Packed( + 4, _internal_uint64_arr(), byte_size, target); + } + } + + // repeated sint32 sint32_arr = 5; + { + int byte_size = _sint32_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteSInt32Packed( + 5, _internal_sint32_arr(), byte_size, target); + } + } + + // repeated sint64 sint64_arr = 6; + { + int byte_size = _sint64_arr_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteSInt64Packed( + 6, _internal_sint64_arr(), byte_size, target); + } + } + + // repeated fixed32 fixed32_arr = 7; + if (this->_internal_fixed32_arr_size() > 0) { + target = stream->WriteFixedPacked(7, _internal_fixed32_arr(), target); + } + + // repeated fixed64 fixed64_arr = 8; + if (this->_internal_fixed64_arr_size() > 0) { + target = stream->WriteFixedPacked(8, _internal_fixed64_arr(), target); + } + + // repeated sfixed32 sfixed32_arr = 9; + if (this->_internal_sfixed32_arr_size() > 0) { + target = stream->WriteFixedPacked(9, _internal_sfixed32_arr(), target); + } + + // repeated sfixed64 sfixed64_arr = 10; + if (this->_internal_sfixed64_arr_size() > 0) { + target = stream->WriteFixedPacked(10, _internal_sfixed64_arr(), target); + } + + // repeated float float_arr = 11; + if (this->_internal_float_arr_size() > 0) { + target = stream->WriteFixedPacked(11, _internal_float_arr(), target); + } + + // repeated double double_arr = 12; + if (this->_internal_double_arr_size() > 0) { + target = stream->WriteFixedPacked(12, _internal_double_arr(), target); + } + + // repeated bool bool_arr = 13; + if (this->_internal_bool_arr_size() > 0) { + target = stream->WriteFixedPacked(13, _internal_bool_arr(), target); + } + + // repeated string string_arr = 14; + for (int i = 0, n = this->_internal_string_arr_size(); i < n; i++) { + const auto& s = this->_internal_string_arr(i); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + s.data(), static_cast<int>(s.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.RepeatedTypes.string_arr"); + target = stream->WriteString(14, s, target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.RepeatedTypes) + return target; +} + +size_t RepeatedTypes::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.RepeatedTypes) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated int32 int32_arr = 1; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + Int32Size(this->int32_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _int32_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated int64 int64_arr = 2; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + Int64Size(this->int64_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _int64_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated uint32 uint32_arr = 3; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + UInt32Size(this->uint32_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _uint32_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated uint64 uint64_arr = 4; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + UInt64Size(this->uint64_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _uint64_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated sint32 sint32_arr = 5; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + SInt32Size(this->sint32_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _sint32_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated sint64 sint64_arr = 6; + { + size_t data_size = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + SInt64Size(this->sint64_arr_); + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _sint64_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated fixed32 fixed32_arr = 7; + { + unsigned int count = static_cast<unsigned int>(this->_internal_fixed32_arr_size()); + size_t data_size = 4UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _fixed32_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated fixed64 fixed64_arr = 8; + { + unsigned int count = static_cast<unsigned int>(this->_internal_fixed64_arr_size()); + size_t data_size = 8UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _fixed64_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated sfixed32 sfixed32_arr = 9; + { + unsigned int count = static_cast<unsigned int>(this->_internal_sfixed32_arr_size()); + size_t data_size = 4UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _sfixed32_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated sfixed64 sfixed64_arr = 10; + { + unsigned int count = static_cast<unsigned int>(this->_internal_sfixed64_arr_size()); + size_t data_size = 8UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _sfixed64_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated float float_arr = 11; + { + unsigned int count = static_cast<unsigned int>(this->_internal_float_arr_size()); + size_t data_size = 4UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _float_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated double double_arr = 12; + { + unsigned int count = static_cast<unsigned int>(this->_internal_double_arr_size()); + size_t data_size = 8UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _double_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated bool bool_arr = 13; + { + unsigned int count = static_cast<unsigned int>(this->_internal_bool_arr_size()); + size_t data_size = 1UL * count; + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _bool_arr_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + // repeated string string_arr = 14; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(string_arr_.size()); + for (int i = 0, n = string_arr_.size(); i < n; i++) { + total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + string_arr_.Get(i)); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void RepeatedTypes::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.RepeatedTypes) + GOOGLE_DCHECK_NE(&from, this); + const RepeatedTypes* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<RepeatedTypes>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.RepeatedTypes) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.RepeatedTypes) + MergeFrom(*source); + } +} + +void RepeatedTypes::MergeFrom(const RepeatedTypes& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.RepeatedTypes) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + int32_arr_.MergeFrom(from.int32_arr_); + int64_arr_.MergeFrom(from.int64_arr_); + uint32_arr_.MergeFrom(from.uint32_arr_); + uint64_arr_.MergeFrom(from.uint64_arr_); + sint32_arr_.MergeFrom(from.sint32_arr_); + sint64_arr_.MergeFrom(from.sint64_arr_); + fixed32_arr_.MergeFrom(from.fixed32_arr_); + fixed64_arr_.MergeFrom(from.fixed64_arr_); + sfixed32_arr_.MergeFrom(from.sfixed32_arr_); + sfixed64_arr_.MergeFrom(from.sfixed64_arr_); + float_arr_.MergeFrom(from.float_arr_); + double_arr_.MergeFrom(from.double_arr_); + bool_arr_.MergeFrom(from.bool_arr_); + string_arr_.MergeFrom(from.string_arr_); +} + +void RepeatedTypes::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.RepeatedTypes) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void RepeatedTypes::CopyFrom(const RepeatedTypes& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.RepeatedTypes) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool RepeatedTypes::IsInitialized() const { + return true; +} + +void RepeatedTypes::InternalSwap(RepeatedTypes* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + int32_arr_.InternalSwap(&other->int32_arr_); + int64_arr_.InternalSwap(&other->int64_arr_); + uint32_arr_.InternalSwap(&other->uint32_arr_); + uint64_arr_.InternalSwap(&other->uint64_arr_); + sint32_arr_.InternalSwap(&other->sint32_arr_); + sint64_arr_.InternalSwap(&other->sint64_arr_); + fixed32_arr_.InternalSwap(&other->fixed32_arr_); + fixed64_arr_.InternalSwap(&other->fixed64_arr_); + sfixed32_arr_.InternalSwap(&other->sfixed32_arr_); + sfixed64_arr_.InternalSwap(&other->sfixed64_arr_); + float_arr_.InternalSwap(&other->float_arr_); + double_arr_.InternalSwap(&other->double_arr_); + bool_arr_.InternalSwap(&other->bool_arr_); + string_arr_.InternalSwap(&other->string_arr_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata RepeatedTypes::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void Bar::InitAsDefaultInstance() { +} +class Bar::_Internal { + public: +}; + +Bar::Bar() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.Bar) +} +Bar::Bar(const Bar& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.Bar) +} + +void Bar::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Bar_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +Bar::~Bar() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.Bar) + SharedDtor(); +} + +void Bar::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void Bar::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const Bar& Bar::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_Bar_messages_2eproto.base); + return *internal_default_instance(); +} + + +void Bar::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.Bar) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + _internal_metadata_.Clear(); +} + +const char* Bar::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.Bar.value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* Bar::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.Bar) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string value = 2; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.Bar.value"); + target = stream->WriteStringMaybeAliased( + 2, this->_internal_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.Bar) + return target; +} + +size_t Bar::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.Bar) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string value = 2; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void Bar::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.Bar) + GOOGLE_DCHECK_NE(&from, this); + const Bar* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<Bar>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.Bar) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.Bar) + MergeFrom(*source); + } +} + +void Bar::MergeFrom(const Bar& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.Bar) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } +} + +void Bar::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.Bar) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Bar::CopyFrom(const Bar& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.Bar) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Bar::IsInitialized() const { + return true; +} + +void Bar::InternalSwap(Bar* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); +} + +::PROTOBUF_NAMESPACE_ID::Metadata Bar::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void Foo::InitAsDefaultInstance() { + ::test::vereign::grpc::json::pb::_Foo_default_instance_._instance.get_mutable()->bar_ = const_cast< ::test::vereign::grpc::json::pb::Bar*>( + ::test::vereign::grpc::json::pb::Bar::internal_default_instance()); +} +class Foo::_Internal { + public: + static const ::test::vereign::grpc::json::pb::Bar& bar(const Foo* msg); +}; + +const ::test::vereign::grpc::json::pb::Bar& +Foo::_Internal::bar(const Foo* msg) { + return *msg->bar_; +} +Foo::Foo() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.Foo) +} +Foo::Foo(const Foo& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from._internal_has_bar()) { + bar_ = new ::test::vereign::grpc::json::pb::Bar(*from.bar_); + } else { + bar_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.Foo) +} + +void Foo::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Foo_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + bar_ = nullptr; +} + +Foo::~Foo() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.Foo) + SharedDtor(); +} + +void Foo::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete bar_; +} + +void Foo::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const Foo& Foo::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_Foo_messages_2eproto.base); + return *internal_default_instance(); +} + + +void Foo::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.Foo) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == nullptr && bar_ != nullptr) { + delete bar_; + } + bar_ = nullptr; + _internal_metadata_.Clear(); +} + +const char* Foo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.Foo.value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .test.vereign.grpc.json.pb.Bar bar = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_bar(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* Foo::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.Foo) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.Foo.value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_value(), target); + } + + // .test.vereign.grpc.json.pb.Bar bar = 2; + if (this->has_bar()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 2, _Internal::bar(this), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.Foo) + return target; +} + +size_t Foo::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.Foo) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + // .test.vereign.grpc.json.pb.Bar bar = 2; + if (this->has_bar()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *bar_); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void Foo::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.Foo) + GOOGLE_DCHECK_NE(&from, this); + const Foo* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<Foo>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.Foo) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.Foo) + MergeFrom(*source); + } +} + +void Foo::MergeFrom(const Foo& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.Foo) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from.has_bar()) { + _internal_mutable_bar()->::test::vereign::grpc::json::pb::Bar::MergeFrom(from._internal_bar()); + } +} + +void Foo::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.Foo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Foo::CopyFrom(const Foo& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.Foo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Foo::IsInitialized() const { + return true; +} + +void Foo::InternalSwap(Foo* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(bar_, other->bar_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata Foo::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void MessageType::InitAsDefaultInstance() { + ::test::vereign::grpc::json::pb::_MessageType_default_instance_._instance.get_mutable()->foo_ = const_cast< ::test::vereign::grpc::json::pb::Foo*>( + ::test::vereign::grpc::json::pb::Foo::internal_default_instance()); +} +class MessageType::_Internal { + public: + static const ::test::vereign::grpc::json::pb::Foo& foo(const MessageType* msg); +}; + +const ::test::vereign::grpc::json::pb::Foo& +MessageType::_Internal::foo(const MessageType* msg) { + return *msg->foo_; +} +MessageType::MessageType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.MessageType) +} +MessageType::MessageType(const MessageType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + foo_arr_(from.foo_arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + if (from._internal_has_foo()) { + foo_ = new ::test::vereign::grpc::json::pb::Foo(*from.foo_); + } else { + foo_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.MessageType) +} + +void MessageType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MessageType_messages_2eproto.base); + foo_ = nullptr; +} + +MessageType::~MessageType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.MessageType) + SharedDtor(); +} + +void MessageType::SharedDtor() { + if (this != internal_default_instance()) delete foo_; +} + +void MessageType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const MessageType& MessageType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_MessageType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void MessageType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.MessageType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + foo_arr_.Clear(); + if (GetArenaNoVirtual() == nullptr && foo_ != nullptr) { + delete foo_; + } + foo_ = nullptr; + _internal_metadata_.Clear(); +} + +const char* MessageType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .test.vereign.grpc.json.pb.Foo foo = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr = ctx->ParseMessage(_internal_mutable_foo(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated .test.vereign.grpc.json.pb.Foo foo_arr = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(_internal_add_foo_arr(), ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* MessageType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.MessageType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .test.vereign.grpc.json.pb.Foo foo = 1; + if (this->has_foo()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 1, _Internal::foo(this), target, stream); + } + + // repeated .test.vereign.grpc.json.pb.Foo foo_arr = 2; + for (unsigned int i = 0, + n = static_cast<unsigned int>(this->_internal_foo_arr_size()); i < n; i++) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage(2, this->_internal_foo_arr(i), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.MessageType) + return target; +} + +size_t MessageType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.MessageType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .test.vereign.grpc.json.pb.Foo foo_arr = 2; + total_size += 1UL * this->_internal_foo_arr_size(); + for (const auto& msg : this->foo_arr_) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); + } + + // .test.vereign.grpc.json.pb.Foo foo = 1; + if (this->has_foo()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *foo_); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void MessageType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.MessageType) + GOOGLE_DCHECK_NE(&from, this); + const MessageType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<MessageType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.MessageType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.MessageType) + MergeFrom(*source); + } +} + +void MessageType::MergeFrom(const MessageType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.MessageType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + foo_arr_.MergeFrom(from.foo_arr_); + if (from.has_foo()) { + _internal_mutable_foo()->::test::vereign::grpc::json::pb::Foo::MergeFrom(from._internal_foo()); + } +} + +void MessageType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.MessageType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MessageType::CopyFrom(const MessageType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.MessageType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MessageType::IsInitialized() const { + return true; +} + +void MessageType::InternalSwap(MessageType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + foo_arr_.InternalSwap(&other->foo_arr_); + swap(foo_, other->foo_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata MessageType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +MapType_Int32KeyEntry_DoNotUse::MapType_Int32KeyEntry_DoNotUse() {} +MapType_Int32KeyEntry_DoNotUse::MapType_Int32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Int32KeyEntry_DoNotUse::MergeFrom(const MapType_Int32KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Int32KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Int32KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Int64KeyEntry_DoNotUse::MapType_Int64KeyEntry_DoNotUse() {} +MapType_Int64KeyEntry_DoNotUse::MapType_Int64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Int64KeyEntry_DoNotUse::MergeFrom(const MapType_Int64KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Int64KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Int64KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Uint32KeyEntry_DoNotUse::MapType_Uint32KeyEntry_DoNotUse() {} +MapType_Uint32KeyEntry_DoNotUse::MapType_Uint32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Uint32KeyEntry_DoNotUse::MergeFrom(const MapType_Uint32KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Uint32KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Uint32KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Uint64KeyEntry_DoNotUse::MapType_Uint64KeyEntry_DoNotUse() {} +MapType_Uint64KeyEntry_DoNotUse::MapType_Uint64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Uint64KeyEntry_DoNotUse::MergeFrom(const MapType_Uint64KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Uint64KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Uint64KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Sint32KeyEntry_DoNotUse::MapType_Sint32KeyEntry_DoNotUse() {} +MapType_Sint32KeyEntry_DoNotUse::MapType_Sint32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Sint32KeyEntry_DoNotUse::MergeFrom(const MapType_Sint32KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Sint32KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Sint32KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Sint64KeyEntry_DoNotUse::MapType_Sint64KeyEntry_DoNotUse() {} +MapType_Sint64KeyEntry_DoNotUse::MapType_Sint64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Sint64KeyEntry_DoNotUse::MergeFrom(const MapType_Sint64KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Sint64KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Sint64KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Fixed32KeyEntry_DoNotUse::MapType_Fixed32KeyEntry_DoNotUse() {} +MapType_Fixed32KeyEntry_DoNotUse::MapType_Fixed32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Fixed32KeyEntry_DoNotUse::MergeFrom(const MapType_Fixed32KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Fixed32KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Fixed32KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Fixed64KeyEntry_DoNotUse::MapType_Fixed64KeyEntry_DoNotUse() {} +MapType_Fixed64KeyEntry_DoNotUse::MapType_Fixed64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Fixed64KeyEntry_DoNotUse::MergeFrom(const MapType_Fixed64KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Fixed64KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Fixed64KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Sfixed32KeyEntry_DoNotUse::MapType_Sfixed32KeyEntry_DoNotUse() {} +MapType_Sfixed32KeyEntry_DoNotUse::MapType_Sfixed32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Sfixed32KeyEntry_DoNotUse::MergeFrom(const MapType_Sfixed32KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Sfixed32KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Sfixed32KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_Sfixed64KeyEntry_DoNotUse::MapType_Sfixed64KeyEntry_DoNotUse() {} +MapType_Sfixed64KeyEntry_DoNotUse::MapType_Sfixed64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_Sfixed64KeyEntry_DoNotUse::MergeFrom(const MapType_Sfixed64KeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_Sfixed64KeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_Sfixed64KeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +MapType_StringKeyEntry_DoNotUse::MapType_StringKeyEntry_DoNotUse() {} +MapType_StringKeyEntry_DoNotUse::MapType_StringKeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapType_StringKeyEntry_DoNotUse::MergeFrom(const MapType_StringKeyEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapType_StringKeyEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapType_StringKeyEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +void MapType::InitAsDefaultInstance() { +} +class MapType::_Internal { + public: +}; + +MapType::MapType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.MapType) +} +MapType::MapType(const MapType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + int32_key_.MergeFrom(from.int32_key_); + int64_key_.MergeFrom(from.int64_key_); + uint32_key_.MergeFrom(from.uint32_key_); + uint64_key_.MergeFrom(from.uint64_key_); + sint32_key_.MergeFrom(from.sint32_key_); + sint64_key_.MergeFrom(from.sint64_key_); + fixed32_key_.MergeFrom(from.fixed32_key_); + fixed64_key_.MergeFrom(from.fixed64_key_); + sfixed32_key_.MergeFrom(from.sfixed32_key_); + sfixed64_key_.MergeFrom(from.sfixed64_key_); + string_key_.MergeFrom(from.string_key_); + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.MapType) +} + +void MapType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MapType_messages_2eproto.base); +} + +MapType::~MapType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.MapType) + SharedDtor(); +} + +void MapType::SharedDtor() { +} + +void MapType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const MapType& MapType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_MapType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void MapType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.MapType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + int32_key_.Clear(); + int64_key_.Clear(); + uint32_key_.Clear(); + uint64_key_.Clear(); + sint32_key_.Clear(); + sint64_key_.Clear(); + fixed32_key_.Clear(); + fixed64_key_.Clear(); + sfixed32_key_.Clear(); + sfixed64_key_.Clear(); + string_key_.Clear(); + _internal_metadata_.Clear(); +} + +const char* MapType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // map<int32, string> int32_key = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&int32_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); + } else goto handle_unusual; + continue; + // map<int64, string> int64_key = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&int64_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr)); + } else goto handle_unusual; + continue; + // map<uint32, string> uint32_key = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&uint32_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr)); + } else goto handle_unusual; + continue; + // map<uint64, string> uint64_key = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&uint64_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<34>(ptr)); + } else goto handle_unusual; + continue; + // map<sint32, string> sint32_key = 5; + case 5: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 42)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&sint32_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<42>(ptr)); + } else goto handle_unusual; + continue; + // map<sint64, string> sint64_key = 6; + case 6: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 50)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&sint64_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<50>(ptr)); + } else goto handle_unusual; + continue; + // map<fixed32, string> fixed32_key = 7; + case 7: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 58)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&fixed32_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<58>(ptr)); + } else goto handle_unusual; + continue; + // map<fixed64, string> fixed64_key = 8; + case 8: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 66)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&fixed64_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<66>(ptr)); + } else goto handle_unusual; + continue; + // map<sfixed32, string> sfixed32_key = 9; + case 9: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 74)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&sfixed32_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<74>(ptr)); + } else goto handle_unusual; + continue; + // map<sfixed64, string> sfixed64_key = 10; + case 10: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 82)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&sfixed64_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<82>(ptr)); + } else goto handle_unusual; + continue; + // map<string, string> string_key = 11; + case 11: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 90)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&string_key_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<90>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* MapType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.MapType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // map<int32, string> int32_key = 1; + if (!this->_internal_int32_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int32, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Int32KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_int32_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_int32_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_int32_key().begin(); + it != this->_internal_int32_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Int32KeyEntry_DoNotUse::Funcs::InternalSerialize(1, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_int32_key().begin(); + it != this->_internal_int32_key().end(); ++it) { + target = MapType_Int32KeyEntry_DoNotUse::Funcs::InternalSerialize(1, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<int64, string> int64_key = 2; + if (!this->_internal_int64_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int64, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Int64KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_int64_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_int64_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_int64_key().begin(); + it != this->_internal_int64_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Int64KeyEntry_DoNotUse::Funcs::InternalSerialize(2, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_int64_key().begin(); + it != this->_internal_int64_key().end(); ++it) { + target = MapType_Int64KeyEntry_DoNotUse::Funcs::InternalSerialize(2, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<uint32, string> uint32_key = 3; + if (!this->_internal_uint32_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::uint32, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Uint32KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_uint32_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_uint32_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_iterator + it = this->_internal_uint32_key().begin(); + it != this->_internal_uint32_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Uint32KeyEntry_DoNotUse::Funcs::InternalSerialize(3, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_iterator + it = this->_internal_uint32_key().begin(); + it != this->_internal_uint32_key().end(); ++it) { + target = MapType_Uint32KeyEntry_DoNotUse::Funcs::InternalSerialize(3, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<uint64, string> uint64_key = 4; + if (!this->_internal_uint64_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::uint64, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Uint64KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_uint64_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_uint64_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_iterator + it = this->_internal_uint64_key().begin(); + it != this->_internal_uint64_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Uint64KeyEntry_DoNotUse::Funcs::InternalSerialize(4, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_iterator + it = this->_internal_uint64_key().begin(); + it != this->_internal_uint64_key().end(); ++it) { + target = MapType_Uint64KeyEntry_DoNotUse::Funcs::InternalSerialize(4, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<sint32, string> sint32_key = 5; + if (!this->_internal_sint32_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int32, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Sint32KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_sint32_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_sint32_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_sint32_key().begin(); + it != this->_internal_sint32_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Sint32KeyEntry_DoNotUse::Funcs::InternalSerialize(5, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_sint32_key().begin(); + it != this->_internal_sint32_key().end(); ++it) { + target = MapType_Sint32KeyEntry_DoNotUse::Funcs::InternalSerialize(5, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<sint64, string> sint64_key = 6; + if (!this->_internal_sint64_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int64, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Sint64KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_sint64_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_sint64_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_sint64_key().begin(); + it != this->_internal_sint64_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Sint64KeyEntry_DoNotUse::Funcs::InternalSerialize(6, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_sint64_key().begin(); + it != this->_internal_sint64_key().end(); ++it) { + target = MapType_Sint64KeyEntry_DoNotUse::Funcs::InternalSerialize(6, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<fixed32, string> fixed32_key = 7; + if (!this->_internal_fixed32_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::uint32, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Fixed32KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_fixed32_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_fixed32_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_iterator + it = this->_internal_fixed32_key().begin(); + it != this->_internal_fixed32_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Fixed32KeyEntry_DoNotUse::Funcs::InternalSerialize(7, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_iterator + it = this->_internal_fixed32_key().begin(); + it != this->_internal_fixed32_key().end(); ++it) { + target = MapType_Fixed32KeyEntry_DoNotUse::Funcs::InternalSerialize(7, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<fixed64, string> fixed64_key = 8; + if (!this->_internal_fixed64_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::uint64, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Fixed64KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_fixed64_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_fixed64_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_iterator + it = this->_internal_fixed64_key().begin(); + it != this->_internal_fixed64_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Fixed64KeyEntry_DoNotUse::Funcs::InternalSerialize(8, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_iterator + it = this->_internal_fixed64_key().begin(); + it != this->_internal_fixed64_key().end(); ++it) { + target = MapType_Fixed64KeyEntry_DoNotUse::Funcs::InternalSerialize(8, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<sfixed32, string> sfixed32_key = 9; + if (!this->_internal_sfixed32_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int32, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Sfixed32KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_sfixed32_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_sfixed32_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_sfixed32_key().begin(); + it != this->_internal_sfixed32_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Sfixed32KeyEntry_DoNotUse::Funcs::InternalSerialize(9, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_sfixed32_key().begin(); + it != this->_internal_sfixed32_key().end(); ++it) { + target = MapType_Sfixed32KeyEntry_DoNotUse::Funcs::InternalSerialize(9, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<sfixed64, string> sfixed64_key = 10; + if (!this->_internal_sfixed64_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_pointer + ConstPtr; + typedef ::PROTOBUF_NAMESPACE_ID::internal::SortItem< ::PROTOBUF_NAMESPACE_ID::int64, ConstPtr > SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByFirstField<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.Sfixed64KeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_sfixed64_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_sfixed64_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_sfixed64_key().begin(); + it != this->_internal_sfixed64_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_Sfixed64KeyEntry_DoNotUse::Funcs::InternalSerialize(10, items[static_cast<ptrdiff_t>(i)].second->first, items[static_cast<ptrdiff_t>(i)].second->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)].second)); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_sfixed64_key().begin(); + it != this->_internal_sfixed64_key().end(); ++it) { + target = MapType_Sfixed64KeyEntry_DoNotUse::Funcs::InternalSerialize(10, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + // map<string, string> string_key = 11; + if (!this->_internal_string_key().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_pointer + ConstPtr; + typedef ConstPtr SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByDerefFirst<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->first.data(), static_cast<int>(p->first.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.StringKeyEntry.key"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->second.data(), static_cast<int>(p->second.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapType.StringKeyEntry.value"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_string_key().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_string_key().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_iterator + it = this->_internal_string_key().begin(); + it != this->_internal_string_key().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapType_StringKeyEntry_DoNotUse::Funcs::InternalSerialize(11, items[static_cast<ptrdiff_t>(i)]->first, items[static_cast<ptrdiff_t>(i)]->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)])); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_iterator + it = this->_internal_string_key().begin(); + it != this->_internal_string_key().end(); ++it) { + target = MapType_StringKeyEntry_DoNotUse::Funcs::InternalSerialize(11, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.MapType) + return target; +} + +size_t MapType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.MapType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // map<int32, string> int32_key = 1; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_int32_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_int32_key().begin(); + it != this->_internal_int32_key().end(); ++it) { + total_size += MapType_Int32KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<int64, string> int64_key = 2; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_int64_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_int64_key().begin(); + it != this->_internal_int64_key().end(); ++it) { + total_size += MapType_Int64KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<uint32, string> uint32_key = 3; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_uint32_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_iterator + it = this->_internal_uint32_key().begin(); + it != this->_internal_uint32_key().end(); ++it) { + total_size += MapType_Uint32KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<uint64, string> uint64_key = 4; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_uint64_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_iterator + it = this->_internal_uint64_key().begin(); + it != this->_internal_uint64_key().end(); ++it) { + total_size += MapType_Uint64KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<sint32, string> sint32_key = 5; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_sint32_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_sint32_key().begin(); + it != this->_internal_sint32_key().end(); ++it) { + total_size += MapType_Sint32KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<sint64, string> sint64_key = 6; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_sint64_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_sint64_key().begin(); + it != this->_internal_sint64_key().end(); ++it) { + total_size += MapType_Sint64KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<fixed32, string> fixed32_key = 7; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_fixed32_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >::const_iterator + it = this->_internal_fixed32_key().begin(); + it != this->_internal_fixed32_key().end(); ++it) { + total_size += MapType_Fixed32KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<fixed64, string> fixed64_key = 8; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_fixed64_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >::const_iterator + it = this->_internal_fixed64_key().begin(); + it != this->_internal_fixed64_key().end(); ++it) { + total_size += MapType_Fixed64KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<sfixed32, string> sfixed32_key = 9; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_sfixed32_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >::const_iterator + it = this->_internal_sfixed32_key().begin(); + it != this->_internal_sfixed32_key().end(); ++it) { + total_size += MapType_Sfixed32KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<sfixed64, string> sfixed64_key = 10; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_sfixed64_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >::const_iterator + it = this->_internal_sfixed64_key().begin(); + it != this->_internal_sfixed64_key().end(); ++it) { + total_size += MapType_Sfixed64KeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + // map<string, string> string_key = 11; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_string_key_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >::const_iterator + it = this->_internal_string_key().begin(); + it != this->_internal_string_key().end(); ++it) { + total_size += MapType_StringKeyEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void MapType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.MapType) + GOOGLE_DCHECK_NE(&from, this); + const MapType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<MapType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.MapType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.MapType) + MergeFrom(*source); + } +} + +void MapType::MergeFrom(const MapType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.MapType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + int32_key_.MergeFrom(from.int32_key_); + int64_key_.MergeFrom(from.int64_key_); + uint32_key_.MergeFrom(from.uint32_key_); + uint64_key_.MergeFrom(from.uint64_key_); + sint32_key_.MergeFrom(from.sint32_key_); + sint64_key_.MergeFrom(from.sint64_key_); + fixed32_key_.MergeFrom(from.fixed32_key_); + fixed64_key_.MergeFrom(from.fixed64_key_); + sfixed32_key_.MergeFrom(from.sfixed32_key_); + sfixed64_key_.MergeFrom(from.sfixed64_key_); + string_key_.MergeFrom(from.string_key_); +} + +void MapType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.MapType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MapType::CopyFrom(const MapType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.MapType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MapType::IsInitialized() const { + return true; +} + +void MapType::InternalSwap(MapType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + int32_key_.Swap(&other->int32_key_); + int64_key_.Swap(&other->int64_key_); + uint32_key_.Swap(&other->uint32_key_); + uint64_key_.Swap(&other->uint64_key_); + sint32_key_.Swap(&other->sint32_key_); + sint64_key_.Swap(&other->sint64_key_); + fixed32_key_.Swap(&other->fixed32_key_); + fixed64_key_.Swap(&other->fixed64_key_); + sfixed32_key_.Swap(&other->sfixed32_key_); + sfixed64_key_.Swap(&other->sfixed64_key_); + string_key_.Swap(&other->string_key_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata MapType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +MapMessageType_MsgEntry_DoNotUse::MapMessageType_MsgEntry_DoNotUse() {} +MapMessageType_MsgEntry_DoNotUse::MapMessageType_MsgEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena) + : SuperType(arena) {} +void MapMessageType_MsgEntry_DoNotUse::MergeFrom(const MapMessageType_MsgEntry_DoNotUse& other) { + MergeFromInternal(other); +} +::PROTOBUF_NAMESPACE_ID::Metadata MapMessageType_MsgEntry_DoNotUse::GetMetadata() const { + return GetMetadataStatic(); +} +void MapMessageType_MsgEntry_DoNotUse::MergeFrom( + const ::PROTOBUF_NAMESPACE_ID::Message& other) { + ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom(other); +} + + +// =================================================================== + +void MapMessageType::InitAsDefaultInstance() { +} +class MapMessageType::_Internal { + public: +}; + +MapMessageType::MapMessageType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.MapMessageType) +} +MapMessageType::MapMessageType(const MapMessageType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + msg_.MergeFrom(from.msg_); + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.MapMessageType) +} + +void MapMessageType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MapMessageType_messages_2eproto.base); +} + +MapMessageType::~MapMessageType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.MapMessageType) + SharedDtor(); +} + +void MapMessageType::SharedDtor() { +} + +void MapMessageType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const MapMessageType& MapMessageType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_MapMessageType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void MapMessageType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.MapMessageType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + msg_.Clear(); + _internal_metadata_.Clear(); +} + +const char* MapMessageType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // map<string, .test.vereign.grpc.json.pb.MessageType> msg = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(&msg_, ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* MapMessageType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.MapMessageType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // map<string, .test.vereign.grpc.json.pb.MessageType> msg = 1; + if (!this->_internal_msg().empty()) { + typedef ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >::const_pointer + ConstPtr; + typedef ConstPtr SortItem; + typedef ::PROTOBUF_NAMESPACE_ID::internal::CompareByDerefFirst<SortItem> Less; + struct Utf8Check { + static void Check(ConstPtr p) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + p->first.data(), static_cast<int>(p->first.length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.MapMessageType.MsgEntry.key"); + } + }; + + if (stream->IsSerializationDeterministic() && + this->_internal_msg().size() > 1) { + ::std::unique_ptr<SortItem[]> items( + new SortItem[this->_internal_msg().size()]); + typedef ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >::size_type size_type; + size_type n = 0; + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >::const_iterator + it = this->_internal_msg().begin(); + it != this->_internal_msg().end(); ++it, ++n) { + items[static_cast<ptrdiff_t>(n)] = SortItem(&*it); + } + ::std::sort(&items[0], &items[static_cast<ptrdiff_t>(n)], Less()); + for (size_type i = 0; i < n; i++) { + target = MapMessageType_MsgEntry_DoNotUse::Funcs::InternalSerialize(1, items[static_cast<ptrdiff_t>(i)]->first, items[static_cast<ptrdiff_t>(i)]->second, target, stream); + Utf8Check::Check(&(*items[static_cast<ptrdiff_t>(i)])); + } + } else { + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >::const_iterator + it = this->_internal_msg().begin(); + it != this->_internal_msg().end(); ++it) { + target = MapMessageType_MsgEntry_DoNotUse::Funcs::InternalSerialize(1, it->first, it->second, target, stream); + Utf8Check::Check(&(*it)); + } + } + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.MapMessageType) + return target; +} + +size_t MapMessageType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.MapMessageType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // map<string, .test.vereign.grpc.json.pb.MessageType> msg = 1; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->_internal_msg_size()); + for (::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >::const_iterator + it = this->_internal_msg().begin(); + it != this->_internal_msg().end(); ++it) { + total_size += MapMessageType_MsgEntry_DoNotUse::Funcs::ByteSizeLong(it->first, it->second); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void MapMessageType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.MapMessageType) + GOOGLE_DCHECK_NE(&from, this); + const MapMessageType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<MapMessageType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.MapMessageType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.MapMessageType) + MergeFrom(*source); + } +} + +void MapMessageType::MergeFrom(const MapMessageType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.MapMessageType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + msg_.MergeFrom(from.msg_); +} + +void MapMessageType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.MapMessageType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MapMessageType::CopyFrom(const MapMessageType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.MapMessageType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MapMessageType::IsInitialized() const { + return true; +} + +void MapMessageType::InternalSwap(MapMessageType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + msg_.Swap(&other->msg_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata MapMessageType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void BytesType::InitAsDefaultInstance() { +} +class BytesType::_Internal { + public: +}; + +BytesType::BytesType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.BytesType) +} +BytesType::BytesType(const BytesType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + bytes_arr_(from.bytes_arr_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + bytes_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_bytes_value().empty()) { + bytes_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.bytes_value_); + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.BytesType) +} + +void BytesType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BytesType_messages_2eproto.base); + bytes_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +BytesType::~BytesType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.BytesType) + SharedDtor(); +} + +void BytesType::SharedDtor() { + bytes_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void BytesType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const BytesType& BytesType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_BytesType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void BytesType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.BytesType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + bytes_arr_.Clear(); + bytes_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + _internal_metadata_.Clear(); +} + +const char* BytesType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // bytes bytes_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_bytes_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated bytes bytes_arr = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr -= 1; + do { + ptr += 1; + auto str = _internal_add_bytes_arr(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* BytesType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.BytesType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // bytes bytes_value = 1; + if (this->bytes_value().size() > 0) { + target = stream->WriteBytesMaybeAliased( + 1, this->_internal_bytes_value(), target); + } + + // repeated bytes bytes_arr = 2; + for (int i = 0, n = this->_internal_bytes_arr_size(); i < n; i++) { + const auto& s = this->_internal_bytes_arr(i); + target = stream->WriteBytes(2, s, target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.BytesType) + return target; +} + +size_t BytesType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.BytesType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated bytes bytes_arr = 2; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(bytes_arr_.size()); + for (int i = 0, n = bytes_arr_.size(); i < n; i++) { + total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( + bytes_arr_.Get(i)); + } + + // bytes bytes_value = 1; + if (this->bytes_value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( + this->_internal_bytes_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void BytesType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.BytesType) + GOOGLE_DCHECK_NE(&from, this); + const BytesType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<BytesType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.BytesType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.BytesType) + MergeFrom(*source); + } +} + +void BytesType::MergeFrom(const BytesType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.BytesType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + bytes_arr_.MergeFrom(from.bytes_arr_); + if (from.bytes_value().size() > 0) { + + bytes_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.bytes_value_); + } +} + +void BytesType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.BytesType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void BytesType::CopyFrom(const BytesType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.BytesType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool BytesType::IsInitialized() const { + return true; +} + +void BytesType::InternalSwap(BytesType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + bytes_arr_.InternalSwap(&other->bytes_arr_); + bytes_value_.Swap(&other->bytes_value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); +} + +::PROTOBUF_NAMESPACE_ID::Metadata BytesType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void JsonNaming::InitAsDefaultInstance() { +} +class JsonNaming::_Internal { + public: +}; + +JsonNaming::JsonNaming() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.JsonNaming) +} +JsonNaming::JsonNaming(const JsonNaming& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::memcpy(&foo_value_, &from.foo_value_, + static_cast<size_t>(reinterpret_cast<char*>(&qux_value_) - + reinterpret_cast<char*>(&foo_value_)) + sizeof(qux_value_)); + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.JsonNaming) +} + +void JsonNaming::SharedCtor() { + ::memset(&foo_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&qux_value_) - + reinterpret_cast<char*>(&foo_value_)) + sizeof(qux_value_)); +} + +JsonNaming::~JsonNaming() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.JsonNaming) + SharedDtor(); +} + +void JsonNaming::SharedDtor() { +} + +void JsonNaming::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const JsonNaming& JsonNaming::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_JsonNaming_messages_2eproto.base); + return *internal_default_instance(); +} + + +void JsonNaming::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.JsonNaming) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + ::memset(&foo_value_, 0, static_cast<size_t>( + reinterpret_cast<char*>(&qux_value_) - + reinterpret_cast<char*>(&foo_value_)) + sizeof(qux_value_)); + _internal_metadata_.Clear(); +} + +const char* JsonNaming::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // int32 foo_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + foo_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // int32 barValue = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 16)) { + barvalue_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // int32 BazValue = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 24)) { + bazvalue_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // int32 quX_Value = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) { + qux_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* JsonNaming::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.JsonNaming) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // int32 foo_value = 1; + if (this->foo_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(1, this->_internal_foo_value(), target); + } + + // int32 barValue = 2; + if (this->barvalue() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(2, this->_internal_barvalue(), target); + } + + // int32 BazValue = 3; + if (this->bazvalue() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->_internal_bazvalue(), target); + } + + // int32 quX_Value = 4; + if (this->qux_value() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(4, this->_internal_qux_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.JsonNaming) + return target; +} + +size_t JsonNaming::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.JsonNaming) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // int32 foo_value = 1; + if (this->foo_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + this->_internal_foo_value()); + } + + // int32 barValue = 2; + if (this->barvalue() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + this->_internal_barvalue()); + } + + // int32 BazValue = 3; + if (this->bazvalue() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + this->_internal_bazvalue()); + } + + // int32 quX_Value = 4; + if (this->qux_value() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + this->_internal_qux_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void JsonNaming::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.JsonNaming) + GOOGLE_DCHECK_NE(&from, this); + const JsonNaming* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<JsonNaming>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.JsonNaming) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.JsonNaming) + MergeFrom(*source); + } +} + +void JsonNaming::MergeFrom(const JsonNaming& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.JsonNaming) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.foo_value() != 0) { + _internal_set_foo_value(from._internal_foo_value()); + } + if (from.barvalue() != 0) { + _internal_set_barvalue(from._internal_barvalue()); + } + if (from.bazvalue() != 0) { + _internal_set_bazvalue(from._internal_bazvalue()); + } + if (from.qux_value() != 0) { + _internal_set_qux_value(from._internal_qux_value()); + } +} + +void JsonNaming::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.JsonNaming) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void JsonNaming::CopyFrom(const JsonNaming& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.JsonNaming) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool JsonNaming::IsInitialized() const { + return true; +} + +void JsonNaming::InternalSwap(JsonNaming* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(foo_value_, other->foo_value_); + swap(barvalue_, other->barvalue_); + swap(bazvalue_, other->bazvalue_); + swap(qux_value_, other->qux_value_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata JsonNaming::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void OneofValue::InitAsDefaultInstance() { + ::test::vereign::grpc::json::pb::_OneofValue_default_instance_.string_value_.UnsafeSetDefault( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::test::vereign::grpc::json::pb::_OneofValue_default_instance_.struct_value_ = const_cast< ::test::vereign::grpc::json::pb::SimpleStruct*>( + ::test::vereign::grpc::json::pb::SimpleStruct::internal_default_instance()); +} +class OneofValue::_Internal { + public: + static const ::test::vereign::grpc::json::pb::SimpleStruct& struct_value(const OneofValue* msg); +}; + +const ::test::vereign::grpc::json::pb::SimpleStruct& +OneofValue::_Internal::struct_value(const OneofValue* msg) { + return *msg->data_.struct_value_; +} +void OneofValue::set_allocated_struct_value(::test::vereign::grpc::json::pb::SimpleStruct* struct_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + clear_data(); + if (struct_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + struct_value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, struct_value, submessage_arena); + } + set_has_struct_value(); + data_.struct_value_ = struct_value; + } + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.OneofValue.struct_value) +} +OneofValue::OneofValue() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.OneofValue) +} +OneofValue::OneofValue(const OneofValue& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + clear_has_data(); + switch (from.data_case()) { + case kStringValue: { + _internal_set_string_value(from._internal_string_value()); + break; + } + case kStructValue: { + _internal_mutable_struct_value()->::test::vereign::grpc::json::pb::SimpleStruct::MergeFrom(from._internal_struct_value()); + break; + } + case DATA_NOT_SET: { + break; + } + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.OneofValue) +} + +void OneofValue::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OneofValue_messages_2eproto.base); + clear_has_data(); +} + +OneofValue::~OneofValue() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.OneofValue) + SharedDtor(); +} + +void OneofValue::SharedDtor() { + if (has_data()) { + clear_data(); + } +} + +void OneofValue::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const OneofValue& OneofValue::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_OneofValue_messages_2eproto.base); + return *internal_default_instance(); +} + + +void OneofValue::clear_data() { +// @@protoc_insertion_point(one_of_clear_start:test.vereign.grpc.json.pb.OneofValue) + switch (data_case()) { + case kStringValue: { + data_.string_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + break; + } + case kStructValue: { + delete data_.struct_value_; + break; + } + case DATA_NOT_SET: { + break; + } + } + _oneof_case_[0] = DATA_NOT_SET; +} + + +void OneofValue::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.OneofValue) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + clear_data(); + _internal_metadata_.Clear(); +} + +const char* OneofValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string string_value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_string_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.OneofValue.string_value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .test.vereign.grpc.json.pb.SimpleStruct struct_value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_struct_value(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* OneofValue::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.OneofValue) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string string_value = 1; + if (_internal_has_string_value()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_string_value().data(), static_cast<int>(this->_internal_string_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.OneofValue.string_value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_string_value(), target); + } + + // .test.vereign.grpc.json.pb.SimpleStruct struct_value = 2; + if (_internal_has_struct_value()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 2, _Internal::struct_value(this), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.OneofValue) + return target; +} + +size_t OneofValue::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.OneofValue) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + switch (data_case()) { + // string string_value = 1; + case kStringValue: { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_string_value()); + break; + } + // .test.vereign.grpc.json.pb.SimpleStruct struct_value = 2; + case kStructValue: { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *data_.struct_value_); + break; + } + case DATA_NOT_SET: { + break; + } + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void OneofValue::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.OneofValue) + GOOGLE_DCHECK_NE(&from, this); + const OneofValue* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<OneofValue>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.OneofValue) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.OneofValue) + MergeFrom(*source); + } +} + +void OneofValue::MergeFrom(const OneofValue& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.OneofValue) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + switch (from.data_case()) { + case kStringValue: { + _internal_set_string_value(from._internal_string_value()); + break; + } + case kStructValue: { + _internal_mutable_struct_value()->::test::vereign::grpc::json::pb::SimpleStruct::MergeFrom(from._internal_struct_value()); + break; + } + case DATA_NOT_SET: { + break; + } + } +} + +void OneofValue::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.OneofValue) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OneofValue::CopyFrom(const OneofValue& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.OneofValue) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OneofValue::IsInitialized() const { + return true; +} + +void OneofValue::InternalSwap(OneofValue* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(data_, other->data_); + swap(_oneof_case_[0], other->_oneof_case_[0]); +} + +::PROTOBUF_NAMESPACE_ID::Metadata OneofValue::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void EnumType::InitAsDefaultInstance() { +} +class EnumType::_Internal { + public: +}; + +EnumType::EnumType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.EnumType) +} +EnumType::EnumType(const EnumType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + corpus_ = from.corpus_; + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.EnumType) +} + +void EnumType::SharedCtor() { + corpus_ = 0; +} + +EnumType::~EnumType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.EnumType) + SharedDtor(); +} + +void EnumType::SharedDtor() { +} + +void EnumType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const EnumType& EnumType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_EnumType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void EnumType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.EnumType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + corpus_ = 0; + _internal_metadata_.Clear(); +} + +const char* EnumType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .test.vereign.grpc.json.pb.EnumType.Corpus corpus = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) { + ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + _internal_set_corpus(static_cast<::test::vereign::grpc::json::pb::EnumType_Corpus>(val)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* EnumType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.EnumType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .test.vereign.grpc.json.pb.EnumType.Corpus corpus = 4; + if (this->corpus() != 0) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray( + 4, this->_internal_corpus(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.EnumType) + return target; +} + +size_t EnumType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.EnumType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // .test.vereign.grpc.json.pb.EnumType.Corpus corpus = 4; + if (this->corpus() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->_internal_corpus()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void EnumType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.EnumType) + GOOGLE_DCHECK_NE(&from, this); + const EnumType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<EnumType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.EnumType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.EnumType) + MergeFrom(*source); + } +} + +void EnumType::MergeFrom(const EnumType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.EnumType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.corpus() != 0) { + _internal_set_corpus(from._internal_corpus()); + } +} + +void EnumType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.EnumType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumType::CopyFrom(const EnumType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.EnumType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumType::IsInitialized() const { + return true; +} + +void EnumType::InternalSwap(EnumType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(corpus_, other->corpus_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata EnumType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void RepeatedEnumType::InitAsDefaultInstance() { +} +class RepeatedEnumType::_Internal { + public: +}; + +RepeatedEnumType::RepeatedEnumType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.RepeatedEnumType) +} +RepeatedEnumType::RepeatedEnumType(const RepeatedEnumType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + corpus_(from.corpus_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.RepeatedEnumType) +} + +void RepeatedEnumType::SharedCtor() { +} + +RepeatedEnumType::~RepeatedEnumType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.RepeatedEnumType) + SharedDtor(); +} + +void RepeatedEnumType::SharedDtor() { +} + +void RepeatedEnumType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const RepeatedEnumType& RepeatedEnumType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_RepeatedEnumType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void RepeatedEnumType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.RepeatedEnumType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + corpus_.Clear(); + _internal_metadata_.Clear(); +} + +const char* RepeatedEnumType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // repeated .test.vereign.grpc.json.pb.RepeatedEnumType.Corpus corpus = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedEnumParser(_internal_mutable_corpus(), ptr, ctx); + CHK_(ptr); + } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32) { + ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + _internal_add_corpus(static_cast<::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus>(val)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* RepeatedEnumType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.RepeatedEnumType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // repeated .test.vereign.grpc.json.pb.RepeatedEnumType.Corpus corpus = 4; + { + int byte_size = _corpus_cached_byte_size_.load(std::memory_order_relaxed); + if (byte_size > 0) { + target = stream->WriteEnumPacked( + 4, corpus_, byte_size, target); + } + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.RepeatedEnumType) + return target; +} + +size_t RepeatedEnumType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.RepeatedEnumType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .test.vereign.grpc.json.pb.RepeatedEnumType.Corpus corpus = 4; + { + size_t data_size = 0; + unsigned int count = static_cast<unsigned int>(this->_internal_corpus_size());for (unsigned int i = 0; i < count; i++) { + data_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize( + this->_internal_corpus(static_cast<int>(i))); + } + if (data_size > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + static_cast<::PROTOBUF_NAMESPACE_ID::int32>(data_size)); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(data_size); + _corpus_cached_byte_size_.store(cached_size, + std::memory_order_relaxed); + total_size += data_size; + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void RepeatedEnumType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.RepeatedEnumType) + GOOGLE_DCHECK_NE(&from, this); + const RepeatedEnumType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<RepeatedEnumType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.RepeatedEnumType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.RepeatedEnumType) + MergeFrom(*source); + } +} + +void RepeatedEnumType::MergeFrom(const RepeatedEnumType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.RepeatedEnumType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + corpus_.MergeFrom(from.corpus_); +} + +void RepeatedEnumType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.RepeatedEnumType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void RepeatedEnumType::CopyFrom(const RepeatedEnumType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.RepeatedEnumType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool RepeatedEnumType::IsInitialized() const { + return true; +} + +void RepeatedEnumType::InternalSwap(RepeatedEnumType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + corpus_.InternalSwap(&other->corpus_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata RepeatedEnumType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void NestedType_NestedFoo_NestedBar::InitAsDefaultInstance() { +} +class NestedType_NestedFoo_NestedBar::_Internal { + public: +}; + +NestedType_NestedFoo_NestedBar::NestedType_NestedFoo_NestedBar() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) +} +NestedType_NestedFoo_NestedBar::NestedType_NestedFoo_NestedBar(const NestedType_NestedFoo_NestedBar& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) +} + +void NestedType_NestedFoo_NestedBar::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_NestedType_NestedFoo_NestedBar_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +NestedType_NestedFoo_NestedBar::~NestedType_NestedFoo_NestedBar() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + SharedDtor(); +} + +void NestedType_NestedFoo_NestedBar::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void NestedType_NestedFoo_NestedBar::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const NestedType_NestedFoo_NestedBar& NestedType_NestedFoo_NestedBar::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_NestedType_NestedFoo_NestedBar_messages_2eproto.base); + return *internal_default_instance(); +} + + +void NestedType_NestedFoo_NestedBar::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + _internal_metadata_.Clear(); +} + +const char* NestedType_NestedFoo_NestedBar::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string Value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* NestedType_NestedFoo_NestedBar::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string Value = 1; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_value(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + return target; +} + +size_t NestedType_NestedFoo_NestedBar::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string Value = 1; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void NestedType_NestedFoo_NestedBar::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + GOOGLE_DCHECK_NE(&from, this); + const NestedType_NestedFoo_NestedBar* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<NestedType_NestedFoo_NestedBar>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + MergeFrom(*source); + } +} + +void NestedType_NestedFoo_NestedBar::MergeFrom(const NestedType_NestedFoo_NestedBar& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } +} + +void NestedType_NestedFoo_NestedBar::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void NestedType_NestedFoo_NestedBar::CopyFrom(const NestedType_NestedFoo_NestedBar& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool NestedType_NestedFoo_NestedBar::IsInitialized() const { + return true; +} + +void NestedType_NestedFoo_NestedBar::InternalSwap(NestedType_NestedFoo_NestedBar* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); +} + +::PROTOBUF_NAMESPACE_ID::Metadata NestedType_NestedFoo_NestedBar::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void NestedType_NestedFoo::InitAsDefaultInstance() { + ::test::vereign::grpc::json::pb::_NestedType_NestedFoo_default_instance_._instance.get_mutable()->bar_value_ = const_cast< ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar*>( + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar::internal_default_instance()); +} +class NestedType_NestedFoo::_Internal { + public: + static const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar& bar_value(const NestedType_NestedFoo* msg); +}; + +const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar& +NestedType_NestedFoo::_Internal::bar_value(const NestedType_NestedFoo* msg) { + return *msg->bar_value_; +} +NestedType_NestedFoo::NestedType_NestedFoo() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.NestedType.NestedFoo) +} +NestedType_NestedFoo::NestedType_NestedFoo(const NestedType_NestedFoo& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from._internal_has_bar_value()) { + bar_value_ = new ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar(*from.bar_value_); + } else { + bar_value_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.NestedType.NestedFoo) +} + +void NestedType_NestedFoo::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_NestedType_NestedFoo_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + bar_value_ = nullptr; +} + +NestedType_NestedFoo::~NestedType_NestedFoo() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.NestedType.NestedFoo) + SharedDtor(); +} + +void NestedType_NestedFoo::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete bar_value_; +} + +void NestedType_NestedFoo::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const NestedType_NestedFoo& NestedType_NestedFoo::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_NestedType_NestedFoo_messages_2eproto.base); + return *internal_default_instance(); +} + + +void NestedType_NestedFoo::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == nullptr && bar_value_ != nullptr) { + delete bar_value_; + } + bar_value_ = nullptr; + _internal_metadata_.Clear(); +} + +const char* NestedType_NestedFoo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.NestedType.NestedFoo.value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar bar_value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_bar_value(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* NestedType_NestedFoo::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.NestedType.NestedFoo.value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_value(), target); + } + + // .test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar bar_value = 2; + if (this->has_bar_value()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 2, _Internal::bar_value(this), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.NestedType.NestedFoo) + return target; +} + +size_t NestedType_NestedFoo::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + // .test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar bar_value = 2; + if (this->has_bar_value()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *bar_value_); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void NestedType_NestedFoo::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + GOOGLE_DCHECK_NE(&from, this); + const NestedType_NestedFoo* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<NestedType_NestedFoo>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.NestedType.NestedFoo) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.NestedType.NestedFoo) + MergeFrom(*source); + } +} + +void NestedType_NestedFoo::MergeFrom(const NestedType_NestedFoo& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from.has_bar_value()) { + _internal_mutable_bar_value()->::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar::MergeFrom(from._internal_bar_value()); + } +} + +void NestedType_NestedFoo::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void NestedType_NestedFoo::CopyFrom(const NestedType_NestedFoo& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.NestedType.NestedFoo) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool NestedType_NestedFoo::IsInitialized() const { + return true; +} + +void NestedType_NestedFoo::InternalSwap(NestedType_NestedFoo* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(bar_value_, other->bar_value_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata NestedType_NestedFoo::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void NestedType::InitAsDefaultInstance() { + ::test::vereign::grpc::json::pb::_NestedType_default_instance_._instance.get_mutable()->foo_value_ = const_cast< ::test::vereign::grpc::json::pb::NestedType_NestedFoo*>( + ::test::vereign::grpc::json::pb::NestedType_NestedFoo::internal_default_instance()); +} +class NestedType::_Internal { + public: + static const ::test::vereign::grpc::json::pb::NestedType_NestedFoo& foo_value(const NestedType* msg); +}; + +const ::test::vereign::grpc::json::pb::NestedType_NestedFoo& +NestedType::_Internal::foo_value(const NestedType* msg) { + return *msg->foo_value_; +} +NestedType::NestedType() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:test.vereign.grpc.json.pb.NestedType) +} +NestedType::NestedType(const NestedType& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (!from._internal_value().empty()) { + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from._internal_has_foo_value()) { + foo_value_ = new ::test::vereign::grpc::json::pb::NestedType_NestedFoo(*from.foo_value_); + } else { + foo_value_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:test.vereign.grpc.json.pb.NestedType) +} + +void NestedType::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_NestedType_messages_2eproto.base); + value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + foo_value_ = nullptr; +} + +NestedType::~NestedType() { + // @@protoc_insertion_point(destructor:test.vereign.grpc.json.pb.NestedType) + SharedDtor(); +} + +void NestedType::SharedDtor() { + value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete foo_value_; +} + +void NestedType::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const NestedType& NestedType::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_NestedType_messages_2eproto.base); + return *internal_default_instance(); +} + + +void NestedType::Clear() { +// @@protoc_insertion_point(message_clear_start:test.vereign.grpc.json.pb.NestedType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == nullptr && foo_value_ != nullptr) { + delete foo_value_; + } + foo_value_ = nullptr; + _internal_metadata_.Clear(); +} + +const char* NestedType::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string value = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + auto str = _internal_mutable_value(); + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx); + CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "test.vereign.grpc.json.pb.NestedType.value")); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .test.vereign.grpc.json.pb.NestedType.NestedFoo foo_value = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_foo_value(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* NestedType::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:test.vereign.grpc.json.pb.NestedType) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_value().data(), static_cast<int>(this->_internal_value().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "test.vereign.grpc.json.pb.NestedType.value"); + target = stream->WriteStringMaybeAliased( + 1, this->_internal_value(), target); + } + + // .test.vereign.grpc.json.pb.NestedType.NestedFoo foo_value = 2; + if (this->has_foo_value()) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage( + 2, _Internal::foo_value(this), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:test.vereign.grpc.json.pb.NestedType) + return target; +} + +size_t NestedType::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:test.vereign.grpc.json.pb.NestedType) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string value = 1; + if (this->value().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_value()); + } + + // .test.vereign.grpc.json.pb.NestedType.NestedFoo foo_value = 2; + if (this->has_foo_value()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *foo_value_); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize( + _internal_metadata_, total_size, &_cached_size_); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void NestedType::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:test.vereign.grpc.json.pb.NestedType) + GOOGLE_DCHECK_NE(&from, this); + const NestedType* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<NestedType>( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:test.vereign.grpc.json.pb.NestedType) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:test.vereign.grpc.json.pb.NestedType) + MergeFrom(*source); + } +} + +void NestedType::MergeFrom(const NestedType& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:test.vereign.grpc.json.pb.NestedType) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.value().size() > 0) { + + value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.value_); + } + if (from.has_foo_value()) { + _internal_mutable_foo_value()->::test::vereign::grpc::json::pb::NestedType_NestedFoo::MergeFrom(from._internal_foo_value()); + } +} + +void NestedType::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:test.vereign.grpc.json.pb.NestedType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void NestedType::CopyFrom(const NestedType& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:test.vereign.grpc.json.pb.NestedType) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool NestedType::IsInitialized() const { + return true; +} + +void NestedType::InternalSwap(NestedType* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + value_.Swap(&other->value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(foo_value_, other->foo_value_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata NestedType::GetMetadata() const { + return GetMetadataStatic(); +} + + +// @@protoc_insertion_point(namespace_scope) +} // namespace pb +} // namespace json +} // namespace grpc +} // namespace vereign +} // namespace test +PROTOBUF_NAMESPACE_OPEN +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::SimpleStruct* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::SimpleStruct >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::SimpleStruct >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::RepeatedTypes* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::RepeatedTypes >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::RepeatedTypes >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::Bar* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::Bar >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::Bar >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::Foo* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::Foo >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::Foo >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MessageType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MessageType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MessageType >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapType >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::MapMessageType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::MapMessageType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::MapMessageType >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::BytesType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::BytesType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::BytesType >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::JsonNaming* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::JsonNaming >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::JsonNaming >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::OneofValue* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::OneofValue >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::OneofValue >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::EnumType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::EnumType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::EnumType >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::RepeatedEnumType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::RepeatedEnumType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::RepeatedEnumType >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::NestedType_NestedFoo* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::NestedType_NestedFoo >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::NestedType_NestedFoo >(arena); +} +template<> PROTOBUF_NOINLINE ::test::vereign::grpc::json::pb::NestedType* Arena::CreateMaybeMessage< ::test::vereign::grpc::json::pb::NestedType >(Arena* arena) { + return Arena::CreateInternal< ::test::vereign::grpc::json::pb::NestedType >(arena); +} +PROTOBUF_NAMESPACE_CLOSE + +// @@protoc_insertion_point(global_scope) +#include <google/protobuf/port_undef.inc> diff --git a/cpp/tests/vereign/grpc/json/pb/messages.pb.h b/cpp/tests/vereign/grpc/json/pb/messages.pb.h new file mode 100644 index 0000000000000000000000000000000000000000..46d432512d8bc464e17aa8a998fc2397c199f637 --- /dev/null +++ b/cpp/tests/vereign/grpc/json/pb/messages.pb.h @@ -0,0 +1,6166 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: messages.proto + +#ifndef GOOGLE_PROTOBUF_INCLUDED_messages_2eproto +#define GOOGLE_PROTOBUF_INCLUDED_messages_2eproto + +#include <limits> +#include <string> + +#include <google/protobuf/port_def.inc> +#if PROTOBUF_VERSION < 3011000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 3011002 < PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include <google/protobuf/port_undef.inc> +#include <google/protobuf/io/coded_stream.h> +#include <google/protobuf/arena.h> +#include <google/protobuf/arenastring.h> +#include <google/protobuf/generated_message_table_driven.h> +#include <google/protobuf/generated_message_util.h> +#include <google/protobuf/inlined_string_field.h> +#include <google/protobuf/metadata.h> +#include <google/protobuf/generated_message_reflection.h> +#include <google/protobuf/message.h> +#include <google/protobuf/repeated_field.h> // IWYU pragma: export +#include <google/protobuf/extension_set.h> // IWYU pragma: export +#include <google/protobuf/map.h> // IWYU pragma: export +#include <google/protobuf/map_entry.h> +#include <google/protobuf/map_field_inl.h> +#include <google/protobuf/generated_enum_reflection.h> +#include <google/protobuf/unknown_field_set.h> +// @@protoc_insertion_point(includes) +#include <google/protobuf/port_def.inc> +#define PROTOBUF_INTERNAL_EXPORT_messages_2eproto +PROTOBUF_NAMESPACE_OPEN +namespace internal { +class AnyMetadata; +} // namespace internal +PROTOBUF_NAMESPACE_CLOSE + +// Internal implementation detail -- do not use these members. +struct TableStruct_messages_2eproto { + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTableField entries[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::AuxillaryParseTableField aux[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[27] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[]; + static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[]; + static const ::PROTOBUF_NAMESPACE_ID::uint32 offsets[]; +}; +extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_messages_2eproto; +namespace test { +namespace vereign { +namespace grpc { +namespace json { +namespace pb { +class Bar; +class BarDefaultTypeInternal; +extern BarDefaultTypeInternal _Bar_default_instance_; +class BytesType; +class BytesTypeDefaultTypeInternal; +extern BytesTypeDefaultTypeInternal _BytesType_default_instance_; +class EnumType; +class EnumTypeDefaultTypeInternal; +extern EnumTypeDefaultTypeInternal _EnumType_default_instance_; +class Foo; +class FooDefaultTypeInternal; +extern FooDefaultTypeInternal _Foo_default_instance_; +class JsonNaming; +class JsonNamingDefaultTypeInternal; +extern JsonNamingDefaultTypeInternal _JsonNaming_default_instance_; +class MapMessageType; +class MapMessageTypeDefaultTypeInternal; +extern MapMessageTypeDefaultTypeInternal _MapMessageType_default_instance_; +class MapMessageType_MsgEntry_DoNotUse; +class MapMessageType_MsgEntry_DoNotUseDefaultTypeInternal; +extern MapMessageType_MsgEntry_DoNotUseDefaultTypeInternal _MapMessageType_MsgEntry_DoNotUse_default_instance_; +class MapType; +class MapTypeDefaultTypeInternal; +extern MapTypeDefaultTypeInternal _MapType_default_instance_; +class MapType_Fixed32KeyEntry_DoNotUse; +class MapType_Fixed32KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Fixed32KeyEntry_DoNotUseDefaultTypeInternal _MapType_Fixed32KeyEntry_DoNotUse_default_instance_; +class MapType_Fixed64KeyEntry_DoNotUse; +class MapType_Fixed64KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Fixed64KeyEntry_DoNotUseDefaultTypeInternal _MapType_Fixed64KeyEntry_DoNotUse_default_instance_; +class MapType_Int32KeyEntry_DoNotUse; +class MapType_Int32KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Int32KeyEntry_DoNotUseDefaultTypeInternal _MapType_Int32KeyEntry_DoNotUse_default_instance_; +class MapType_Int64KeyEntry_DoNotUse; +class MapType_Int64KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Int64KeyEntry_DoNotUseDefaultTypeInternal _MapType_Int64KeyEntry_DoNotUse_default_instance_; +class MapType_Sfixed32KeyEntry_DoNotUse; +class MapType_Sfixed32KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Sfixed32KeyEntry_DoNotUseDefaultTypeInternal _MapType_Sfixed32KeyEntry_DoNotUse_default_instance_; +class MapType_Sfixed64KeyEntry_DoNotUse; +class MapType_Sfixed64KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Sfixed64KeyEntry_DoNotUseDefaultTypeInternal _MapType_Sfixed64KeyEntry_DoNotUse_default_instance_; +class MapType_Sint32KeyEntry_DoNotUse; +class MapType_Sint32KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Sint32KeyEntry_DoNotUseDefaultTypeInternal _MapType_Sint32KeyEntry_DoNotUse_default_instance_; +class MapType_Sint64KeyEntry_DoNotUse; +class MapType_Sint64KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Sint64KeyEntry_DoNotUseDefaultTypeInternal _MapType_Sint64KeyEntry_DoNotUse_default_instance_; +class MapType_StringKeyEntry_DoNotUse; +class MapType_StringKeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_StringKeyEntry_DoNotUseDefaultTypeInternal _MapType_StringKeyEntry_DoNotUse_default_instance_; +class MapType_Uint32KeyEntry_DoNotUse; +class MapType_Uint32KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Uint32KeyEntry_DoNotUseDefaultTypeInternal _MapType_Uint32KeyEntry_DoNotUse_default_instance_; +class MapType_Uint64KeyEntry_DoNotUse; +class MapType_Uint64KeyEntry_DoNotUseDefaultTypeInternal; +extern MapType_Uint64KeyEntry_DoNotUseDefaultTypeInternal _MapType_Uint64KeyEntry_DoNotUse_default_instance_; +class MessageType; +class MessageTypeDefaultTypeInternal; +extern MessageTypeDefaultTypeInternal _MessageType_default_instance_; +class NestedType; +class NestedTypeDefaultTypeInternal; +extern NestedTypeDefaultTypeInternal _NestedType_default_instance_; +class NestedType_NestedFoo; +class NestedType_NestedFooDefaultTypeInternal; +extern NestedType_NestedFooDefaultTypeInternal _NestedType_NestedFoo_default_instance_; +class NestedType_NestedFoo_NestedBar; +class NestedType_NestedFoo_NestedBarDefaultTypeInternal; +extern NestedType_NestedFoo_NestedBarDefaultTypeInternal _NestedType_NestedFoo_NestedBar_default_instance_; +class OneofValue; +class OneofValueDefaultTypeInternal; +extern OneofValueDefaultTypeInternal _OneofValue_default_instance_; +class RepeatedEnumType; +class RepeatedEnumTypeDefaultTypeInternal; +extern RepeatedEnumTypeDefaultTypeInternal _RepeatedEnumType_default_instance_; +class RepeatedTypes; +class RepeatedTypesDefaultTypeInternal; +extern RepeatedTypesDefaultTypeInternal _RepeatedTypes_default_instance_; +class SimpleStruct; +class SimpleStructDefaultTypeInternal; +extern SimpleStructDefaultTypeInternal _SimpleStruct_default_instance_; +} // namespace pb +} // namespace json +} // namespace grpc +} // namespace vereign +} // namespace test +PROTOBUF_NAMESPACE_OPEN +template<> ::test::vereign::grpc::json::pb::Bar* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::Bar>(Arena*); +template<> ::test::vereign::grpc::json::pb::BytesType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::BytesType>(Arena*); +template<> ::test::vereign::grpc::json::pb::EnumType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::EnumType>(Arena*); +template<> ::test::vereign::grpc::json::pb::Foo* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::Foo>(Arena*); +template<> ::test::vereign::grpc::json::pb::JsonNaming* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::JsonNaming>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapMessageType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapMessageType>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapMessageType_MsgEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Fixed32KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Fixed64KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Int32KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Int64KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Sfixed32KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Sfixed64KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Sint32KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Sint64KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_StringKeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Uint32KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MapType_Uint64KeyEntry_DoNotUse>(Arena*); +template<> ::test::vereign::grpc::json::pb::MessageType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::MessageType>(Arena*); +template<> ::test::vereign::grpc::json::pb::NestedType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::NestedType>(Arena*); +template<> ::test::vereign::grpc::json::pb::NestedType_NestedFoo* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::NestedType_NestedFoo>(Arena*); +template<> ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar>(Arena*); +template<> ::test::vereign::grpc::json::pb::OneofValue* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::OneofValue>(Arena*); +template<> ::test::vereign::grpc::json::pb::RepeatedEnumType* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::RepeatedEnumType>(Arena*); +template<> ::test::vereign::grpc::json::pb::RepeatedTypes* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::RepeatedTypes>(Arena*); +template<> ::test::vereign::grpc::json::pb::SimpleStruct* Arena::CreateMaybeMessage<::test::vereign::grpc::json::pb::SimpleStruct>(Arena*); +PROTOBUF_NAMESPACE_CLOSE +namespace test { +namespace vereign { +namespace grpc { +namespace json { +namespace pb { + +enum EnumType_Corpus : int { + EnumType_Corpus_UNIVERSAL = 0, + EnumType_Corpus_WEB = 1, + EnumType_Corpus_IMAGES = 2, + EnumType_Corpus_LOCAL = 3, + EnumType_Corpus_NEWS = 4, + EnumType_Corpus_PRODUCTS = 5, + EnumType_Corpus_VIDEO = 6, + EnumType_Corpus_EnumType_Corpus_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + EnumType_Corpus_EnumType_Corpus_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool EnumType_Corpus_IsValid(int value); +constexpr EnumType_Corpus EnumType_Corpus_Corpus_MIN = EnumType_Corpus_UNIVERSAL; +constexpr EnumType_Corpus EnumType_Corpus_Corpus_MAX = EnumType_Corpus_VIDEO; +constexpr int EnumType_Corpus_Corpus_ARRAYSIZE = EnumType_Corpus_Corpus_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* EnumType_Corpus_descriptor(); +template<typename T> +inline const std::string& EnumType_Corpus_Name(T enum_t_value) { + static_assert(::std::is_same<T, EnumType_Corpus>::value || + ::std::is_integral<T>::value, + "Incorrect type passed to function EnumType_Corpus_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + EnumType_Corpus_descriptor(), enum_t_value); +} +inline bool EnumType_Corpus_Parse( + const std::string& name, EnumType_Corpus* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<EnumType_Corpus>( + EnumType_Corpus_descriptor(), name, value); +} +enum RepeatedEnumType_Corpus : int { + RepeatedEnumType_Corpus_UNIVERSAL = 0, + RepeatedEnumType_Corpus_WEB = 1, + RepeatedEnumType_Corpus_IMAGES = 2, + RepeatedEnumType_Corpus_LOCAL = 3, + RepeatedEnumType_Corpus_NEWS = 4, + RepeatedEnumType_Corpus_PRODUCTS = 5, + RepeatedEnumType_Corpus_VIDEO = 6, + RepeatedEnumType_Corpus_RepeatedEnumType_Corpus_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + RepeatedEnumType_Corpus_RepeatedEnumType_Corpus_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool RepeatedEnumType_Corpus_IsValid(int value); +constexpr RepeatedEnumType_Corpus RepeatedEnumType_Corpus_Corpus_MIN = RepeatedEnumType_Corpus_UNIVERSAL; +constexpr RepeatedEnumType_Corpus RepeatedEnumType_Corpus_Corpus_MAX = RepeatedEnumType_Corpus_VIDEO; +constexpr int RepeatedEnumType_Corpus_Corpus_ARRAYSIZE = RepeatedEnumType_Corpus_Corpus_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* RepeatedEnumType_Corpus_descriptor(); +template<typename T> +inline const std::string& RepeatedEnumType_Corpus_Name(T enum_t_value) { + static_assert(::std::is_same<T, RepeatedEnumType_Corpus>::value || + ::std::is_integral<T>::value, + "Incorrect type passed to function RepeatedEnumType_Corpus_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + RepeatedEnumType_Corpus_descriptor(), enum_t_value); +} +inline bool RepeatedEnumType_Corpus_Parse( + const std::string& name, RepeatedEnumType_Corpus* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<RepeatedEnumType_Corpus>( + RepeatedEnumType_Corpus_descriptor(), name, value); +} +// =================================================================== + +class SimpleStruct : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.SimpleStruct) */ { + public: + SimpleStruct(); + virtual ~SimpleStruct(); + + SimpleStruct(const SimpleStruct& from); + SimpleStruct(SimpleStruct&& from) noexcept + : SimpleStruct() { + *this = ::std::move(from); + } + + inline SimpleStruct& operator=(const SimpleStruct& from) { + CopyFrom(from); + return *this; + } + inline SimpleStruct& operator=(SimpleStruct&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const SimpleStruct& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const SimpleStruct* internal_default_instance() { + return reinterpret_cast<const SimpleStruct*>( + &_SimpleStruct_default_instance_); + } + static constexpr int kIndexInFileMessages = + 0; + + friend void swap(SimpleStruct& a, SimpleStruct& b) { + a.Swap(&b); + } + inline void Swap(SimpleStruct* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline SimpleStruct* New() const final { + return CreateMaybeMessage<SimpleStruct>(nullptr); + } + + SimpleStruct* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<SimpleStruct>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const SimpleStruct& from); + void MergeFrom(const SimpleStruct& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(SimpleStruct* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.SimpleStruct"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kStringValueFieldNumber = 14, + kInt64ValueFieldNumber = 2, + kInt32ValueFieldNumber = 1, + kUint32ValueFieldNumber = 3, + kUint64ValueFieldNumber = 4, + kSint64ValueFieldNumber = 6, + kSint32ValueFieldNumber = 5, + kFixed32ValueFieldNumber = 7, + kFixed64ValueFieldNumber = 8, + kSfixed64ValueFieldNumber = 10, + kSfixed32ValueFieldNumber = 9, + kFloatValueFieldNumber = 11, + kDoubleValueFieldNumber = 12, + kBoolValueFieldNumber = 13, + }; + // string string_value = 14; + void clear_string_value(); + const std::string& string_value() const; + void set_string_value(const std::string& value); + void set_string_value(std::string&& value); + void set_string_value(const char* value); + void set_string_value(const char* value, size_t size); + std::string* mutable_string_value(); + std::string* release_string_value(); + void set_allocated_string_value(std::string* string_value); + private: + const std::string& _internal_string_value() const; + void _internal_set_string_value(const std::string& value); + std::string* _internal_mutable_string_value(); + public: + + // int64 int64_value = 2; + void clear_int64_value(); + ::PROTOBUF_NAMESPACE_ID::int64 int64_value() const; + void set_int64_value(::PROTOBUF_NAMESPACE_ID::int64 value); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_int64_value() const; + void _internal_set_int64_value(::PROTOBUF_NAMESPACE_ID::int64 value); + public: + + // int32 int32_value = 1; + void clear_int32_value(); + ::PROTOBUF_NAMESPACE_ID::int32 int32_value() const; + void set_int32_value(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_int32_value() const; + void _internal_set_int32_value(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // uint32 uint32_value = 3; + void clear_uint32_value(); + ::PROTOBUF_NAMESPACE_ID::uint32 uint32_value() const; + void set_uint32_value(::PROTOBUF_NAMESPACE_ID::uint32 value); + private: + ::PROTOBUF_NAMESPACE_ID::uint32 _internal_uint32_value() const; + void _internal_set_uint32_value(::PROTOBUF_NAMESPACE_ID::uint32 value); + public: + + // uint64 uint64_value = 4; + void clear_uint64_value(); + ::PROTOBUF_NAMESPACE_ID::uint64 uint64_value() const; + void set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value); + private: + ::PROTOBUF_NAMESPACE_ID::uint64 _internal_uint64_value() const; + void _internal_set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value); + public: + + // sint64 sint64_value = 6; + void clear_sint64_value(); + ::PROTOBUF_NAMESPACE_ID::int64 sint64_value() const; + void set_sint64_value(::PROTOBUF_NAMESPACE_ID::int64 value); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_sint64_value() const; + void _internal_set_sint64_value(::PROTOBUF_NAMESPACE_ID::int64 value); + public: + + // sint32 sint32_value = 5; + void clear_sint32_value(); + ::PROTOBUF_NAMESPACE_ID::int32 sint32_value() const; + void set_sint32_value(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_sint32_value() const; + void _internal_set_sint32_value(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // fixed32 fixed32_value = 7; + void clear_fixed32_value(); + ::PROTOBUF_NAMESPACE_ID::uint32 fixed32_value() const; + void set_fixed32_value(::PROTOBUF_NAMESPACE_ID::uint32 value); + private: + ::PROTOBUF_NAMESPACE_ID::uint32 _internal_fixed32_value() const; + void _internal_set_fixed32_value(::PROTOBUF_NAMESPACE_ID::uint32 value); + public: + + // fixed64 fixed64_value = 8; + void clear_fixed64_value(); + ::PROTOBUF_NAMESPACE_ID::uint64 fixed64_value() const; + void set_fixed64_value(::PROTOBUF_NAMESPACE_ID::uint64 value); + private: + ::PROTOBUF_NAMESPACE_ID::uint64 _internal_fixed64_value() const; + void _internal_set_fixed64_value(::PROTOBUF_NAMESPACE_ID::uint64 value); + public: + + // sfixed64 sfixed64_value = 10; + void clear_sfixed64_value(); + ::PROTOBUF_NAMESPACE_ID::int64 sfixed64_value() const; + void set_sfixed64_value(::PROTOBUF_NAMESPACE_ID::int64 value); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_sfixed64_value() const; + void _internal_set_sfixed64_value(::PROTOBUF_NAMESPACE_ID::int64 value); + public: + + // sfixed32 sfixed32_value = 9; + void clear_sfixed32_value(); + ::PROTOBUF_NAMESPACE_ID::int32 sfixed32_value() const; + void set_sfixed32_value(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_sfixed32_value() const; + void _internal_set_sfixed32_value(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // float float_value = 11; + void clear_float_value(); + float float_value() const; + void set_float_value(float value); + private: + float _internal_float_value() const; + void _internal_set_float_value(float value); + public: + + // double double_value = 12; + void clear_double_value(); + double double_value() const; + void set_double_value(double value); + private: + double _internal_double_value() const; + void _internal_set_double_value(double value); + public: + + // bool bool_value = 13; + void clear_bool_value(); + bool bool_value() const; + void set_bool_value(bool value); + private: + bool _internal_bool_value() const; + void _internal_set_bool_value(bool value); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.SimpleStruct) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_; + ::PROTOBUF_NAMESPACE_ID::int64 int64_value_; + ::PROTOBUF_NAMESPACE_ID::int32 int32_value_; + ::PROTOBUF_NAMESPACE_ID::uint32 uint32_value_; + ::PROTOBUF_NAMESPACE_ID::uint64 uint64_value_; + ::PROTOBUF_NAMESPACE_ID::int64 sint64_value_; + ::PROTOBUF_NAMESPACE_ID::int32 sint32_value_; + ::PROTOBUF_NAMESPACE_ID::uint32 fixed32_value_; + ::PROTOBUF_NAMESPACE_ID::uint64 fixed64_value_; + ::PROTOBUF_NAMESPACE_ID::int64 sfixed64_value_; + ::PROTOBUF_NAMESPACE_ID::int32 sfixed32_value_; + float float_value_; + double double_value_; + bool bool_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class RepeatedTypes : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.RepeatedTypes) */ { + public: + RepeatedTypes(); + virtual ~RepeatedTypes(); + + RepeatedTypes(const RepeatedTypes& from); + RepeatedTypes(RepeatedTypes&& from) noexcept + : RepeatedTypes() { + *this = ::std::move(from); + } + + inline RepeatedTypes& operator=(const RepeatedTypes& from) { + CopyFrom(from); + return *this; + } + inline RepeatedTypes& operator=(RepeatedTypes&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const RepeatedTypes& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const RepeatedTypes* internal_default_instance() { + return reinterpret_cast<const RepeatedTypes*>( + &_RepeatedTypes_default_instance_); + } + static constexpr int kIndexInFileMessages = + 1; + + friend void swap(RepeatedTypes& a, RepeatedTypes& b) { + a.Swap(&b); + } + inline void Swap(RepeatedTypes* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline RepeatedTypes* New() const final { + return CreateMaybeMessage<RepeatedTypes>(nullptr); + } + + RepeatedTypes* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<RepeatedTypes>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const RepeatedTypes& from); + void MergeFrom(const RepeatedTypes& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(RepeatedTypes* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.RepeatedTypes"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kInt32ArrFieldNumber = 1, + kInt64ArrFieldNumber = 2, + kUint32ArrFieldNumber = 3, + kUint64ArrFieldNumber = 4, + kSint32ArrFieldNumber = 5, + kSint64ArrFieldNumber = 6, + kFixed32ArrFieldNumber = 7, + kFixed64ArrFieldNumber = 8, + kSfixed32ArrFieldNumber = 9, + kSfixed64ArrFieldNumber = 10, + kFloatArrFieldNumber = 11, + kDoubleArrFieldNumber = 12, + kBoolArrFieldNumber = 13, + kStringArrFieldNumber = 14, + }; + // repeated int32 int32_arr = 1; + int int32_arr_size() const; + private: + int _internal_int32_arr_size() const; + public: + void clear_int32_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_int32_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& + _internal_int32_arr() const; + void _internal_add_int32_arr(::PROTOBUF_NAMESPACE_ID::int32 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* + _internal_mutable_int32_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int32 int32_arr(int index) const; + void set_int32_arr(int index, ::PROTOBUF_NAMESPACE_ID::int32 value); + void add_int32_arr(::PROTOBUF_NAMESPACE_ID::int32 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& + int32_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* + mutable_int32_arr(); + + // repeated int64 int64_arr = 2; + int int64_arr_size() const; + private: + int _internal_int64_arr_size() const; + public: + void clear_int64_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_int64_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + _internal_int64_arr() const; + void _internal_add_int64_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + _internal_mutable_int64_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int64 int64_arr(int index) const; + void set_int64_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value); + void add_int64_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + int64_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + mutable_int64_arr(); + + // repeated uint32 uint32_arr = 3; + int uint32_arr_size() const; + private: + int _internal_uint32_arr_size() const; + public: + void clear_uint32_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::uint32 _internal_uint32_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& + _internal_uint32_arr() const; + void _internal_add_uint32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* + _internal_mutable_uint32_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::uint32 uint32_arr(int index) const; + void set_uint32_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint32 value); + void add_uint32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& + uint32_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* + mutable_uint32_arr(); + + // repeated uint64 uint64_arr = 4; + int uint64_arr_size() const; + private: + int _internal_uint64_arr_size() const; + public: + void clear_uint64_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::uint64 _internal_uint64_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& + _internal_uint64_arr() const; + void _internal_add_uint64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* + _internal_mutable_uint64_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::uint64 uint64_arr(int index) const; + void set_uint64_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint64 value); + void add_uint64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& + uint64_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* + mutable_uint64_arr(); + + // repeated sint32 sint32_arr = 5; + int sint32_arr_size() const; + private: + int _internal_sint32_arr_size() const; + public: + void clear_sint32_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_sint32_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& + _internal_sint32_arr() const; + void _internal_add_sint32_arr(::PROTOBUF_NAMESPACE_ID::int32 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* + _internal_mutable_sint32_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int32 sint32_arr(int index) const; + void set_sint32_arr(int index, ::PROTOBUF_NAMESPACE_ID::int32 value); + void add_sint32_arr(::PROTOBUF_NAMESPACE_ID::int32 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& + sint32_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* + mutable_sint32_arr(); + + // repeated sint64 sint64_arr = 6; + int sint64_arr_size() const; + private: + int _internal_sint64_arr_size() const; + public: + void clear_sint64_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_sint64_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + _internal_sint64_arr() const; + void _internal_add_sint64_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + _internal_mutable_sint64_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int64 sint64_arr(int index) const; + void set_sint64_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value); + void add_sint64_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + sint64_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + mutable_sint64_arr(); + + // repeated fixed32 fixed32_arr = 7; + int fixed32_arr_size() const; + private: + int _internal_fixed32_arr_size() const; + public: + void clear_fixed32_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::uint32 _internal_fixed32_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& + _internal_fixed32_arr() const; + void _internal_add_fixed32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* + _internal_mutable_fixed32_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::uint32 fixed32_arr(int index) const; + void set_fixed32_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint32 value); + void add_fixed32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& + fixed32_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* + mutable_fixed32_arr(); + + // repeated fixed64 fixed64_arr = 8; + int fixed64_arr_size() const; + private: + int _internal_fixed64_arr_size() const; + public: + void clear_fixed64_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::uint64 _internal_fixed64_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& + _internal_fixed64_arr() const; + void _internal_add_fixed64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* + _internal_mutable_fixed64_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::uint64 fixed64_arr(int index) const; + void set_fixed64_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint64 value); + void add_fixed64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& + fixed64_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* + mutable_fixed64_arr(); + + // repeated sfixed32 sfixed32_arr = 9; + int sfixed32_arr_size() const; + private: + int _internal_sfixed32_arr_size() const; + public: + void clear_sfixed32_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_sfixed32_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& + _internal_sfixed32_arr() const; + void _internal_add_sfixed32_arr(::PROTOBUF_NAMESPACE_ID::int32 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* + _internal_mutable_sfixed32_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int32 sfixed32_arr(int index) const; + void set_sfixed32_arr(int index, ::PROTOBUF_NAMESPACE_ID::int32 value); + void add_sfixed32_arr(::PROTOBUF_NAMESPACE_ID::int32 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& + sfixed32_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* + mutable_sfixed32_arr(); + + // repeated sfixed64 sfixed64_arr = 10; + int sfixed64_arr_size() const; + private: + int _internal_sfixed64_arr_size() const; + public: + void clear_sfixed64_arr(); + private: + ::PROTOBUF_NAMESPACE_ID::int64 _internal_sfixed64_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + _internal_sfixed64_arr() const; + void _internal_add_sfixed64_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + _internal_mutable_sfixed64_arr(); + public: + ::PROTOBUF_NAMESPACE_ID::int64 sfixed64_arr(int index) const; + void set_sfixed64_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value); + void add_sfixed64_arr(::PROTOBUF_NAMESPACE_ID::int64 value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& + sfixed64_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* + mutable_sfixed64_arr(); + + // repeated float float_arr = 11; + int float_arr_size() const; + private: + int _internal_float_arr_size() const; + public: + void clear_float_arr(); + private: + float _internal_float_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >& + _internal_float_arr() const; + void _internal_add_float_arr(float value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >* + _internal_mutable_float_arr(); + public: + float float_arr(int index) const; + void set_float_arr(int index, float value); + void add_float_arr(float value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >& + float_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >* + mutable_float_arr(); + + // repeated double double_arr = 12; + int double_arr_size() const; + private: + int _internal_double_arr_size() const; + public: + void clear_double_arr(); + private: + double _internal_double_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >& + _internal_double_arr() const; + void _internal_add_double_arr(double value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >* + _internal_mutable_double_arr(); + public: + double double_arr(int index) const; + void set_double_arr(int index, double value); + void add_double_arr(double value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >& + double_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >* + mutable_double_arr(); + + // repeated bool bool_arr = 13; + int bool_arr_size() const; + private: + int _internal_bool_arr_size() const; + public: + void clear_bool_arr(); + private: + bool _internal_bool_arr(int index) const; + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >& + _internal_bool_arr() const; + void _internal_add_bool_arr(bool value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >* + _internal_mutable_bool_arr(); + public: + bool bool_arr(int index) const; + void set_bool_arr(int index, bool value); + void add_bool_arr(bool value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >& + bool_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >* + mutable_bool_arr(); + + // repeated string string_arr = 14; + int string_arr_size() const; + private: + int _internal_string_arr_size() const; + public: + void clear_string_arr(); + const std::string& string_arr(int index) const; + std::string* mutable_string_arr(int index); + void set_string_arr(int index, const std::string& value); + void set_string_arr(int index, std::string&& value); + void set_string_arr(int index, const char* value); + void set_string_arr(int index, const char* value, size_t size); + std::string* add_string_arr(); + void add_string_arr(const std::string& value); + void add_string_arr(std::string&& value); + void add_string_arr(const char* value); + void add_string_arr(const char* value, size_t size); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& string_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_string_arr(); + private: + const std::string& _internal_string_arr(int index) const; + std::string* _internal_add_string_arr(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.RepeatedTypes) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 > int32_arr_; + mutable std::atomic<int> _int32_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 > int64_arr_; + mutable std::atomic<int> _int64_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 > uint32_arr_; + mutable std::atomic<int> _uint32_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 > uint64_arr_; + mutable std::atomic<int> _uint64_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 > sint32_arr_; + mutable std::atomic<int> _sint32_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 > sint64_arr_; + mutable std::atomic<int> _sint64_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 > fixed32_arr_; + mutable std::atomic<int> _fixed32_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 > fixed64_arr_; + mutable std::atomic<int> _fixed64_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 > sfixed32_arr_; + mutable std::atomic<int> _sfixed32_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 > sfixed64_arr_; + mutable std::atomic<int> _sfixed64_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< float > float_arr_; + mutable std::atomic<int> _float_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< double > double_arr_; + mutable std::atomic<int> _double_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool > bool_arr_; + mutable std::atomic<int> _bool_arr_cached_byte_size_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> string_arr_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class Bar : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.Bar) */ { + public: + Bar(); + virtual ~Bar(); + + Bar(const Bar& from); + Bar(Bar&& from) noexcept + : Bar() { + *this = ::std::move(from); + } + + inline Bar& operator=(const Bar& from) { + CopyFrom(from); + return *this; + } + inline Bar& operator=(Bar&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Bar& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Bar* internal_default_instance() { + return reinterpret_cast<const Bar*>( + &_Bar_default_instance_); + } + static constexpr int kIndexInFileMessages = + 2; + + friend void swap(Bar& a, Bar& b) { + a.Swap(&b); + } + inline void Swap(Bar* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline Bar* New() const final { + return CreateMaybeMessage<Bar>(nullptr); + } + + Bar* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<Bar>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Bar& from); + void MergeFrom(const Bar& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Bar* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.Bar"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 2, + }; + // string value = 2; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.Bar) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class Foo : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.Foo) */ { + public: + Foo(); + virtual ~Foo(); + + Foo(const Foo& from); + Foo(Foo&& from) noexcept + : Foo() { + *this = ::std::move(from); + } + + inline Foo& operator=(const Foo& from) { + CopyFrom(from); + return *this; + } + inline Foo& operator=(Foo&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Foo& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Foo* internal_default_instance() { + return reinterpret_cast<const Foo*>( + &_Foo_default_instance_); + } + static constexpr int kIndexInFileMessages = + 3; + + friend void swap(Foo& a, Foo& b) { + a.Swap(&b); + } + inline void Swap(Foo* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline Foo* New() const final { + return CreateMaybeMessage<Foo>(nullptr); + } + + Foo* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<Foo>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Foo& from); + void MergeFrom(const Foo& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Foo* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.Foo"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 1, + kBarFieldNumber = 2, + }; + // string value = 1; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // .test.vereign.grpc.json.pb.Bar bar = 2; + bool has_bar() const; + private: + bool _internal_has_bar() const; + public: + void clear_bar(); + const ::test::vereign::grpc::json::pb::Bar& bar() const; + ::test::vereign::grpc::json::pb::Bar* release_bar(); + ::test::vereign::grpc::json::pb::Bar* mutable_bar(); + void set_allocated_bar(::test::vereign::grpc::json::pb::Bar* bar); + private: + const ::test::vereign::grpc::json::pb::Bar& _internal_bar() const; + ::test::vereign::grpc::json::pb::Bar* _internal_mutable_bar(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.Foo) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + ::test::vereign::grpc::json::pb::Bar* bar_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class MessageType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.MessageType) */ { + public: + MessageType(); + virtual ~MessageType(); + + MessageType(const MessageType& from); + MessageType(MessageType&& from) noexcept + : MessageType() { + *this = ::std::move(from); + } + + inline MessageType& operator=(const MessageType& from) { + CopyFrom(from); + return *this; + } + inline MessageType& operator=(MessageType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const MessageType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const MessageType* internal_default_instance() { + return reinterpret_cast<const MessageType*>( + &_MessageType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 4; + + friend void swap(MessageType& a, MessageType& b) { + a.Swap(&b); + } + inline void Swap(MessageType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline MessageType* New() const final { + return CreateMaybeMessage<MessageType>(nullptr); + } + + MessageType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<MessageType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const MessageType& from); + void MergeFrom(const MessageType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(MessageType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.MessageType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kFooArrFieldNumber = 2, + kFooFieldNumber = 1, + }; + // repeated .test.vereign.grpc.json.pb.Foo foo_arr = 2; + int foo_arr_size() const; + private: + int _internal_foo_arr_size() const; + public: + void clear_foo_arr(); + ::test::vereign::grpc::json::pb::Foo* mutable_foo_arr(int index); + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::test::vereign::grpc::json::pb::Foo >* + mutable_foo_arr(); + private: + const ::test::vereign::grpc::json::pb::Foo& _internal_foo_arr(int index) const; + ::test::vereign::grpc::json::pb::Foo* _internal_add_foo_arr(); + public: + const ::test::vereign::grpc::json::pb::Foo& foo_arr(int index) const; + ::test::vereign::grpc::json::pb::Foo* add_foo_arr(); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::test::vereign::grpc::json::pb::Foo >& + foo_arr() const; + + // .test.vereign.grpc.json.pb.Foo foo = 1; + bool has_foo() const; + private: + bool _internal_has_foo() const; + public: + void clear_foo(); + const ::test::vereign::grpc::json::pb::Foo& foo() const; + ::test::vereign::grpc::json::pb::Foo* release_foo(); + ::test::vereign::grpc::json::pb::Foo* mutable_foo(); + void set_allocated_foo(::test::vereign::grpc::json::pb::Foo* foo); + private: + const ::test::vereign::grpc::json::pb::Foo& _internal_foo() const; + ::test::vereign::grpc::json::pb::Foo* _internal_mutable_foo(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.MessageType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::test::vereign::grpc::json::pb::Foo > foo_arr_; + ::test::vereign::grpc::json::pb::Foo* foo_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class MapType_Int32KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Int32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Int32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Int32KeyEntry_DoNotUse(); + MapType_Int32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Int32KeyEntry_DoNotUse& other); + static const MapType_Int32KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Int32KeyEntry_DoNotUse*>(&_MapType_Int32KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Int32KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[5]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Int64KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Int64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Int64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Int64KeyEntry_DoNotUse(); + MapType_Int64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Int64KeyEntry_DoNotUse& other); + static const MapType_Int64KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Int64KeyEntry_DoNotUse*>(&_MapType_Int64KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Int64KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[6]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Uint32KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Uint32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Uint32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Uint32KeyEntry_DoNotUse(); + MapType_Uint32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Uint32KeyEntry_DoNotUse& other); + static const MapType_Uint32KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Uint32KeyEntry_DoNotUse*>(&_MapType_Uint32KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Uint32KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[7]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Uint64KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Uint64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Uint64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Uint64KeyEntry_DoNotUse(); + MapType_Uint64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Uint64KeyEntry_DoNotUse& other); + static const MapType_Uint64KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Uint64KeyEntry_DoNotUse*>(&_MapType_Uint64KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Uint64KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[8]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Sint32KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sint32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SINT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sint32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SINT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Sint32KeyEntry_DoNotUse(); + MapType_Sint32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Sint32KeyEntry_DoNotUse& other); + static const MapType_Sint32KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Sint32KeyEntry_DoNotUse*>(&_MapType_Sint32KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Sint32KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[9]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Sint64KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sint64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SINT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sint64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SINT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Sint64KeyEntry_DoNotUse(); + MapType_Sint64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Sint64KeyEntry_DoNotUse& other); + static const MapType_Sint64KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Sint64KeyEntry_DoNotUse*>(&_MapType_Sint64KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Sint64KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[10]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Fixed32KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Fixed32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_FIXED32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Fixed32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_FIXED32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Fixed32KeyEntry_DoNotUse(); + MapType_Fixed32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Fixed32KeyEntry_DoNotUse& other); + static const MapType_Fixed32KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Fixed32KeyEntry_DoNotUse*>(&_MapType_Fixed32KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Fixed32KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[11]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Fixed64KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Fixed64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_FIXED64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Fixed64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_FIXED64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Fixed64KeyEntry_DoNotUse(); + MapType_Fixed64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Fixed64KeyEntry_DoNotUse& other); + static const MapType_Fixed64KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Fixed64KeyEntry_DoNotUse*>(&_MapType_Fixed64KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Fixed64KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[12]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Sfixed32KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sfixed32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SFIXED32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sfixed32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SFIXED32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Sfixed32KeyEntry_DoNotUse(); + MapType_Sfixed32KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Sfixed32KeyEntry_DoNotUse& other); + static const MapType_Sfixed32KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Sfixed32KeyEntry_DoNotUse*>(&_MapType_Sfixed32KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Sfixed32KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[13]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_Sfixed64KeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sfixed64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SFIXED64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_Sfixed64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SFIXED64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_Sfixed64KeyEntry_DoNotUse(); + MapType_Sfixed64KeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_Sfixed64KeyEntry_DoNotUse& other); + static const MapType_Sfixed64KeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_Sfixed64KeyEntry_DoNotUse*>(&_MapType_Sfixed64KeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(void*) { return true; } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.Sfixed64KeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[14]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType_StringKeyEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_StringKeyEntry_DoNotUse, + std::string, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapType_StringKeyEntry_DoNotUse, + std::string, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > SuperType; + MapType_StringKeyEntry_DoNotUse(); + MapType_StringKeyEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapType_StringKeyEntry_DoNotUse& other); + static const MapType_StringKeyEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapType_StringKeyEntry_DoNotUse*>(&_MapType_StringKeyEntry_DoNotUse_default_instance_); } + static bool ValidateKey(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.StringKeyEntry.key"); + } + static bool ValidateValue(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapType.StringKeyEntry.value"); + } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[15]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.MapType) */ { + public: + MapType(); + virtual ~MapType(); + + MapType(const MapType& from); + MapType(MapType&& from) noexcept + : MapType() { + *this = ::std::move(from); + } + + inline MapType& operator=(const MapType& from) { + CopyFrom(from); + return *this; + } + inline MapType& operator=(MapType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const MapType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const MapType* internal_default_instance() { + return reinterpret_cast<const MapType*>( + &_MapType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 16; + + friend void swap(MapType& a, MapType& b) { + a.Swap(&b); + } + inline void Swap(MapType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline MapType* New() const final { + return CreateMaybeMessage<MapType>(nullptr); + } + + MapType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<MapType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const MapType& from); + void MergeFrom(const MapType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(MapType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.MapType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kInt32KeyFieldNumber = 1, + kInt64KeyFieldNumber = 2, + kUint32KeyFieldNumber = 3, + kUint64KeyFieldNumber = 4, + kSint32KeyFieldNumber = 5, + kSint64KeyFieldNumber = 6, + kFixed32KeyFieldNumber = 7, + kFixed64KeyFieldNumber = 8, + kSfixed32KeyFieldNumber = 9, + kSfixed64KeyFieldNumber = 10, + kStringKeyFieldNumber = 11, + }; + // map<int32, string> int32_key = 1; + int int32_key_size() const; + private: + int _internal_int32_key_size() const; + public: + void clear_int32_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& + _internal_int32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* + _internal_mutable_int32_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& + int32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* + mutable_int32_key(); + + // map<int64, string> int64_key = 2; + int int64_key_size() const; + private: + int _internal_int64_key_size() const; + public: + void clear_int64_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& + _internal_int64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* + _internal_mutable_int64_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& + int64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* + mutable_int64_key(); + + // map<uint32, string> uint32_key = 3; + int uint32_key_size() const; + private: + int _internal_uint32_key_size() const; + public: + void clear_uint32_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& + _internal_uint32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* + _internal_mutable_uint32_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& + uint32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* + mutable_uint32_key(); + + // map<uint64, string> uint64_key = 4; + int uint64_key_size() const; + private: + int _internal_uint64_key_size() const; + public: + void clear_uint64_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& + _internal_uint64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* + _internal_mutable_uint64_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& + uint64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* + mutable_uint64_key(); + + // map<sint32, string> sint32_key = 5; + int sint32_key_size() const; + private: + int _internal_sint32_key_size() const; + public: + void clear_sint32_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& + _internal_sint32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* + _internal_mutable_sint32_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& + sint32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* + mutable_sint32_key(); + + // map<sint64, string> sint64_key = 6; + int sint64_key_size() const; + private: + int _internal_sint64_key_size() const; + public: + void clear_sint64_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& + _internal_sint64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* + _internal_mutable_sint64_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& + sint64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* + mutable_sint64_key(); + + // map<fixed32, string> fixed32_key = 7; + int fixed32_key_size() const; + private: + int _internal_fixed32_key_size() const; + public: + void clear_fixed32_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& + _internal_fixed32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* + _internal_mutable_fixed32_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& + fixed32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* + mutable_fixed32_key(); + + // map<fixed64, string> fixed64_key = 8; + int fixed64_key_size() const; + private: + int _internal_fixed64_key_size() const; + public: + void clear_fixed64_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& + _internal_fixed64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* + _internal_mutable_fixed64_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& + fixed64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* + mutable_fixed64_key(); + + // map<sfixed32, string> sfixed32_key = 9; + int sfixed32_key_size() const; + private: + int _internal_sfixed32_key_size() const; + public: + void clear_sfixed32_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& + _internal_sfixed32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* + _internal_mutable_sfixed32_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& + sfixed32_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* + mutable_sfixed32_key(); + + // map<sfixed64, string> sfixed64_key = 10; + int sfixed64_key_size() const; + private: + int _internal_sfixed64_key_size() const; + public: + void clear_sfixed64_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& + _internal_sfixed64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* + _internal_mutable_sfixed64_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& + sfixed64_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* + mutable_sfixed64_key(); + + // map<string, string> string_key = 11; + int string_key_size() const; + private: + int _internal_string_key_size() const; + public: + void clear_string_key(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& + _internal_string_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* + _internal_mutable_string_key(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& + string_key() const; + ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* + mutable_string_key(); + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.MapType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Int32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > int32_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Int64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > int64_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Uint32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > uint32_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Uint64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > uint64_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Sint32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SINT32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > sint32_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Sint64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SINT64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > sint64_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Fixed32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_FIXED32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > fixed32_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Fixed64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::uint64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_FIXED64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > fixed64_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Sfixed32KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int32, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SFIXED32, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > sfixed32_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_Sfixed64KeyEntry_DoNotUse, + ::PROTOBUF_NAMESPACE_ID::int64, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_SFIXED64, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > sfixed64_key_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapType_StringKeyEntry_DoNotUse, + std::string, std::string, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + 0 > string_key_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class MapMessageType_MsgEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapMessageType_MsgEntry_DoNotUse, + std::string, ::test::vereign::grpc::json::pb::MessageType, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_MESSAGE, + 0 > { +public: + typedef ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<MapMessageType_MsgEntry_DoNotUse, + std::string, ::test::vereign::grpc::json::pb::MessageType, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_MESSAGE, + 0 > SuperType; + MapMessageType_MsgEntry_DoNotUse(); + MapMessageType_MsgEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena); + void MergeFrom(const MapMessageType_MsgEntry_DoNotUse& other); + static const MapMessageType_MsgEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const MapMessageType_MsgEntry_DoNotUse*>(&_MapMessageType_MsgEntry_DoNotUse_default_instance_); } + static bool ValidateKey(std::string* s) { + return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), static_cast<int>(s->size()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "test.vereign.grpc.json.pb.MapMessageType.MsgEntry.key"); + } + static bool ValidateValue(void*) { return true; } + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final; + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[17]; + } + + public: +}; + +// ------------------------------------------------------------------- + +class MapMessageType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.MapMessageType) */ { + public: + MapMessageType(); + virtual ~MapMessageType(); + + MapMessageType(const MapMessageType& from); + MapMessageType(MapMessageType&& from) noexcept + : MapMessageType() { + *this = ::std::move(from); + } + + inline MapMessageType& operator=(const MapMessageType& from) { + CopyFrom(from); + return *this; + } + inline MapMessageType& operator=(MapMessageType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const MapMessageType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const MapMessageType* internal_default_instance() { + return reinterpret_cast<const MapMessageType*>( + &_MapMessageType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 18; + + friend void swap(MapMessageType& a, MapMessageType& b) { + a.Swap(&b); + } + inline void Swap(MapMessageType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline MapMessageType* New() const final { + return CreateMaybeMessage<MapMessageType>(nullptr); + } + + MapMessageType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<MapMessageType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const MapMessageType& from); + void MergeFrom(const MapMessageType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(MapMessageType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.MapMessageType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + + // accessors ------------------------------------------------------- + + enum : int { + kMsgFieldNumber = 1, + }; + // map<string, .test.vereign.grpc.json.pb.MessageType> msg = 1; + int msg_size() const; + private: + int _internal_msg_size() const; + public: + void clear_msg(); + private: + const ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >& + _internal_msg() const; + ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >* + _internal_mutable_msg(); + public: + const ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >& + msg() const; + ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >* + mutable_msg(); + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.MapMessageType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::MapField< + MapMessageType_MsgEntry_DoNotUse, + std::string, ::test::vereign::grpc::json::pb::MessageType, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING, + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_MESSAGE, + 0 > msg_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class BytesType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.BytesType) */ { + public: + BytesType(); + virtual ~BytesType(); + + BytesType(const BytesType& from); + BytesType(BytesType&& from) noexcept + : BytesType() { + *this = ::std::move(from); + } + + inline BytesType& operator=(const BytesType& from) { + CopyFrom(from); + return *this; + } + inline BytesType& operator=(BytesType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const BytesType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const BytesType* internal_default_instance() { + return reinterpret_cast<const BytesType*>( + &_BytesType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 19; + + friend void swap(BytesType& a, BytesType& b) { + a.Swap(&b); + } + inline void Swap(BytesType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline BytesType* New() const final { + return CreateMaybeMessage<BytesType>(nullptr); + } + + BytesType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<BytesType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const BytesType& from); + void MergeFrom(const BytesType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(BytesType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.BytesType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kBytesArrFieldNumber = 2, + kBytesValueFieldNumber = 1, + }; + // repeated bytes bytes_arr = 2; + int bytes_arr_size() const; + private: + int _internal_bytes_arr_size() const; + public: + void clear_bytes_arr(); + const std::string& bytes_arr(int index) const; + std::string* mutable_bytes_arr(int index); + void set_bytes_arr(int index, const std::string& value); + void set_bytes_arr(int index, std::string&& value); + void set_bytes_arr(int index, const char* value); + void set_bytes_arr(int index, const void* value, size_t size); + std::string* add_bytes_arr(); + void add_bytes_arr(const std::string& value); + void add_bytes_arr(std::string&& value); + void add_bytes_arr(const char* value); + void add_bytes_arr(const void* value, size_t size); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& bytes_arr() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_bytes_arr(); + private: + const std::string& _internal_bytes_arr(int index) const; + std::string* _internal_add_bytes_arr(); + public: + + // bytes bytes_value = 1; + void clear_bytes_value(); + const std::string& bytes_value() const; + void set_bytes_value(const std::string& value); + void set_bytes_value(std::string&& value); + void set_bytes_value(const char* value); + void set_bytes_value(const void* value, size_t size); + std::string* mutable_bytes_value(); + std::string* release_bytes_value(); + void set_allocated_bytes_value(std::string* bytes_value); + private: + const std::string& _internal_bytes_value() const; + void _internal_set_bytes_value(const std::string& value); + std::string* _internal_mutable_bytes_value(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.BytesType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> bytes_arr_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr bytes_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class JsonNaming : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.JsonNaming) */ { + public: + JsonNaming(); + virtual ~JsonNaming(); + + JsonNaming(const JsonNaming& from); + JsonNaming(JsonNaming&& from) noexcept + : JsonNaming() { + *this = ::std::move(from); + } + + inline JsonNaming& operator=(const JsonNaming& from) { + CopyFrom(from); + return *this; + } + inline JsonNaming& operator=(JsonNaming&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const JsonNaming& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const JsonNaming* internal_default_instance() { + return reinterpret_cast<const JsonNaming*>( + &_JsonNaming_default_instance_); + } + static constexpr int kIndexInFileMessages = + 20; + + friend void swap(JsonNaming& a, JsonNaming& b) { + a.Swap(&b); + } + inline void Swap(JsonNaming* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline JsonNaming* New() const final { + return CreateMaybeMessage<JsonNaming>(nullptr); + } + + JsonNaming* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<JsonNaming>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const JsonNaming& from); + void MergeFrom(const JsonNaming& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(JsonNaming* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.JsonNaming"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kFooValueFieldNumber = 1, + kBarValueFieldNumber = 2, + kBazValueFieldNumber = 3, + kQuXValueFieldNumber = 4, + }; + // int32 foo_value = 1; + void clear_foo_value(); + ::PROTOBUF_NAMESPACE_ID::int32 foo_value() const; + void set_foo_value(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_foo_value() const; + void _internal_set_foo_value(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // int32 barValue = 2; + void clear_barvalue(); + ::PROTOBUF_NAMESPACE_ID::int32 barvalue() const; + void set_barvalue(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_barvalue() const; + void _internal_set_barvalue(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // int32 BazValue = 3; + void clear_bazvalue(); + ::PROTOBUF_NAMESPACE_ID::int32 bazvalue() const; + void set_bazvalue(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_bazvalue() const; + void _internal_set_bazvalue(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // int32 quX_Value = 4; + void clear_qux_value(); + ::PROTOBUF_NAMESPACE_ID::int32 qux_value() const; + void set_qux_value(::PROTOBUF_NAMESPACE_ID::int32 value); + private: + ::PROTOBUF_NAMESPACE_ID::int32 _internal_qux_value() const; + void _internal_set_qux_value(::PROTOBUF_NAMESPACE_ID::int32 value); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.JsonNaming) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::int32 foo_value_; + ::PROTOBUF_NAMESPACE_ID::int32 barvalue_; + ::PROTOBUF_NAMESPACE_ID::int32 bazvalue_; + ::PROTOBUF_NAMESPACE_ID::int32 qux_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class OneofValue : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.OneofValue) */ { + public: + OneofValue(); + virtual ~OneofValue(); + + OneofValue(const OneofValue& from); + OneofValue(OneofValue&& from) noexcept + : OneofValue() { + *this = ::std::move(from); + } + + inline OneofValue& operator=(const OneofValue& from) { + CopyFrom(from); + return *this; + } + inline OneofValue& operator=(OneofValue&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const OneofValue& default_instance(); + + enum DataCase { + kStringValue = 1, + kStructValue = 2, + DATA_NOT_SET = 0, + }; + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const OneofValue* internal_default_instance() { + return reinterpret_cast<const OneofValue*>( + &_OneofValue_default_instance_); + } + static constexpr int kIndexInFileMessages = + 21; + + friend void swap(OneofValue& a, OneofValue& b) { + a.Swap(&b); + } + inline void Swap(OneofValue* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline OneofValue* New() const final { + return CreateMaybeMessage<OneofValue>(nullptr); + } + + OneofValue* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<OneofValue>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const OneofValue& from); + void MergeFrom(const OneofValue& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(OneofValue* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.OneofValue"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kStringValueFieldNumber = 1, + kStructValueFieldNumber = 2, + }; + // string string_value = 1; + private: + bool _internal_has_string_value() const; + public: + void clear_string_value(); + const std::string& string_value() const; + void set_string_value(const std::string& value); + void set_string_value(std::string&& value); + void set_string_value(const char* value); + void set_string_value(const char* value, size_t size); + std::string* mutable_string_value(); + std::string* release_string_value(); + void set_allocated_string_value(std::string* string_value); + private: + const std::string& _internal_string_value() const; + void _internal_set_string_value(const std::string& value); + std::string* _internal_mutable_string_value(); + public: + + // .test.vereign.grpc.json.pb.SimpleStruct struct_value = 2; + bool has_struct_value() const; + private: + bool _internal_has_struct_value() const; + public: + void clear_struct_value(); + const ::test::vereign::grpc::json::pb::SimpleStruct& struct_value() const; + ::test::vereign::grpc::json::pb::SimpleStruct* release_struct_value(); + ::test::vereign::grpc::json::pb::SimpleStruct* mutable_struct_value(); + void set_allocated_struct_value(::test::vereign::grpc::json::pb::SimpleStruct* struct_value); + private: + const ::test::vereign::grpc::json::pb::SimpleStruct& _internal_struct_value() const; + ::test::vereign::grpc::json::pb::SimpleStruct* _internal_mutable_struct_value(); + public: + + void clear_data(); + DataCase data_case() const; + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.OneofValue) + private: + class _Internal; + void set_has_string_value(); + void set_has_struct_value(); + + inline bool has_data() const; + inline void clear_has_data(); + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + union DataUnion { + DataUnion() {} + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_; + ::test::vereign::grpc::json::pb::SimpleStruct* struct_value_; + } data_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + ::PROTOBUF_NAMESPACE_ID::uint32 _oneof_case_[1]; + + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class EnumType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.EnumType) */ { + public: + EnumType(); + virtual ~EnumType(); + + EnumType(const EnumType& from); + EnumType(EnumType&& from) noexcept + : EnumType() { + *this = ::std::move(from); + } + + inline EnumType& operator=(const EnumType& from) { + CopyFrom(from); + return *this; + } + inline EnumType& operator=(EnumType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const EnumType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const EnumType* internal_default_instance() { + return reinterpret_cast<const EnumType*>( + &_EnumType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 22; + + friend void swap(EnumType& a, EnumType& b) { + a.Swap(&b); + } + inline void Swap(EnumType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline EnumType* New() const final { + return CreateMaybeMessage<EnumType>(nullptr); + } + + EnumType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<EnumType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const EnumType& from); + void MergeFrom(const EnumType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(EnumType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.EnumType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + typedef EnumType_Corpus Corpus; + static constexpr Corpus UNIVERSAL = + EnumType_Corpus_UNIVERSAL; + static constexpr Corpus WEB = + EnumType_Corpus_WEB; + static constexpr Corpus IMAGES = + EnumType_Corpus_IMAGES; + static constexpr Corpus LOCAL = + EnumType_Corpus_LOCAL; + static constexpr Corpus NEWS = + EnumType_Corpus_NEWS; + static constexpr Corpus PRODUCTS = + EnumType_Corpus_PRODUCTS; + static constexpr Corpus VIDEO = + EnumType_Corpus_VIDEO; + static inline bool Corpus_IsValid(int value) { + return EnumType_Corpus_IsValid(value); + } + static constexpr Corpus Corpus_MIN = + EnumType_Corpus_Corpus_MIN; + static constexpr Corpus Corpus_MAX = + EnumType_Corpus_Corpus_MAX; + static constexpr int Corpus_ARRAYSIZE = + EnumType_Corpus_Corpus_ARRAYSIZE; + static inline const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* + Corpus_descriptor() { + return EnumType_Corpus_descriptor(); + } + template<typename T> + static inline const std::string& Corpus_Name(T enum_t_value) { + static_assert(::std::is_same<T, Corpus>::value || + ::std::is_integral<T>::value, + "Incorrect type passed to function Corpus_Name."); + return EnumType_Corpus_Name(enum_t_value); + } + static inline bool Corpus_Parse(const std::string& name, + Corpus* value) { + return EnumType_Corpus_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + enum : int { + kCorpusFieldNumber = 4, + }; + // .test.vereign.grpc.json.pb.EnumType.Corpus corpus = 4; + void clear_corpus(); + ::test::vereign::grpc::json::pb::EnumType_Corpus corpus() const; + void set_corpus(::test::vereign::grpc::json::pb::EnumType_Corpus value); + private: + ::test::vereign::grpc::json::pb::EnumType_Corpus _internal_corpus() const; + void _internal_set_corpus(::test::vereign::grpc::json::pb::EnumType_Corpus value); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.EnumType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + int corpus_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class RepeatedEnumType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.RepeatedEnumType) */ { + public: + RepeatedEnumType(); + virtual ~RepeatedEnumType(); + + RepeatedEnumType(const RepeatedEnumType& from); + RepeatedEnumType(RepeatedEnumType&& from) noexcept + : RepeatedEnumType() { + *this = ::std::move(from); + } + + inline RepeatedEnumType& operator=(const RepeatedEnumType& from) { + CopyFrom(from); + return *this; + } + inline RepeatedEnumType& operator=(RepeatedEnumType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const RepeatedEnumType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const RepeatedEnumType* internal_default_instance() { + return reinterpret_cast<const RepeatedEnumType*>( + &_RepeatedEnumType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 23; + + friend void swap(RepeatedEnumType& a, RepeatedEnumType& b) { + a.Swap(&b); + } + inline void Swap(RepeatedEnumType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline RepeatedEnumType* New() const final { + return CreateMaybeMessage<RepeatedEnumType>(nullptr); + } + + RepeatedEnumType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<RepeatedEnumType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const RepeatedEnumType& from); + void MergeFrom(const RepeatedEnumType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(RepeatedEnumType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.RepeatedEnumType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + typedef RepeatedEnumType_Corpus Corpus; + static constexpr Corpus UNIVERSAL = + RepeatedEnumType_Corpus_UNIVERSAL; + static constexpr Corpus WEB = + RepeatedEnumType_Corpus_WEB; + static constexpr Corpus IMAGES = + RepeatedEnumType_Corpus_IMAGES; + static constexpr Corpus LOCAL = + RepeatedEnumType_Corpus_LOCAL; + static constexpr Corpus NEWS = + RepeatedEnumType_Corpus_NEWS; + static constexpr Corpus PRODUCTS = + RepeatedEnumType_Corpus_PRODUCTS; + static constexpr Corpus VIDEO = + RepeatedEnumType_Corpus_VIDEO; + static inline bool Corpus_IsValid(int value) { + return RepeatedEnumType_Corpus_IsValid(value); + } + static constexpr Corpus Corpus_MIN = + RepeatedEnumType_Corpus_Corpus_MIN; + static constexpr Corpus Corpus_MAX = + RepeatedEnumType_Corpus_Corpus_MAX; + static constexpr int Corpus_ARRAYSIZE = + RepeatedEnumType_Corpus_Corpus_ARRAYSIZE; + static inline const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* + Corpus_descriptor() { + return RepeatedEnumType_Corpus_descriptor(); + } + template<typename T> + static inline const std::string& Corpus_Name(T enum_t_value) { + static_assert(::std::is_same<T, Corpus>::value || + ::std::is_integral<T>::value, + "Incorrect type passed to function Corpus_Name."); + return RepeatedEnumType_Corpus_Name(enum_t_value); + } + static inline bool Corpus_Parse(const std::string& name, + Corpus* value) { + return RepeatedEnumType_Corpus_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + enum : int { + kCorpusFieldNumber = 4, + }; + // repeated .test.vereign.grpc.json.pb.RepeatedEnumType.Corpus corpus = 4; + int corpus_size() const; + private: + int _internal_corpus_size() const; + public: + void clear_corpus(); + private: + ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus _internal_corpus(int index) const; + void _internal_add_corpus(::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus value); + ::PROTOBUF_NAMESPACE_ID::RepeatedField<int>* _internal_mutable_corpus(); + public: + ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus corpus(int index) const; + void set_corpus(int index, ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus value); + void add_corpus(::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField<int>& corpus() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField<int>* mutable_corpus(); + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.RepeatedEnumType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField<int> corpus_; + mutable std::atomic<int> _corpus_cached_byte_size_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class NestedType_NestedFoo_NestedBar : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) */ { + public: + NestedType_NestedFoo_NestedBar(); + virtual ~NestedType_NestedFoo_NestedBar(); + + NestedType_NestedFoo_NestedBar(const NestedType_NestedFoo_NestedBar& from); + NestedType_NestedFoo_NestedBar(NestedType_NestedFoo_NestedBar&& from) noexcept + : NestedType_NestedFoo_NestedBar() { + *this = ::std::move(from); + } + + inline NestedType_NestedFoo_NestedBar& operator=(const NestedType_NestedFoo_NestedBar& from) { + CopyFrom(from); + return *this; + } + inline NestedType_NestedFoo_NestedBar& operator=(NestedType_NestedFoo_NestedBar&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const NestedType_NestedFoo_NestedBar& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const NestedType_NestedFoo_NestedBar* internal_default_instance() { + return reinterpret_cast<const NestedType_NestedFoo_NestedBar*>( + &_NestedType_NestedFoo_NestedBar_default_instance_); + } + static constexpr int kIndexInFileMessages = + 24; + + friend void swap(NestedType_NestedFoo_NestedBar& a, NestedType_NestedFoo_NestedBar& b) { + a.Swap(&b); + } + inline void Swap(NestedType_NestedFoo_NestedBar* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline NestedType_NestedFoo_NestedBar* New() const final { + return CreateMaybeMessage<NestedType_NestedFoo_NestedBar>(nullptr); + } + + NestedType_NestedFoo_NestedBar* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<NestedType_NestedFoo_NestedBar>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const NestedType_NestedFoo_NestedBar& from); + void MergeFrom(const NestedType_NestedFoo_NestedBar& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(NestedType_NestedFoo_NestedBar* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 1, + }; + // string Value = 1; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class NestedType_NestedFoo : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.NestedType.NestedFoo) */ { + public: + NestedType_NestedFoo(); + virtual ~NestedType_NestedFoo(); + + NestedType_NestedFoo(const NestedType_NestedFoo& from); + NestedType_NestedFoo(NestedType_NestedFoo&& from) noexcept + : NestedType_NestedFoo() { + *this = ::std::move(from); + } + + inline NestedType_NestedFoo& operator=(const NestedType_NestedFoo& from) { + CopyFrom(from); + return *this; + } + inline NestedType_NestedFoo& operator=(NestedType_NestedFoo&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const NestedType_NestedFoo& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const NestedType_NestedFoo* internal_default_instance() { + return reinterpret_cast<const NestedType_NestedFoo*>( + &_NestedType_NestedFoo_default_instance_); + } + static constexpr int kIndexInFileMessages = + 25; + + friend void swap(NestedType_NestedFoo& a, NestedType_NestedFoo& b) { + a.Swap(&b); + } + inline void Swap(NestedType_NestedFoo* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline NestedType_NestedFoo* New() const final { + return CreateMaybeMessage<NestedType_NestedFoo>(nullptr); + } + + NestedType_NestedFoo* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<NestedType_NestedFoo>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const NestedType_NestedFoo& from); + void MergeFrom(const NestedType_NestedFoo& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(NestedType_NestedFoo* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.NestedType.NestedFoo"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + typedef NestedType_NestedFoo_NestedBar NestedBar; + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 1, + kBarValueFieldNumber = 2, + }; + // string value = 1; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // .test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar bar_value = 2; + bool has_bar_value() const; + private: + bool _internal_has_bar_value() const; + public: + void clear_bar_value(); + const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar& bar_value() const; + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* release_bar_value(); + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* mutable_bar_value(); + void set_allocated_bar_value(::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* bar_value); + private: + const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar& _internal_bar_value() const; + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* _internal_mutable_bar_value(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.NestedType.NestedFoo) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* bar_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// ------------------------------------------------------------------- + +class NestedType : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:test.vereign.grpc.json.pb.NestedType) */ { + public: + NestedType(); + virtual ~NestedType(); + + NestedType(const NestedType& from); + NestedType(NestedType&& from) noexcept + : NestedType() { + *this = ::std::move(from); + } + + inline NestedType& operator=(const NestedType& from) { + CopyFrom(from); + return *this; + } + inline NestedType& operator=(NestedType&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const NestedType& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const NestedType* internal_default_instance() { + return reinterpret_cast<const NestedType*>( + &_NestedType_default_instance_); + } + static constexpr int kIndexInFileMessages = + 26; + + friend void swap(NestedType& a, NestedType& b) { + a.Swap(&b); + } + inline void Swap(NestedType* other) { + if (other == this) return; + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + inline NestedType* New() const final { + return CreateMaybeMessage<NestedType>(nullptr); + } + + NestedType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage<NestedType>(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const NestedType& from); + void MergeFrom(const NestedType& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(NestedType* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "test.vereign.grpc.json.pb.NestedType"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto); + return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + typedef NestedType_NestedFoo NestedFoo; + + // accessors ------------------------------------------------------- + + enum : int { + kValueFieldNumber = 1, + kFooValueFieldNumber = 2, + }; + // string value = 1; + void clear_value(); + const std::string& value() const; + void set_value(const std::string& value); + void set_value(std::string&& value); + void set_value(const char* value); + void set_value(const char* value, size_t size); + std::string* mutable_value(); + std::string* release_value(); + void set_allocated_value(std::string* value); + private: + const std::string& _internal_value() const; + void _internal_set_value(const std::string& value); + std::string* _internal_mutable_value(); + public: + + // .test.vereign.grpc.json.pb.NestedType.NestedFoo foo_value = 2; + bool has_foo_value() const; + private: + bool _internal_has_foo_value() const; + public: + void clear_foo_value(); + const ::test::vereign::grpc::json::pb::NestedType_NestedFoo& foo_value() const; + ::test::vereign::grpc::json::pb::NestedType_NestedFoo* release_foo_value(); + ::test::vereign::grpc::json::pb::NestedType_NestedFoo* mutable_foo_value(); + void set_allocated_foo_value(::test::vereign::grpc::json::pb::NestedType_NestedFoo* foo_value); + private: + const ::test::vereign::grpc::json::pb::NestedType_NestedFoo& _internal_foo_value() const; + ::test::vereign::grpc::json::pb::NestedType_NestedFoo* _internal_mutable_foo_value(); + public: + + // @@protoc_insertion_point(class_scope:test.vereign.grpc.json.pb.NestedType) + private: + class _Internal; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr value_; + ::test::vereign::grpc::json::pb::NestedType_NestedFoo* foo_value_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_messages_2eproto; +}; +// =================================================================== + + +// =================================================================== + +#ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// SimpleStruct + +// int32 int32_value = 1; +inline void SimpleStruct::clear_int32_value() { + int32_value_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 SimpleStruct::_internal_int32_value() const { + return int32_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 SimpleStruct::int32_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.int32_value) + return _internal_int32_value(); +} +inline void SimpleStruct::_internal_set_int32_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + + int32_value_ = value; +} +inline void SimpleStruct::set_int32_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_int32_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.int32_value) +} + +// int64 int64_value = 2; +inline void SimpleStruct::clear_int64_value() { + int64_value_ = PROTOBUF_LONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::_internal_int64_value() const { + return int64_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::int64_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.int64_value) + return _internal_int64_value(); +} +inline void SimpleStruct::_internal_set_int64_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + + int64_value_ = value; +} +inline void SimpleStruct::set_int64_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_set_int64_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.int64_value) +} + +// uint32 uint32_value = 3; +inline void SimpleStruct::clear_uint32_value() { + uint32_value_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 SimpleStruct::_internal_uint32_value() const { + return uint32_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 SimpleStruct::uint32_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.uint32_value) + return _internal_uint32_value(); +} +inline void SimpleStruct::_internal_set_uint32_value(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + uint32_value_ = value; +} +inline void SimpleStruct::set_uint32_value(::PROTOBUF_NAMESPACE_ID::uint32 value) { + _internal_set_uint32_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.uint32_value) +} + +// uint64 uint64_value = 4; +inline void SimpleStruct::clear_uint64_value() { + uint64_value_ = PROTOBUF_ULONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::_internal_uint64_value() const { + return uint64_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::uint64_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.uint64_value) + return _internal_uint64_value(); +} +inline void SimpleStruct::_internal_set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) { + + uint64_value_ = value; +} +inline void SimpleStruct::set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) { + _internal_set_uint64_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.uint64_value) +} + +// sint32 sint32_value = 5; +inline void SimpleStruct::clear_sint32_value() { + sint32_value_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 SimpleStruct::_internal_sint32_value() const { + return sint32_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 SimpleStruct::sint32_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.sint32_value) + return _internal_sint32_value(); +} +inline void SimpleStruct::_internal_set_sint32_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + + sint32_value_ = value; +} +inline void SimpleStruct::set_sint32_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_sint32_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.sint32_value) +} + +// sint64 sint64_value = 6; +inline void SimpleStruct::clear_sint64_value() { + sint64_value_ = PROTOBUF_LONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::_internal_sint64_value() const { + return sint64_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::sint64_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.sint64_value) + return _internal_sint64_value(); +} +inline void SimpleStruct::_internal_set_sint64_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + + sint64_value_ = value; +} +inline void SimpleStruct::set_sint64_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_set_sint64_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.sint64_value) +} + +// fixed32 fixed32_value = 7; +inline void SimpleStruct::clear_fixed32_value() { + fixed32_value_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 SimpleStruct::_internal_fixed32_value() const { + return fixed32_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 SimpleStruct::fixed32_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.fixed32_value) + return _internal_fixed32_value(); +} +inline void SimpleStruct::_internal_set_fixed32_value(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + fixed32_value_ = value; +} +inline void SimpleStruct::set_fixed32_value(::PROTOBUF_NAMESPACE_ID::uint32 value) { + _internal_set_fixed32_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.fixed32_value) +} + +// fixed64 fixed64_value = 8; +inline void SimpleStruct::clear_fixed64_value() { + fixed64_value_ = PROTOBUF_ULONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::_internal_fixed64_value() const { + return fixed64_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::fixed64_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.fixed64_value) + return _internal_fixed64_value(); +} +inline void SimpleStruct::_internal_set_fixed64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) { + + fixed64_value_ = value; +} +inline void SimpleStruct::set_fixed64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) { + _internal_set_fixed64_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.fixed64_value) +} + +// sfixed32 sfixed32_value = 9; +inline void SimpleStruct::clear_sfixed32_value() { + sfixed32_value_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 SimpleStruct::_internal_sfixed32_value() const { + return sfixed32_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 SimpleStruct::sfixed32_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.sfixed32_value) + return _internal_sfixed32_value(); +} +inline void SimpleStruct::_internal_set_sfixed32_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + + sfixed32_value_ = value; +} +inline void SimpleStruct::set_sfixed32_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_sfixed32_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.sfixed32_value) +} + +// sfixed64 sfixed64_value = 10; +inline void SimpleStruct::clear_sfixed64_value() { + sfixed64_value_ = PROTOBUF_LONGLONG(0); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::_internal_sfixed64_value() const { + return sfixed64_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int64 SimpleStruct::sfixed64_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.sfixed64_value) + return _internal_sfixed64_value(); +} +inline void SimpleStruct::_internal_set_sfixed64_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + + sfixed64_value_ = value; +} +inline void SimpleStruct::set_sfixed64_value(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_set_sfixed64_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.sfixed64_value) +} + +// float float_value = 11; +inline void SimpleStruct::clear_float_value() { + float_value_ = 0; +} +inline float SimpleStruct::_internal_float_value() const { + return float_value_; +} +inline float SimpleStruct::float_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.float_value) + return _internal_float_value(); +} +inline void SimpleStruct::_internal_set_float_value(float value) { + + float_value_ = value; +} +inline void SimpleStruct::set_float_value(float value) { + _internal_set_float_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.float_value) +} + +// double double_value = 12; +inline void SimpleStruct::clear_double_value() { + double_value_ = 0; +} +inline double SimpleStruct::_internal_double_value() const { + return double_value_; +} +inline double SimpleStruct::double_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.double_value) + return _internal_double_value(); +} +inline void SimpleStruct::_internal_set_double_value(double value) { + + double_value_ = value; +} +inline void SimpleStruct::set_double_value(double value) { + _internal_set_double_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.double_value) +} + +// bool bool_value = 13; +inline void SimpleStruct::clear_bool_value() { + bool_value_ = false; +} +inline bool SimpleStruct::_internal_bool_value() const { + return bool_value_; +} +inline bool SimpleStruct::bool_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.bool_value) + return _internal_bool_value(); +} +inline void SimpleStruct::_internal_set_bool_value(bool value) { + + bool_value_ = value; +} +inline void SimpleStruct::set_bool_value(bool value) { + _internal_set_bool_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.bool_value) +} + +// string string_value = 14; +inline void SimpleStruct::clear_string_value() { + string_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& SimpleStruct::string_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.SimpleStruct.string_value) + return _internal_string_value(); +} +inline void SimpleStruct::set_string_value(const std::string& value) { + _internal_set_string_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.SimpleStruct.string_value) +} +inline std::string* SimpleStruct::mutable_string_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.SimpleStruct.string_value) + return _internal_mutable_string_value(); +} +inline const std::string& SimpleStruct::_internal_string_value() const { + return string_value_.GetNoArena(); +} +inline void SimpleStruct::_internal_set_string_value(const std::string& value) { + + string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void SimpleStruct::set_string_value(std::string&& value) { + + string_value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.SimpleStruct.string_value) +} +inline void SimpleStruct::set_string_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.SimpleStruct.string_value) +} +inline void SimpleStruct::set_string_value(const char* value, size_t size) { + + string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.SimpleStruct.string_value) +} +inline std::string* SimpleStruct::_internal_mutable_string_value() { + + return string_value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* SimpleStruct::release_string_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.SimpleStruct.string_value) + + return string_value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void SimpleStruct::set_allocated_string_value(std::string* string_value) { + if (string_value != nullptr) { + + } else { + + } + string_value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), string_value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.SimpleStruct.string_value) +} + +// ------------------------------------------------------------------- + +// RepeatedTypes + +// repeated int32 int32_arr = 1; +inline int RepeatedTypes::_internal_int32_arr_size() const { + return int32_arr_.size(); +} +inline int RepeatedTypes::int32_arr_size() const { + return _internal_int32_arr_size(); +} +inline void RepeatedTypes::clear_int32_arr() { + int32_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int32 RepeatedTypes::_internal_int32_arr(int index) const { + return int32_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int32 RepeatedTypes::int32_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.int32_arr) + return _internal_int32_arr(index); +} +inline void RepeatedTypes::set_int32_arr(int index, ::PROTOBUF_NAMESPACE_ID::int32 value) { + int32_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.int32_arr) +} +inline void RepeatedTypes::_internal_add_int32_arr(::PROTOBUF_NAMESPACE_ID::int32 value) { + int32_arr_.Add(value); +} +inline void RepeatedTypes::add_int32_arr(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_add_int32_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.int32_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& +RepeatedTypes::_internal_int32_arr() const { + return int32_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& +RepeatedTypes::int32_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.int32_arr) + return _internal_int32_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* +RepeatedTypes::_internal_mutable_int32_arr() { + return &int32_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* +RepeatedTypes::mutable_int32_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.int32_arr) + return _internal_mutable_int32_arr(); +} + +// repeated int64 int64_arr = 2; +inline int RepeatedTypes::_internal_int64_arr_size() const { + return int64_arr_.size(); +} +inline int RepeatedTypes::int64_arr_size() const { + return _internal_int64_arr_size(); +} +inline void RepeatedTypes::clear_int64_arr() { + int64_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 RepeatedTypes::_internal_int64_arr(int index) const { + return int64_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 RepeatedTypes::int64_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.int64_arr) + return _internal_int64_arr(index); +} +inline void RepeatedTypes::set_int64_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value) { + int64_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.int64_arr) +} +inline void RepeatedTypes::_internal_add_int64_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + int64_arr_.Add(value); +} +inline void RepeatedTypes::add_int64_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_add_int64_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.int64_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +RepeatedTypes::_internal_int64_arr() const { + return int64_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +RepeatedTypes::int64_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.int64_arr) + return _internal_int64_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +RepeatedTypes::_internal_mutable_int64_arr() { + return &int64_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +RepeatedTypes::mutable_int64_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.int64_arr) + return _internal_mutable_int64_arr(); +} + +// repeated uint32 uint32_arr = 3; +inline int RepeatedTypes::_internal_uint32_arr_size() const { + return uint32_arr_.size(); +} +inline int RepeatedTypes::uint32_arr_size() const { + return _internal_uint32_arr_size(); +} +inline void RepeatedTypes::clear_uint32_arr() { + uint32_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 RepeatedTypes::_internal_uint32_arr(int index) const { + return uint32_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 RepeatedTypes::uint32_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.uint32_arr) + return _internal_uint32_arr(index); +} +inline void RepeatedTypes::set_uint32_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint32 value) { + uint32_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.uint32_arr) +} +inline void RepeatedTypes::_internal_add_uint32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value) { + uint32_arr_.Add(value); +} +inline void RepeatedTypes::add_uint32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value) { + _internal_add_uint32_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.uint32_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& +RepeatedTypes::_internal_uint32_arr() const { + return uint32_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& +RepeatedTypes::uint32_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.uint32_arr) + return _internal_uint32_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* +RepeatedTypes::_internal_mutable_uint32_arr() { + return &uint32_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* +RepeatedTypes::mutable_uint32_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.uint32_arr) + return _internal_mutable_uint32_arr(); +} + +// repeated uint64 uint64_arr = 4; +inline int RepeatedTypes::_internal_uint64_arr_size() const { + return uint64_arr_.size(); +} +inline int RepeatedTypes::uint64_arr_size() const { + return _internal_uint64_arr_size(); +} +inline void RepeatedTypes::clear_uint64_arr() { + uint64_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 RepeatedTypes::_internal_uint64_arr(int index) const { + return uint64_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 RepeatedTypes::uint64_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.uint64_arr) + return _internal_uint64_arr(index); +} +inline void RepeatedTypes::set_uint64_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint64 value) { + uint64_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.uint64_arr) +} +inline void RepeatedTypes::_internal_add_uint64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value) { + uint64_arr_.Add(value); +} +inline void RepeatedTypes::add_uint64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value) { + _internal_add_uint64_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.uint64_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& +RepeatedTypes::_internal_uint64_arr() const { + return uint64_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& +RepeatedTypes::uint64_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.uint64_arr) + return _internal_uint64_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* +RepeatedTypes::_internal_mutable_uint64_arr() { + return &uint64_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* +RepeatedTypes::mutable_uint64_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.uint64_arr) + return _internal_mutable_uint64_arr(); +} + +// repeated sint32 sint32_arr = 5; +inline int RepeatedTypes::_internal_sint32_arr_size() const { + return sint32_arr_.size(); +} +inline int RepeatedTypes::sint32_arr_size() const { + return _internal_sint32_arr_size(); +} +inline void RepeatedTypes::clear_sint32_arr() { + sint32_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int32 RepeatedTypes::_internal_sint32_arr(int index) const { + return sint32_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int32 RepeatedTypes::sint32_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.sint32_arr) + return _internal_sint32_arr(index); +} +inline void RepeatedTypes::set_sint32_arr(int index, ::PROTOBUF_NAMESPACE_ID::int32 value) { + sint32_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.sint32_arr) +} +inline void RepeatedTypes::_internal_add_sint32_arr(::PROTOBUF_NAMESPACE_ID::int32 value) { + sint32_arr_.Add(value); +} +inline void RepeatedTypes::add_sint32_arr(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_add_sint32_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.sint32_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& +RepeatedTypes::_internal_sint32_arr() const { + return sint32_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& +RepeatedTypes::sint32_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.sint32_arr) + return _internal_sint32_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* +RepeatedTypes::_internal_mutable_sint32_arr() { + return &sint32_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* +RepeatedTypes::mutable_sint32_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.sint32_arr) + return _internal_mutable_sint32_arr(); +} + +// repeated sint64 sint64_arr = 6; +inline int RepeatedTypes::_internal_sint64_arr_size() const { + return sint64_arr_.size(); +} +inline int RepeatedTypes::sint64_arr_size() const { + return _internal_sint64_arr_size(); +} +inline void RepeatedTypes::clear_sint64_arr() { + sint64_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 RepeatedTypes::_internal_sint64_arr(int index) const { + return sint64_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 RepeatedTypes::sint64_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.sint64_arr) + return _internal_sint64_arr(index); +} +inline void RepeatedTypes::set_sint64_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value) { + sint64_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.sint64_arr) +} +inline void RepeatedTypes::_internal_add_sint64_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + sint64_arr_.Add(value); +} +inline void RepeatedTypes::add_sint64_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_add_sint64_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.sint64_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +RepeatedTypes::_internal_sint64_arr() const { + return sint64_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +RepeatedTypes::sint64_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.sint64_arr) + return _internal_sint64_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +RepeatedTypes::_internal_mutable_sint64_arr() { + return &sint64_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +RepeatedTypes::mutable_sint64_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.sint64_arr) + return _internal_mutable_sint64_arr(); +} + +// repeated fixed32 fixed32_arr = 7; +inline int RepeatedTypes::_internal_fixed32_arr_size() const { + return fixed32_arr_.size(); +} +inline int RepeatedTypes::fixed32_arr_size() const { + return _internal_fixed32_arr_size(); +} +inline void RepeatedTypes::clear_fixed32_arr() { + fixed32_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 RepeatedTypes::_internal_fixed32_arr(int index) const { + return fixed32_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 RepeatedTypes::fixed32_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.fixed32_arr) + return _internal_fixed32_arr(index); +} +inline void RepeatedTypes::set_fixed32_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint32 value) { + fixed32_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.fixed32_arr) +} +inline void RepeatedTypes::_internal_add_fixed32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value) { + fixed32_arr_.Add(value); +} +inline void RepeatedTypes::add_fixed32_arr(::PROTOBUF_NAMESPACE_ID::uint32 value) { + _internal_add_fixed32_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.fixed32_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& +RepeatedTypes::_internal_fixed32_arr() const { + return fixed32_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >& +RepeatedTypes::fixed32_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.fixed32_arr) + return _internal_fixed32_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* +RepeatedTypes::_internal_mutable_fixed32_arr() { + return &fixed32_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint32 >* +RepeatedTypes::mutable_fixed32_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.fixed32_arr) + return _internal_mutable_fixed32_arr(); +} + +// repeated fixed64 fixed64_arr = 8; +inline int RepeatedTypes::_internal_fixed64_arr_size() const { + return fixed64_arr_.size(); +} +inline int RepeatedTypes::fixed64_arr_size() const { + return _internal_fixed64_arr_size(); +} +inline void RepeatedTypes::clear_fixed64_arr() { + fixed64_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 RepeatedTypes::_internal_fixed64_arr(int index) const { + return fixed64_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::uint64 RepeatedTypes::fixed64_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.fixed64_arr) + return _internal_fixed64_arr(index); +} +inline void RepeatedTypes::set_fixed64_arr(int index, ::PROTOBUF_NAMESPACE_ID::uint64 value) { + fixed64_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.fixed64_arr) +} +inline void RepeatedTypes::_internal_add_fixed64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value) { + fixed64_arr_.Add(value); +} +inline void RepeatedTypes::add_fixed64_arr(::PROTOBUF_NAMESPACE_ID::uint64 value) { + _internal_add_fixed64_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.fixed64_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& +RepeatedTypes::_internal_fixed64_arr() const { + return fixed64_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >& +RepeatedTypes::fixed64_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.fixed64_arr) + return _internal_fixed64_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* +RepeatedTypes::_internal_mutable_fixed64_arr() { + return &fixed64_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::uint64 >* +RepeatedTypes::mutable_fixed64_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.fixed64_arr) + return _internal_mutable_fixed64_arr(); +} + +// repeated sfixed32 sfixed32_arr = 9; +inline int RepeatedTypes::_internal_sfixed32_arr_size() const { + return sfixed32_arr_.size(); +} +inline int RepeatedTypes::sfixed32_arr_size() const { + return _internal_sfixed32_arr_size(); +} +inline void RepeatedTypes::clear_sfixed32_arr() { + sfixed32_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int32 RepeatedTypes::_internal_sfixed32_arr(int index) const { + return sfixed32_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int32 RepeatedTypes::sfixed32_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.sfixed32_arr) + return _internal_sfixed32_arr(index); +} +inline void RepeatedTypes::set_sfixed32_arr(int index, ::PROTOBUF_NAMESPACE_ID::int32 value) { + sfixed32_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.sfixed32_arr) +} +inline void RepeatedTypes::_internal_add_sfixed32_arr(::PROTOBUF_NAMESPACE_ID::int32 value) { + sfixed32_arr_.Add(value); +} +inline void RepeatedTypes::add_sfixed32_arr(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_add_sfixed32_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.sfixed32_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& +RepeatedTypes::_internal_sfixed32_arr() const { + return sfixed32_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >& +RepeatedTypes::sfixed32_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.sfixed32_arr) + return _internal_sfixed32_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* +RepeatedTypes::_internal_mutable_sfixed32_arr() { + return &sfixed32_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 >* +RepeatedTypes::mutable_sfixed32_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.sfixed32_arr) + return _internal_mutable_sfixed32_arr(); +} + +// repeated sfixed64 sfixed64_arr = 10; +inline int RepeatedTypes::_internal_sfixed64_arr_size() const { + return sfixed64_arr_.size(); +} +inline int RepeatedTypes::sfixed64_arr_size() const { + return _internal_sfixed64_arr_size(); +} +inline void RepeatedTypes::clear_sfixed64_arr() { + sfixed64_arr_.Clear(); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 RepeatedTypes::_internal_sfixed64_arr(int index) const { + return sfixed64_arr_.Get(index); +} +inline ::PROTOBUF_NAMESPACE_ID::int64 RepeatedTypes::sfixed64_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.sfixed64_arr) + return _internal_sfixed64_arr(index); +} +inline void RepeatedTypes::set_sfixed64_arr(int index, ::PROTOBUF_NAMESPACE_ID::int64 value) { + sfixed64_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.sfixed64_arr) +} +inline void RepeatedTypes::_internal_add_sfixed64_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + sfixed64_arr_.Add(value); +} +inline void RepeatedTypes::add_sfixed64_arr(::PROTOBUF_NAMESPACE_ID::int64 value) { + _internal_add_sfixed64_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.sfixed64_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +RepeatedTypes::_internal_sfixed64_arr() const { + return sfixed64_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >& +RepeatedTypes::sfixed64_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.sfixed64_arr) + return _internal_sfixed64_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +RepeatedTypes::_internal_mutable_sfixed64_arr() { + return &sfixed64_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >* +RepeatedTypes::mutable_sfixed64_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.sfixed64_arr) + return _internal_mutable_sfixed64_arr(); +} + +// repeated float float_arr = 11; +inline int RepeatedTypes::_internal_float_arr_size() const { + return float_arr_.size(); +} +inline int RepeatedTypes::float_arr_size() const { + return _internal_float_arr_size(); +} +inline void RepeatedTypes::clear_float_arr() { + float_arr_.Clear(); +} +inline float RepeatedTypes::_internal_float_arr(int index) const { + return float_arr_.Get(index); +} +inline float RepeatedTypes::float_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.float_arr) + return _internal_float_arr(index); +} +inline void RepeatedTypes::set_float_arr(int index, float value) { + float_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.float_arr) +} +inline void RepeatedTypes::_internal_add_float_arr(float value) { + float_arr_.Add(value); +} +inline void RepeatedTypes::add_float_arr(float value) { + _internal_add_float_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.float_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >& +RepeatedTypes::_internal_float_arr() const { + return float_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >& +RepeatedTypes::float_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.float_arr) + return _internal_float_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >* +RepeatedTypes::_internal_mutable_float_arr() { + return &float_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >* +RepeatedTypes::mutable_float_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.float_arr) + return _internal_mutable_float_arr(); +} + +// repeated double double_arr = 12; +inline int RepeatedTypes::_internal_double_arr_size() const { + return double_arr_.size(); +} +inline int RepeatedTypes::double_arr_size() const { + return _internal_double_arr_size(); +} +inline void RepeatedTypes::clear_double_arr() { + double_arr_.Clear(); +} +inline double RepeatedTypes::_internal_double_arr(int index) const { + return double_arr_.Get(index); +} +inline double RepeatedTypes::double_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.double_arr) + return _internal_double_arr(index); +} +inline void RepeatedTypes::set_double_arr(int index, double value) { + double_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.double_arr) +} +inline void RepeatedTypes::_internal_add_double_arr(double value) { + double_arr_.Add(value); +} +inline void RepeatedTypes::add_double_arr(double value) { + _internal_add_double_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.double_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >& +RepeatedTypes::_internal_double_arr() const { + return double_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >& +RepeatedTypes::double_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.double_arr) + return _internal_double_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >* +RepeatedTypes::_internal_mutable_double_arr() { + return &double_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< double >* +RepeatedTypes::mutable_double_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.double_arr) + return _internal_mutable_double_arr(); +} + +// repeated bool bool_arr = 13; +inline int RepeatedTypes::_internal_bool_arr_size() const { + return bool_arr_.size(); +} +inline int RepeatedTypes::bool_arr_size() const { + return _internal_bool_arr_size(); +} +inline void RepeatedTypes::clear_bool_arr() { + bool_arr_.Clear(); +} +inline bool RepeatedTypes::_internal_bool_arr(int index) const { + return bool_arr_.Get(index); +} +inline bool RepeatedTypes::bool_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.bool_arr) + return _internal_bool_arr(index); +} +inline void RepeatedTypes::set_bool_arr(int index, bool value) { + bool_arr_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.bool_arr) +} +inline void RepeatedTypes::_internal_add_bool_arr(bool value) { + bool_arr_.Add(value); +} +inline void RepeatedTypes::add_bool_arr(bool value) { + _internal_add_bool_arr(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.bool_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >& +RepeatedTypes::_internal_bool_arr() const { + return bool_arr_; +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >& +RepeatedTypes::bool_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.bool_arr) + return _internal_bool_arr(); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >* +RepeatedTypes::_internal_mutable_bool_arr() { + return &bool_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< bool >* +RepeatedTypes::mutable_bool_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.bool_arr) + return _internal_mutable_bool_arr(); +} + +// repeated string string_arr = 14; +inline int RepeatedTypes::_internal_string_arr_size() const { + return string_arr_.size(); +} +inline int RepeatedTypes::string_arr_size() const { + return _internal_string_arr_size(); +} +inline void RepeatedTypes::clear_string_arr() { + string_arr_.Clear(); +} +inline std::string* RepeatedTypes::add_string_arr() { + // @@protoc_insertion_point(field_add_mutable:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + return _internal_add_string_arr(); +} +inline const std::string& RepeatedTypes::_internal_string_arr(int index) const { + return string_arr_.Get(index); +} +inline const std::string& RepeatedTypes::string_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + return _internal_string_arr(index); +} +inline std::string* RepeatedTypes::mutable_string_arr(int index) { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + return string_arr_.Mutable(index); +} +inline void RepeatedTypes::set_string_arr(int index, const std::string& value) { + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + string_arr_.Mutable(index)->assign(value); +} +inline void RepeatedTypes::set_string_arr(int index, std::string&& value) { + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + string_arr_.Mutable(index)->assign(std::move(value)); +} +inline void RepeatedTypes::set_string_arr(int index, const char* value) { + GOOGLE_DCHECK(value != nullptr); + string_arr_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) +} +inline void RepeatedTypes::set_string_arr(int index, const char* value, size_t size) { + string_arr_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) +} +inline std::string* RepeatedTypes::_internal_add_string_arr() { + return string_arr_.Add(); +} +inline void RepeatedTypes::add_string_arr(const std::string& value) { + string_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) +} +inline void RepeatedTypes::add_string_arr(std::string&& value) { + string_arr_.Add(std::move(value)); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) +} +inline void RepeatedTypes::add_string_arr(const char* value) { + GOOGLE_DCHECK(value != nullptr); + string_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) +} +inline void RepeatedTypes::add_string_arr(const char* value, size_t size) { + string_arr_.Add()->assign(reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_add_pointer:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& +RepeatedTypes::string_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + return string_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* +RepeatedTypes::mutable_string_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedTypes.string_arr) + return &string_arr_; +} + +// ------------------------------------------------------------------- + +// Bar + +// string value = 2; +inline void Bar::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& Bar::value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.Bar.value) + return _internal_value(); +} +inline void Bar::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.Bar.value) +} +inline std::string* Bar::mutable_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.Bar.value) + return _internal_mutable_value(); +} +inline const std::string& Bar::_internal_value() const { + return value_.GetNoArena(); +} +inline void Bar::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void Bar::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.Bar.value) +} +inline void Bar::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.Bar.value) +} +inline void Bar::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.Bar.value) +} +inline std::string* Bar::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* Bar::release_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.Bar.value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void Bar::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.Bar.value) +} + +// ------------------------------------------------------------------- + +// Foo + +// string value = 1; +inline void Foo::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& Foo::value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.Foo.value) + return _internal_value(); +} +inline void Foo::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.Foo.value) +} +inline std::string* Foo::mutable_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.Foo.value) + return _internal_mutable_value(); +} +inline const std::string& Foo::_internal_value() const { + return value_.GetNoArena(); +} +inline void Foo::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void Foo::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.Foo.value) +} +inline void Foo::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.Foo.value) +} +inline void Foo::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.Foo.value) +} +inline std::string* Foo::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* Foo::release_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.Foo.value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void Foo::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.Foo.value) +} + +// .test.vereign.grpc.json.pb.Bar bar = 2; +inline bool Foo::_internal_has_bar() const { + return this != internal_default_instance() && bar_ != nullptr; +} +inline bool Foo::has_bar() const { + return _internal_has_bar(); +} +inline void Foo::clear_bar() { + if (GetArenaNoVirtual() == nullptr && bar_ != nullptr) { + delete bar_; + } + bar_ = nullptr; +} +inline const ::test::vereign::grpc::json::pb::Bar& Foo::_internal_bar() const { + const ::test::vereign::grpc::json::pb::Bar* p = bar_; + return p != nullptr ? *p : *reinterpret_cast<const ::test::vereign::grpc::json::pb::Bar*>( + &::test::vereign::grpc::json::pb::_Bar_default_instance_); +} +inline const ::test::vereign::grpc::json::pb::Bar& Foo::bar() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.Foo.bar) + return _internal_bar(); +} +inline ::test::vereign::grpc::json::pb::Bar* Foo::release_bar() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.Foo.bar) + + ::test::vereign::grpc::json::pb::Bar* temp = bar_; + bar_ = nullptr; + return temp; +} +inline ::test::vereign::grpc::json::pb::Bar* Foo::_internal_mutable_bar() { + + if (bar_ == nullptr) { + auto* p = CreateMaybeMessage<::test::vereign::grpc::json::pb::Bar>(GetArenaNoVirtual()); + bar_ = p; + } + return bar_; +} +inline ::test::vereign::grpc::json::pb::Bar* Foo::mutable_bar() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.Foo.bar) + return _internal_mutable_bar(); +} +inline void Foo::set_allocated_bar(::test::vereign::grpc::json::pb::Bar* bar) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete bar_; + } + if (bar) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + bar = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, bar, submessage_arena); + } + + } else { + + } + bar_ = bar; + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.Foo.bar) +} + +// ------------------------------------------------------------------- + +// MessageType + +// .test.vereign.grpc.json.pb.Foo foo = 1; +inline bool MessageType::_internal_has_foo() const { + return this != internal_default_instance() && foo_ != nullptr; +} +inline bool MessageType::has_foo() const { + return _internal_has_foo(); +} +inline void MessageType::clear_foo() { + if (GetArenaNoVirtual() == nullptr && foo_ != nullptr) { + delete foo_; + } + foo_ = nullptr; +} +inline const ::test::vereign::grpc::json::pb::Foo& MessageType::_internal_foo() const { + const ::test::vereign::grpc::json::pb::Foo* p = foo_; + return p != nullptr ? *p : *reinterpret_cast<const ::test::vereign::grpc::json::pb::Foo*>( + &::test::vereign::grpc::json::pb::_Foo_default_instance_); +} +inline const ::test::vereign::grpc::json::pb::Foo& MessageType::foo() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.MessageType.foo) + return _internal_foo(); +} +inline ::test::vereign::grpc::json::pb::Foo* MessageType::release_foo() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.MessageType.foo) + + ::test::vereign::grpc::json::pb::Foo* temp = foo_; + foo_ = nullptr; + return temp; +} +inline ::test::vereign::grpc::json::pb::Foo* MessageType::_internal_mutable_foo() { + + if (foo_ == nullptr) { + auto* p = CreateMaybeMessage<::test::vereign::grpc::json::pb::Foo>(GetArenaNoVirtual()); + foo_ = p; + } + return foo_; +} +inline ::test::vereign::grpc::json::pb::Foo* MessageType::mutable_foo() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.MessageType.foo) + return _internal_mutable_foo(); +} +inline void MessageType::set_allocated_foo(::test::vereign::grpc::json::pb::Foo* foo) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete foo_; + } + if (foo) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + foo = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, foo, submessage_arena); + } + + } else { + + } + foo_ = foo; + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.MessageType.foo) +} + +// repeated .test.vereign.grpc.json.pb.Foo foo_arr = 2; +inline int MessageType::_internal_foo_arr_size() const { + return foo_arr_.size(); +} +inline int MessageType::foo_arr_size() const { + return _internal_foo_arr_size(); +} +inline void MessageType::clear_foo_arr() { + foo_arr_.Clear(); +} +inline ::test::vereign::grpc::json::pb::Foo* MessageType::mutable_foo_arr(int index) { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.MessageType.foo_arr) + return foo_arr_.Mutable(index); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::test::vereign::grpc::json::pb::Foo >* +MessageType::mutable_foo_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.MessageType.foo_arr) + return &foo_arr_; +} +inline const ::test::vereign::grpc::json::pb::Foo& MessageType::_internal_foo_arr(int index) const { + return foo_arr_.Get(index); +} +inline const ::test::vereign::grpc::json::pb::Foo& MessageType::foo_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.MessageType.foo_arr) + return _internal_foo_arr(index); +} +inline ::test::vereign::grpc::json::pb::Foo* MessageType::_internal_add_foo_arr() { + return foo_arr_.Add(); +} +inline ::test::vereign::grpc::json::pb::Foo* MessageType::add_foo_arr() { + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.MessageType.foo_arr) + return _internal_add_foo_arr(); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::test::vereign::grpc::json::pb::Foo >& +MessageType::foo_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.MessageType.foo_arr) + return foo_arr_; +} + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// MapType + +// map<int32, string> int32_key = 1; +inline int MapType::_internal_int32_key_size() const { + return int32_key_.size(); +} +inline int MapType::int32_key_size() const { + return _internal_int32_key_size(); +} +inline void MapType::clear_int32_key() { + int32_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& +MapType::_internal_int32_key() const { + return int32_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& +MapType::int32_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.int32_key) + return _internal_int32_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* +MapType::_internal_mutable_int32_key() { + return int32_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* +MapType::mutable_int32_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.int32_key) + return _internal_mutable_int32_key(); +} + +// map<int64, string> int64_key = 2; +inline int MapType::_internal_int64_key_size() const { + return int64_key_.size(); +} +inline int MapType::int64_key_size() const { + return _internal_int64_key_size(); +} +inline void MapType::clear_int64_key() { + int64_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& +MapType::_internal_int64_key() const { + return int64_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& +MapType::int64_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.int64_key) + return _internal_int64_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* +MapType::_internal_mutable_int64_key() { + return int64_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* +MapType::mutable_int64_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.int64_key) + return _internal_mutable_int64_key(); +} + +// map<uint32, string> uint32_key = 3; +inline int MapType::_internal_uint32_key_size() const { + return uint32_key_.size(); +} +inline int MapType::uint32_key_size() const { + return _internal_uint32_key_size(); +} +inline void MapType::clear_uint32_key() { + uint32_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& +MapType::_internal_uint32_key() const { + return uint32_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& +MapType::uint32_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.uint32_key) + return _internal_uint32_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* +MapType::_internal_mutable_uint32_key() { + return uint32_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* +MapType::mutable_uint32_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.uint32_key) + return _internal_mutable_uint32_key(); +} + +// map<uint64, string> uint64_key = 4; +inline int MapType::_internal_uint64_key_size() const { + return uint64_key_.size(); +} +inline int MapType::uint64_key_size() const { + return _internal_uint64_key_size(); +} +inline void MapType::clear_uint64_key() { + uint64_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& +MapType::_internal_uint64_key() const { + return uint64_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& +MapType::uint64_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.uint64_key) + return _internal_uint64_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* +MapType::_internal_mutable_uint64_key() { + return uint64_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* +MapType::mutable_uint64_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.uint64_key) + return _internal_mutable_uint64_key(); +} + +// map<sint32, string> sint32_key = 5; +inline int MapType::_internal_sint32_key_size() const { + return sint32_key_.size(); +} +inline int MapType::sint32_key_size() const { + return _internal_sint32_key_size(); +} +inline void MapType::clear_sint32_key() { + sint32_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& +MapType::_internal_sint32_key() const { + return sint32_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& +MapType::sint32_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.sint32_key) + return _internal_sint32_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* +MapType::_internal_mutable_sint32_key() { + return sint32_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* +MapType::mutable_sint32_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.sint32_key) + return _internal_mutable_sint32_key(); +} + +// map<sint64, string> sint64_key = 6; +inline int MapType::_internal_sint64_key_size() const { + return sint64_key_.size(); +} +inline int MapType::sint64_key_size() const { + return _internal_sint64_key_size(); +} +inline void MapType::clear_sint64_key() { + sint64_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& +MapType::_internal_sint64_key() const { + return sint64_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& +MapType::sint64_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.sint64_key) + return _internal_sint64_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* +MapType::_internal_mutable_sint64_key() { + return sint64_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* +MapType::mutable_sint64_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.sint64_key) + return _internal_mutable_sint64_key(); +} + +// map<fixed32, string> fixed32_key = 7; +inline int MapType::_internal_fixed32_key_size() const { + return fixed32_key_.size(); +} +inline int MapType::fixed32_key_size() const { + return _internal_fixed32_key_size(); +} +inline void MapType::clear_fixed32_key() { + fixed32_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& +MapType::_internal_fixed32_key() const { + return fixed32_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >& +MapType::fixed32_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.fixed32_key) + return _internal_fixed32_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* +MapType::_internal_mutable_fixed32_key() { + return fixed32_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint32, std::string >* +MapType::mutable_fixed32_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.fixed32_key) + return _internal_mutable_fixed32_key(); +} + +// map<fixed64, string> fixed64_key = 8; +inline int MapType::_internal_fixed64_key_size() const { + return fixed64_key_.size(); +} +inline int MapType::fixed64_key_size() const { + return _internal_fixed64_key_size(); +} +inline void MapType::clear_fixed64_key() { + fixed64_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& +MapType::_internal_fixed64_key() const { + return fixed64_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >& +MapType::fixed64_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.fixed64_key) + return _internal_fixed64_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* +MapType::_internal_mutable_fixed64_key() { + return fixed64_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::uint64, std::string >* +MapType::mutable_fixed64_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.fixed64_key) + return _internal_mutable_fixed64_key(); +} + +// map<sfixed32, string> sfixed32_key = 9; +inline int MapType::_internal_sfixed32_key_size() const { + return sfixed32_key_.size(); +} +inline int MapType::sfixed32_key_size() const { + return _internal_sfixed32_key_size(); +} +inline void MapType::clear_sfixed32_key() { + sfixed32_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& +MapType::_internal_sfixed32_key() const { + return sfixed32_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >& +MapType::sfixed32_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.sfixed32_key) + return _internal_sfixed32_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* +MapType::_internal_mutable_sfixed32_key() { + return sfixed32_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int32, std::string >* +MapType::mutable_sfixed32_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.sfixed32_key) + return _internal_mutable_sfixed32_key(); +} + +// map<sfixed64, string> sfixed64_key = 10; +inline int MapType::_internal_sfixed64_key_size() const { + return sfixed64_key_.size(); +} +inline int MapType::sfixed64_key_size() const { + return _internal_sfixed64_key_size(); +} +inline void MapType::clear_sfixed64_key() { + sfixed64_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& +MapType::_internal_sfixed64_key() const { + return sfixed64_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >& +MapType::sfixed64_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.sfixed64_key) + return _internal_sfixed64_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* +MapType::_internal_mutable_sfixed64_key() { + return sfixed64_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< ::PROTOBUF_NAMESPACE_ID::int64, std::string >* +MapType::mutable_sfixed64_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.sfixed64_key) + return _internal_mutable_sfixed64_key(); +} + +// map<string, string> string_key = 11; +inline int MapType::_internal_string_key_size() const { + return string_key_.size(); +} +inline int MapType::string_key_size() const { + return _internal_string_key_size(); +} +inline void MapType::clear_string_key() { + string_key_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& +MapType::_internal_string_key() const { + return string_key_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >& +MapType::string_key() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapType.string_key) + return _internal_string_key(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* +MapType::_internal_mutable_string_key() { + return string_key_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >* +MapType::mutable_string_key() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapType.string_key) + return _internal_mutable_string_key(); +} + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// MapMessageType + +// map<string, .test.vereign.grpc.json.pb.MessageType> msg = 1; +inline int MapMessageType::_internal_msg_size() const { + return msg_.size(); +} +inline int MapMessageType::msg_size() const { + return _internal_msg_size(); +} +inline void MapMessageType::clear_msg() { + msg_.Clear(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >& +MapMessageType::_internal_msg() const { + return msg_.GetMap(); +} +inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >& +MapMessageType::msg() const { + // @@protoc_insertion_point(field_map:test.vereign.grpc.json.pb.MapMessageType.msg) + return _internal_msg(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >* +MapMessageType::_internal_mutable_msg() { + return msg_.MutableMap(); +} +inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, ::test::vereign::grpc::json::pb::MessageType >* +MapMessageType::mutable_msg() { + // @@protoc_insertion_point(field_mutable_map:test.vereign.grpc.json.pb.MapMessageType.msg) + return _internal_mutable_msg(); +} + +// ------------------------------------------------------------------- + +// BytesType + +// bytes bytes_value = 1; +inline void BytesType::clear_bytes_value() { + bytes_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& BytesType::bytes_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.BytesType.bytes_value) + return _internal_bytes_value(); +} +inline void BytesType::set_bytes_value(const std::string& value) { + _internal_set_bytes_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.BytesType.bytes_value) +} +inline std::string* BytesType::mutable_bytes_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.BytesType.bytes_value) + return _internal_mutable_bytes_value(); +} +inline const std::string& BytesType::_internal_bytes_value() const { + return bytes_value_.GetNoArena(); +} +inline void BytesType::_internal_set_bytes_value(const std::string& value) { + + bytes_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void BytesType::set_bytes_value(std::string&& value) { + + bytes_value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.BytesType.bytes_value) +} +inline void BytesType::set_bytes_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + bytes_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.BytesType.bytes_value) +} +inline void BytesType::set_bytes_value(const void* value, size_t size) { + + bytes_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.BytesType.bytes_value) +} +inline std::string* BytesType::_internal_mutable_bytes_value() { + + return bytes_value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* BytesType::release_bytes_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.BytesType.bytes_value) + + return bytes_value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void BytesType::set_allocated_bytes_value(std::string* bytes_value) { + if (bytes_value != nullptr) { + + } else { + + } + bytes_value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), bytes_value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.BytesType.bytes_value) +} + +// repeated bytes bytes_arr = 2; +inline int BytesType::_internal_bytes_arr_size() const { + return bytes_arr_.size(); +} +inline int BytesType::bytes_arr_size() const { + return _internal_bytes_arr_size(); +} +inline void BytesType::clear_bytes_arr() { + bytes_arr_.Clear(); +} +inline std::string* BytesType::add_bytes_arr() { + // @@protoc_insertion_point(field_add_mutable:test.vereign.grpc.json.pb.BytesType.bytes_arr) + return _internal_add_bytes_arr(); +} +inline const std::string& BytesType::_internal_bytes_arr(int index) const { + return bytes_arr_.Get(index); +} +inline const std::string& BytesType::bytes_arr(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.BytesType.bytes_arr) + return _internal_bytes_arr(index); +} +inline std::string* BytesType::mutable_bytes_arr(int index) { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.BytesType.bytes_arr) + return bytes_arr_.Mutable(index); +} +inline void BytesType::set_bytes_arr(int index, const std::string& value) { + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.BytesType.bytes_arr) + bytes_arr_.Mutable(index)->assign(value); +} +inline void BytesType::set_bytes_arr(int index, std::string&& value) { + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.BytesType.bytes_arr) + bytes_arr_.Mutable(index)->assign(std::move(value)); +} +inline void BytesType::set_bytes_arr(int index, const char* value) { + GOOGLE_DCHECK(value != nullptr); + bytes_arr_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.BytesType.bytes_arr) +} +inline void BytesType::set_bytes_arr(int index, const void* value, size_t size) { + bytes_arr_.Mutable(index)->assign( + reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.BytesType.bytes_arr) +} +inline std::string* BytesType::_internal_add_bytes_arr() { + return bytes_arr_.Add(); +} +inline void BytesType::add_bytes_arr(const std::string& value) { + bytes_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.BytesType.bytes_arr) +} +inline void BytesType::add_bytes_arr(std::string&& value) { + bytes_arr_.Add(std::move(value)); + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.BytesType.bytes_arr) +} +inline void BytesType::add_bytes_arr(const char* value) { + GOOGLE_DCHECK(value != nullptr); + bytes_arr_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:test.vereign.grpc.json.pb.BytesType.bytes_arr) +} +inline void BytesType::add_bytes_arr(const void* value, size_t size) { + bytes_arr_.Add()->assign(reinterpret_cast<const char*>(value), size); + // @@protoc_insertion_point(field_add_pointer:test.vereign.grpc.json.pb.BytesType.bytes_arr) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& +BytesType::bytes_arr() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.BytesType.bytes_arr) + return bytes_arr_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* +BytesType::mutable_bytes_arr() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.BytesType.bytes_arr) + return &bytes_arr_; +} + +// ------------------------------------------------------------------- + +// JsonNaming + +// int32 foo_value = 1; +inline void JsonNaming::clear_foo_value() { + foo_value_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::_internal_foo_value() const { + return foo_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::foo_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.JsonNaming.foo_value) + return _internal_foo_value(); +} +inline void JsonNaming::_internal_set_foo_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + + foo_value_ = value; +} +inline void JsonNaming::set_foo_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_foo_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.JsonNaming.foo_value) +} + +// int32 barValue = 2; +inline void JsonNaming::clear_barvalue() { + barvalue_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::_internal_barvalue() const { + return barvalue_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::barvalue() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.JsonNaming.barValue) + return _internal_barvalue(); +} +inline void JsonNaming::_internal_set_barvalue(::PROTOBUF_NAMESPACE_ID::int32 value) { + + barvalue_ = value; +} +inline void JsonNaming::set_barvalue(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_barvalue(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.JsonNaming.barValue) +} + +// int32 BazValue = 3; +inline void JsonNaming::clear_bazvalue() { + bazvalue_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::_internal_bazvalue() const { + return bazvalue_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::bazvalue() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.JsonNaming.BazValue) + return _internal_bazvalue(); +} +inline void JsonNaming::_internal_set_bazvalue(::PROTOBUF_NAMESPACE_ID::int32 value) { + + bazvalue_ = value; +} +inline void JsonNaming::set_bazvalue(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_bazvalue(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.JsonNaming.BazValue) +} + +// int32 quX_Value = 4; +inline void JsonNaming::clear_qux_value() { + qux_value_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::_internal_qux_value() const { + return qux_value_; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 JsonNaming::qux_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.JsonNaming.quX_Value) + return _internal_qux_value(); +} +inline void JsonNaming::_internal_set_qux_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + + qux_value_ = value; +} +inline void JsonNaming::set_qux_value(::PROTOBUF_NAMESPACE_ID::int32 value) { + _internal_set_qux_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.JsonNaming.quX_Value) +} + +// ------------------------------------------------------------------- + +// OneofValue + +// string string_value = 1; +inline bool OneofValue::_internal_has_string_value() const { + return data_case() == kStringValue; +} +inline void OneofValue::set_has_string_value() { + _oneof_case_[0] = kStringValue; +} +inline void OneofValue::clear_string_value() { + if (_internal_has_string_value()) { + data_.string_value_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + clear_has_data(); + } +} +inline const std::string& OneofValue::string_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.OneofValue.string_value) + return _internal_string_value(); +} +inline void OneofValue::set_string_value(const std::string& value) { + _internal_set_string_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.OneofValue.string_value) +} +inline std::string* OneofValue::mutable_string_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.OneofValue.string_value) + return _internal_mutable_string_value(); +} +inline const std::string& OneofValue::_internal_string_value() const { + if (_internal_has_string_value()) { + return data_.string_value_.GetNoArena(); + } + return *&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(); +} +inline void OneofValue::_internal_set_string_value(const std::string& value) { + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void OneofValue::set_string_value(std::string&& value) { + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.OneofValue.string_value) + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.OneofValue.string_value) +} +inline void OneofValue::set_string_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.OneofValue.string_value) +} +inline void OneofValue::set_string_value(const char* value, size_t size) { + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + data_.string_value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string( + reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.OneofValue.string_value) +} +inline std::string* OneofValue::_internal_mutable_string_value() { + if (!_internal_has_string_value()) { + clear_data(); + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } + return data_.string_value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* OneofValue::release_string_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.OneofValue.string_value) + if (_internal_has_string_value()) { + clear_has_data(); + return data_.string_value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + } else { + return nullptr; + } +} +inline void OneofValue::set_allocated_string_value(std::string* string_value) { + if (has_data()) { + clear_data(); + } + if (string_value != nullptr) { + set_has_string_value(); + data_.string_value_.UnsafeSetDefault(string_value); + } + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.OneofValue.string_value) +} + +// .test.vereign.grpc.json.pb.SimpleStruct struct_value = 2; +inline bool OneofValue::_internal_has_struct_value() const { + return data_case() == kStructValue; +} +inline bool OneofValue::has_struct_value() const { + return _internal_has_struct_value(); +} +inline void OneofValue::set_has_struct_value() { + _oneof_case_[0] = kStructValue; +} +inline void OneofValue::clear_struct_value() { + if (_internal_has_struct_value()) { + delete data_.struct_value_; + clear_has_data(); + } +} +inline ::test::vereign::grpc::json::pb::SimpleStruct* OneofValue::release_struct_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.OneofValue.struct_value) + if (_internal_has_struct_value()) { + clear_has_data(); + ::test::vereign::grpc::json::pb::SimpleStruct* temp = data_.struct_value_; + data_.struct_value_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline const ::test::vereign::grpc::json::pb::SimpleStruct& OneofValue::_internal_struct_value() const { + return _internal_has_struct_value() + ? *data_.struct_value_ + : *reinterpret_cast< ::test::vereign::grpc::json::pb::SimpleStruct*>(&::test::vereign::grpc::json::pb::_SimpleStruct_default_instance_); +} +inline const ::test::vereign::grpc::json::pb::SimpleStruct& OneofValue::struct_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.OneofValue.struct_value) + return _internal_struct_value(); +} +inline ::test::vereign::grpc::json::pb::SimpleStruct* OneofValue::_internal_mutable_struct_value() { + if (!_internal_has_struct_value()) { + clear_data(); + set_has_struct_value(); + data_.struct_value_ = CreateMaybeMessage< ::test::vereign::grpc::json::pb::SimpleStruct >( + GetArenaNoVirtual()); + } + return data_.struct_value_; +} +inline ::test::vereign::grpc::json::pb::SimpleStruct* OneofValue::mutable_struct_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.OneofValue.struct_value) + return _internal_mutable_struct_value(); +} + +inline bool OneofValue::has_data() const { + return data_case() != DATA_NOT_SET; +} +inline void OneofValue::clear_has_data() { + _oneof_case_[0] = DATA_NOT_SET; +} +inline OneofValue::DataCase OneofValue::data_case() const { + return OneofValue::DataCase(_oneof_case_[0]); +} +// ------------------------------------------------------------------- + +// EnumType + +// .test.vereign.grpc.json.pb.EnumType.Corpus corpus = 4; +inline void EnumType::clear_corpus() { + corpus_ = 0; +} +inline ::test::vereign::grpc::json::pb::EnumType_Corpus EnumType::_internal_corpus() const { + return static_cast< ::test::vereign::grpc::json::pb::EnumType_Corpus >(corpus_); +} +inline ::test::vereign::grpc::json::pb::EnumType_Corpus EnumType::corpus() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.EnumType.corpus) + return _internal_corpus(); +} +inline void EnumType::_internal_set_corpus(::test::vereign::grpc::json::pb::EnumType_Corpus value) { + + corpus_ = value; +} +inline void EnumType::set_corpus(::test::vereign::grpc::json::pb::EnumType_Corpus value) { + _internal_set_corpus(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.EnumType.corpus) +} + +// ------------------------------------------------------------------- + +// RepeatedEnumType + +// repeated .test.vereign.grpc.json.pb.RepeatedEnumType.Corpus corpus = 4; +inline int RepeatedEnumType::_internal_corpus_size() const { + return corpus_.size(); +} +inline int RepeatedEnumType::corpus_size() const { + return _internal_corpus_size(); +} +inline void RepeatedEnumType::clear_corpus() { + corpus_.Clear(); +} +inline ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus RepeatedEnumType::_internal_corpus(int index) const { + return static_cast< ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus >(corpus_.Get(index)); +} +inline ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus RepeatedEnumType::corpus(int index) const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.RepeatedEnumType.corpus) + return _internal_corpus(index); +} +inline void RepeatedEnumType::set_corpus(int index, ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus value) { + corpus_.Set(index, value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.RepeatedEnumType.corpus) +} +inline void RepeatedEnumType::_internal_add_corpus(::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus value) { + corpus_.Add(value); +} +inline void RepeatedEnumType::add_corpus(::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus value) { + // @@protoc_insertion_point(field_add:test.vereign.grpc.json.pb.RepeatedEnumType.corpus) + _internal_add_corpus(value); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField<int>& +RepeatedEnumType::corpus() const { + // @@protoc_insertion_point(field_list:test.vereign.grpc.json.pb.RepeatedEnumType.corpus) + return corpus_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField<int>* +RepeatedEnumType::_internal_mutable_corpus() { + return &corpus_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField<int>* +RepeatedEnumType::mutable_corpus() { + // @@protoc_insertion_point(field_mutable_list:test.vereign.grpc.json.pb.RepeatedEnumType.corpus) + return _internal_mutable_corpus(); +} + +// ------------------------------------------------------------------- + +// NestedType_NestedFoo_NestedBar + +// string Value = 1; +inline void NestedType_NestedFoo_NestedBar::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& NestedType_NestedFoo_NestedBar::value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) + return _internal_value(); +} +inline void NestedType_NestedFoo_NestedBar::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) +} +inline std::string* NestedType_NestedFoo_NestedBar::mutable_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) + return _internal_mutable_value(); +} +inline const std::string& NestedType_NestedFoo_NestedBar::_internal_value() const { + return value_.GetNoArena(); +} +inline void NestedType_NestedFoo_NestedBar::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void NestedType_NestedFoo_NestedBar::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) +} +inline void NestedType_NestedFoo_NestedBar::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) +} +inline void NestedType_NestedFoo_NestedBar::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) +} +inline std::string* NestedType_NestedFoo_NestedBar::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* NestedType_NestedFoo_NestedBar::release_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void NestedType_NestedFoo_NestedBar::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar.Value) +} + +// ------------------------------------------------------------------- + +// NestedType_NestedFoo + +// string value = 1; +inline void NestedType_NestedFoo::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& NestedType_NestedFoo::value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) + return _internal_value(); +} +inline void NestedType_NestedFoo::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) +} +inline std::string* NestedType_NestedFoo::mutable_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) + return _internal_mutable_value(); +} +inline const std::string& NestedType_NestedFoo::_internal_value() const { + return value_.GetNoArena(); +} +inline void NestedType_NestedFoo::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void NestedType_NestedFoo::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) +} +inline void NestedType_NestedFoo::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) +} +inline void NestedType_NestedFoo::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) +} +inline std::string* NestedType_NestedFoo::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* NestedType_NestedFoo::release_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void NestedType_NestedFoo::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.NestedType.NestedFoo.value) +} + +// .test.vereign.grpc.json.pb.NestedType.NestedFoo.NestedBar bar_value = 2; +inline bool NestedType_NestedFoo::_internal_has_bar_value() const { + return this != internal_default_instance() && bar_value_ != nullptr; +} +inline bool NestedType_NestedFoo::has_bar_value() const { + return _internal_has_bar_value(); +} +inline void NestedType_NestedFoo::clear_bar_value() { + if (GetArenaNoVirtual() == nullptr && bar_value_ != nullptr) { + delete bar_value_; + } + bar_value_ = nullptr; +} +inline const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar& NestedType_NestedFoo::_internal_bar_value() const { + const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* p = bar_value_; + return p != nullptr ? *p : *reinterpret_cast<const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar*>( + &::test::vereign::grpc::json::pb::_NestedType_NestedFoo_NestedBar_default_instance_); +} +inline const ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar& NestedType_NestedFoo::bar_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.NestedType.NestedFoo.bar_value) + return _internal_bar_value(); +} +inline ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* NestedType_NestedFoo::release_bar_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.NestedType.NestedFoo.bar_value) + + ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* temp = bar_value_; + bar_value_ = nullptr; + return temp; +} +inline ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* NestedType_NestedFoo::_internal_mutable_bar_value() { + + if (bar_value_ == nullptr) { + auto* p = CreateMaybeMessage<::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar>(GetArenaNoVirtual()); + bar_value_ = p; + } + return bar_value_; +} +inline ::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* NestedType_NestedFoo::mutable_bar_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.NestedType.NestedFoo.bar_value) + return _internal_mutable_bar_value(); +} +inline void NestedType_NestedFoo::set_allocated_bar_value(::test::vereign::grpc::json::pb::NestedType_NestedFoo_NestedBar* bar_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete bar_value_; + } + if (bar_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + bar_value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, bar_value, submessage_arena); + } + + } else { + + } + bar_value_ = bar_value; + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.NestedType.NestedFoo.bar_value) +} + +// ------------------------------------------------------------------- + +// NestedType + +// string value = 1; +inline void NestedType::clear_value() { + value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& NestedType::value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.NestedType.value) + return _internal_value(); +} +inline void NestedType::set_value(const std::string& value) { + _internal_set_value(value); + // @@protoc_insertion_point(field_set:test.vereign.grpc.json.pb.NestedType.value) +} +inline std::string* NestedType::mutable_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.NestedType.value) + return _internal_mutable_value(); +} +inline const std::string& NestedType::_internal_value() const { + return value_.GetNoArena(); +} +inline void NestedType::_internal_set_value(const std::string& value) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); +} +inline void NestedType::set_value(std::string&& value) { + + value_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:test.vereign.grpc.json.pb.NestedType.value) +} +inline void NestedType::set_value(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:test.vereign.grpc.json.pb.NestedType.value) +} +inline void NestedType::set_value(const char* value, size_t size) { + + value_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast<const char*>(value), size)); + // @@protoc_insertion_point(field_set_pointer:test.vereign.grpc.json.pb.NestedType.value) +} +inline std::string* NestedType::_internal_mutable_value() { + + return value_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* NestedType::release_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.NestedType.value) + + return value_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void NestedType::set_allocated_value(std::string* value) { + if (value != nullptr) { + + } else { + + } + value_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.NestedType.value) +} + +// .test.vereign.grpc.json.pb.NestedType.NestedFoo foo_value = 2; +inline bool NestedType::_internal_has_foo_value() const { + return this != internal_default_instance() && foo_value_ != nullptr; +} +inline bool NestedType::has_foo_value() const { + return _internal_has_foo_value(); +} +inline void NestedType::clear_foo_value() { + if (GetArenaNoVirtual() == nullptr && foo_value_ != nullptr) { + delete foo_value_; + } + foo_value_ = nullptr; +} +inline const ::test::vereign::grpc::json::pb::NestedType_NestedFoo& NestedType::_internal_foo_value() const { + const ::test::vereign::grpc::json::pb::NestedType_NestedFoo* p = foo_value_; + return p != nullptr ? *p : *reinterpret_cast<const ::test::vereign::grpc::json::pb::NestedType_NestedFoo*>( + &::test::vereign::grpc::json::pb::_NestedType_NestedFoo_default_instance_); +} +inline const ::test::vereign::grpc::json::pb::NestedType_NestedFoo& NestedType::foo_value() const { + // @@protoc_insertion_point(field_get:test.vereign.grpc.json.pb.NestedType.foo_value) + return _internal_foo_value(); +} +inline ::test::vereign::grpc::json::pb::NestedType_NestedFoo* NestedType::release_foo_value() { + // @@protoc_insertion_point(field_release:test.vereign.grpc.json.pb.NestedType.foo_value) + + ::test::vereign::grpc::json::pb::NestedType_NestedFoo* temp = foo_value_; + foo_value_ = nullptr; + return temp; +} +inline ::test::vereign::grpc::json::pb::NestedType_NestedFoo* NestedType::_internal_mutable_foo_value() { + + if (foo_value_ == nullptr) { + auto* p = CreateMaybeMessage<::test::vereign::grpc::json::pb::NestedType_NestedFoo>(GetArenaNoVirtual()); + foo_value_ = p; + } + return foo_value_; +} +inline ::test::vereign::grpc::json::pb::NestedType_NestedFoo* NestedType::mutable_foo_value() { + // @@protoc_insertion_point(field_mutable:test.vereign.grpc.json.pb.NestedType.foo_value) + return _internal_mutable_foo_value(); +} +inline void NestedType::set_allocated_foo_value(::test::vereign::grpc::json::pb::NestedType_NestedFoo* foo_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete foo_value_; + } + if (foo_value) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + foo_value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, foo_value, submessage_arena); + } + + } else { + + } + foo_value_ = foo_value; + // @@protoc_insertion_point(field_set_allocated:test.vereign.grpc.json.pb.NestedType.foo_value) +} + +#ifdef __GNUC__ + #pragma GCC diagnostic pop +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace pb +} // namespace json +} // namespace grpc +} // namespace vereign +} // namespace test + +PROTOBUF_NAMESPACE_OPEN + +template <> struct is_proto_enum< ::test::vereign::grpc::json::pb::EnumType_Corpus> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::test::vereign::grpc::json::pb::EnumType_Corpus>() { + return ::test::vereign::grpc::json::pb::EnumType_Corpus_descriptor(); +} +template <> struct is_proto_enum< ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus>() { + return ::test::vereign::grpc::json::pb::RepeatedEnumType_Corpus_descriptor(); +} + +PROTOBUF_NAMESPACE_CLOSE + +// @@protoc_insertion_point(global_scope) + +#include <google/protobuf/port_undef.inc> +#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_messages_2eproto diff --git a/cpp/tests/vereign/grpc/json/proto/messages.proto b/cpp/tests/vereign/grpc/json/proto/messages.proto new file mode 100644 index 0000000000000000000000000000000000000000..d698eabaeab20d606ef6f517125a4f8f3fe1fd49 --- /dev/null +++ b/cpp/tests/vereign/grpc/json/proto/messages.proto @@ -0,0 +1,131 @@ +syntax = "proto3"; + +package test.vereign.grpc.json.pb; + +message SimpleStruct { + int32 int32_value = 1; + int64 int64_value = 2; + uint32 uint32_value = 3; + uint64 uint64_value = 4; + sint32 sint32_value = 5; + sint64 sint64_value = 6; + fixed32 fixed32_value = 7; + fixed64 fixed64_value = 8; + sfixed32 sfixed32_value = 9; + sfixed64 sfixed64_value = 10; + float float_value = 11; + double double_value = 12; + + bool bool_value = 13; + string string_value = 14; +} + +message RepeatedTypes { + repeated int32 int32_arr = 1; + repeated int64 int64_arr = 2; + repeated uint32 uint32_arr = 3; + repeated uint64 uint64_arr = 4; + repeated sint32 sint32_arr = 5; + repeated sint64 sint64_arr = 6; + repeated fixed32 fixed32_arr = 7; + repeated fixed64 fixed64_arr = 8; + repeated sfixed32 sfixed32_arr = 9; + repeated sfixed64 sfixed64_arr = 10; + repeated float float_arr = 11; + repeated double double_arr = 12; + + repeated bool bool_arr = 13; + repeated string string_arr = 14; +} + +message Bar { + string value = 2; +} + +message Foo { + string value = 1; + Bar bar = 2; +} + +message MessageType { + Foo foo = 1; + repeated Foo foo_arr = 2; +} + +message MapType { + map<int32, string> int32_key = 1; + map<int64, string> int64_key = 2; + map<uint32, string> uint32_key = 3; + map<uint64, string> uint64_key = 4; + map<sint32, string> sint32_key = 5; + map<sint64, string> sint64_key = 6; + map<fixed32, string> fixed32_key = 7; + map<fixed64, string> fixed64_key = 8; + map<sfixed32, string> sfixed32_key = 9; + map<sfixed64, string> sfixed64_key = 10; + map<string, string> string_key = 11; +} + +message MapMessageType { + map<string, MessageType> msg = 1; +} + +message BytesType { + bytes bytes_value = 1; + repeated bytes bytes_arr = 2; +} + +message JsonNaming { + int32 foo_value = 1; + int32 barValue = 2; + int32 BazValue = 3; + int32 quX_Value = 4; +} + +message OneofValue { + oneof data { + string string_value = 1; + SimpleStruct struct_value = 2; + } +} + +message EnumType { + enum Corpus { + UNIVERSAL = 0; + WEB = 1; + IMAGES = 2; + LOCAL = 3; + NEWS = 4; + PRODUCTS = 5; + VIDEO = 6; + } + Corpus corpus = 4; +} + +message RepeatedEnumType { + enum Corpus { + UNIVERSAL = 0; + WEB = 1; + IMAGES = 2; + LOCAL = 3; + NEWS = 4; + PRODUCTS = 5; + VIDEO = 6; + } + + repeated Corpus corpus = 4; +} + +message NestedType { + message NestedFoo { + message NestedBar { + string Value = 1; + } + + string value = 1; + NestedBar bar_value = 2; + } + + string value = 1; + NestedFoo foo_value = 2; +} diff --git a/cpp/tests/vereign/grpc/server_test.cc b/cpp/tests/vereign/grpc/server_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..0f3a18589adfb98ebe6d39bb064c91257439b7f5 --- /dev/null +++ b/cpp/tests/vereign/grpc/server_test.cc @@ -0,0 +1,89 @@ +#include <vereign/grpc/server.hh> + +#include <vereign/core/scope_guard.hh> +#include <vereign/client_library/passport_api.gen.grpc.pb.h> +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/client_library/identity_api.gen.grpc.pb.h> +#include <vereign/service/identity_service.hh> +#include <vereign/fs/util.hh> +#include <vereign/fs/path.hh> +#include <vereign/test/device.hh> +#include <vereign/test/service_context.hh> + +#include <util/env.hh> +#include <util/protobuf.hh> +#include <grpcpp/create_channel.h> + +#include <catch2/catch.hpp> + +TEST_CASE("grpc::Server", "[vereign/grpc/server][.integration]") { + auto public_key = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + const std::string pin = "foo"; + auto storage_path = vereign::fs::TempDir("test_db_"); + auto rm_storage_path = vereign::fs::RemoveAllGuard(storage_path); + vereign::test::PrepareNewDevice(host, port, public_key, pin, storage_path); + + vereign::grpc::Server server{"localhost:", host, port, storage_path}; + auto on_exit = vereign::core::MakeScopeGuard([&server] { + server.Shutdown(); + }); + + auto channel = ::grpc::CreateChannel( + "localhost:" + std::to_string(server.SelectedPort()), + ::grpc::InsecureChannelCredentials() + ); + + // register new device + auto identity_client = vereign::client_library::IdentityAPI::NewStub(channel); + auto login_req = vereign::client_library::LoginFormPreviousAddedDevice{}; + auto login_resp = vereign::client_library::EmptyResponse{}; + login_req.set_pin(pin); + + ::grpc::ClientContext login_ctx; + identity_client->LoginWithPreviouslyAddedDevice(&login_ctx, login_req, &login_resp); + + CHECK(login_resp.error() == ""); + CHECK(login_resp.status() == "OK"); + REQUIRE(login_resp.code() == "200"); + + auto passport_client = vereign::client_library::PassportAPI::NewStub(channel); + + vereign::client_library::ListPassportsForm req; + vereign::client_library::ListPassportsFormResponse resp; + ::grpc::ClientContext ctx; + auto status = passport_client->ListPassports(&ctx, req, &resp); + + // std::cout << vereign::test::ProtobufToJson(resp) << std::endl; + + REQUIRE(status.error_message() == ""); + REQUIRE(status.ok() == true); + CHECK(resp.error() == ""); + CHECK(resp.status() == "OK"); + REQUIRE(resp.code() == "200"); + CHECK(resp.data().size() > 0); + for (auto& passport : resp.data()) { + CHECK(passport.uuid().size() == 36); + } + + vereign::client_library::GetInteractionsForm getInterReq; + getInterReq.set_uuid(resp.data().at(0).uuid()); + vereign::client_library::GetInteractionsFormResponse getInterResp; + ::grpc::ClientContext getInterCtx; + status = passport_client->GetInteractions(&getInterCtx, getInterReq, &getInterResp); + CHECK(status.error_message() == ""); + CHECK(getInterResp.error() == ""); + CHECK(getInterResp.status() == "OK"); + CHECK(getInterResp.code() == "200"); + for (auto& interaction : getInterResp.data()) { + CHECK(interaction.subject().size() > 0); + CHECK(interaction.passport().size() == 36); + } + + // std::cout << vereign::test::ProtobufToJson(getDIDsResp) << std::endl; + + grpc_shutdown(); + google::protobuf::ShutdownProtobufLibrary(); +} diff --git a/cpp/tests/vereign/identity/provider_test.cc b/cpp/tests/vereign/identity/provider_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..f34a8450b557e96bbf996aca0e2e43bf6d1481a4 --- /dev/null +++ b/cpp/tests/vereign/identity/provider_test.cc @@ -0,0 +1,40 @@ +#include <vereign/identity/provider.hh> + +#include <vereign/fs/util.hh> +#include <vereign/kvstore/sqlite_storage.hh> +#include <vereign/kvstore/crypto_storage.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/view_dump.hh> + +#include <catch2/catch.hpp> +#include <iostream> + +using namespace vereign; + +TEST_CASE("Provider::RecreateIdentity", "[vereign/identity]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + std::string expected; + std::string actual; + + { + kvstore::SqliteStorage kvstorage{storage_path}; + kvstore::CryptoStorage storage{kvstorage, true}; + + identity::Provider provider{storage}; + expected = provider.RecreateIdentity("foo"); + } + + { + kvstore::SqliteStorage kvstorage{storage_path}; + kvstore::CryptoStorage storage{kvstorage, true}; + + identity::Provider provider{storage}; + actual = provider.LoadIdentity("foo"); + } + + CHECK(expected.size() > 0); + CHECK(actual.size() > 0); + CHECK(expected == actual); +} diff --git a/cpp/tests/vereign/init_tests.cc b/cpp/tests/vereign/init_tests.cc new file mode 100644 index 0000000000000000000000000000000000000000..4ed06df1f7bea8cc18ee161389b9c3e2741b08a0 --- /dev/null +++ b/cpp/tests/vereign/init_tests.cc @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include <catch2/catch.hpp> diff --git a/cpp/tests/vereign/kvstore/crypto_storage_test.cc b/cpp/tests/vereign/kvstore/crypto_storage_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..8f9d305d0488004739afe3ae142e982ab7405630 --- /dev/null +++ b/cpp/tests/vereign/kvstore/crypto_storage_test.cc @@ -0,0 +1,99 @@ +#include <vereign/kvstore/crypto_storage.hh> + +#include <vereign/encoding/errors.hh> +#include <vereign/kvstore/sqlite_storage.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/fs/util.hh> +#include <vereign/core/scope_guard.hh> + +#include <catch2/catch.hpp> +#include <boost/filesystem.hpp> +#include <iostream> + +using namespace vereign; + +TEST_CASE("kvstore::CryptoStorage::Recreate", "[vereign/kvstore]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + // put value + { + auto kvstorage = kvstore::SqliteStorage(storage_path); + kvstore::CryptoStorage storage{kvstorage, true}; + + storage.Recreate("foo"); + std::string v{"test value"}; + storage.PutBytes("test", bytes::View(v)); + } + + // with another storage instance get the value + { + auto kvstorage = kvstore::SqliteStorage(storage_path); + kvstore::CryptoStorage storage{kvstorage, true}; + + bytes::Buffer v; + storage.Open("foo"); + storage.GetBytes("test", v); + + CHECK(v.View().String() == "test value"); + } +} + +TEST_CASE("kvstore::CryptoStorage::PutBytes", "[vereign/kvstore]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto big_value = crypto::Rand(100000); + auto kvstorage = kvstore::SqliteStorage(storage_path); + kvstore::CryptoStorage storage{kvstorage, true}; + + storage.Recreate("foo"); + storage.PutBytes("test", big_value.View()); + + bytes::Buffer v; + storage.GetBytes("test", v); + + REQUIRE(v.Size() == big_value.Size()); + + auto cmp = std::memcmp(v.View().Data(), big_value.View().Data(), v.Size()); + CHECK(cmp == 0); +} + +TEST_CASE("kvstore::CryptoStorage::GetBytes", "[vereign/kvstore]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto kvstorage = kvstore::SqliteStorage(storage_path); + kvstore::CryptoStorage storage{kvstorage, true}; + + storage.Recreate("foo"); + + SECTION("when the value does not exists, it must throw ValueNotFoundError") { + bytes::Buffer v; + + CHECK_THROWS_AS(storage.GetBytes("does_not_exists", v), kvstore::ValueNotFoundError); + + CHECK(v.Size() == 0); + } + + SECTION("when the value cannot be decoded, it must throw encoding::Error") { + kvstorage.PutInt64("foo", 1); + + bytes::Buffer v; + + CHECK_THROWS_AS(storage.GetBytes("foo", v), encoding::Error); + + CHECK(v.Size() == 0); + } + + SECTION("when the value exists, it must retrieve the value") { + storage.PutBytes("foo", bytes::View("bar")); + + bytes::Buffer v; + storage.GetBytes("foo", v); + + CHECK(v.View() == bytes::View("bar")); + } +} diff --git a/cpp/tests/vereign/kvstore/lock_test.cc b/cpp/tests/vereign/kvstore/lock_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..d15ed5ef9da02727c382e713c2401e2083ce7b5d --- /dev/null +++ b/cpp/tests/vereign/kvstore/lock_test.cc @@ -0,0 +1,61 @@ +#include <vereign/kvstore/sqlite_storage.hh> + +#include <vereign/kvstore/lock.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/fs/util.hh> +#include <vereign/core/lock_guard.hh> +#include <vereign/core/scope_guard.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/sqlite/errors.hh> +#include <util/error.hh> +#include <sqlite3.h> + +#include <catch2/catch.hpp> +#include <boost/filesystem.hpp> +#include <thread> +#include <chrono> +#include <limits> +#include <optional> + +using namespace vereign; + +TEST_CASE("kvstore::Lock", "[vereign/kvstore]") { + + SECTION("when the lock is released within the allowed retrials, the lock succeeds") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto foo_storage = kvstore::SqliteStorage(storage_path); + auto bar_storage = kvstore::SqliteStorage(storage_path); + + foo_storage.Lock(); + + bool err = false; + auto th = std::thread{[&bar_storage, &err]() { + try { + kvstore::Lock l{bar_storage, std::numeric_limits<int>::max(), std::chrono::milliseconds{10}}; + } catch (...) { + err = true; + } + }}; + + foo_storage.Unlock(); + th.join(); + } + + SECTION("when the lock is not released within the allowed retrials, the lock fails") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto foo_storage = kvstore::SqliteStorage(storage_path); + auto bar_storage = kvstore::SqliteStorage(storage_path); + + foo_storage.Lock(); + + CHECK_THROWS_AS( + kvstore::Lock(bar_storage, 2, std::chrono::milliseconds{1}), + kvstore::LockError + ); + } +} diff --git a/cpp/tests/vereign/kvstore/sqlite_storage_test.cc b/cpp/tests/vereign/kvstore/sqlite_storage_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..f747ef2e4225b2b4c38b68551ab5cec2fcb538ae --- /dev/null +++ b/cpp/tests/vereign/kvstore/sqlite_storage_test.cc @@ -0,0 +1,138 @@ +#include <vereign/kvstore/sqlite_storage.hh> + +#include <vereign/kvstore/lock.hh> +#include <vereign/kvstore/errors.hh> +#include <vereign/bytes/view_dump.hh> +#include <vereign/fs/util.hh> +#include <vereign/core/scope_guard.hh> +#include <vereign/crypto/rand.hh> +#include <vereign/sqlite/errors.hh> +#include <util/error.hh> +#include <sqlite3.h> + +#include <catch2/catch.hpp> +#include <boost/filesystem.hpp> +#include <thread> +#include <optional> + +using namespace vereign; + +TEST_CASE("kvstore::SqliteStorage::GetBytes", "[vereign/kvstore]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto kvstorage = kvstore::SqliteStorage(storage_path); + + SECTION("when the value does not exists, it must throw ValueNotFoundError") { + bytes::Buffer v; + + CHECK_THROWS_AS(kvstorage.GetBytes("does_not_exists", v), kvstore::ValueNotFoundError); + + CHECK(v.Size() == 0); + } + + SECTION("when the value exists, it must retrieve the value") { + kvstorage.PutBytes("foo", bytes::View("bar")); + + bytes::Buffer v; + kvstorage.GetBytes("foo", v); + + CHECK(v.View() == bytes::View("bar")); + } +} + +TEST_CASE("kvstore::SqliteStorage::GetInt64", "[vereign/kvstore]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto kvstorage = kvstore::SqliteStorage(storage_path); + + SECTION("when the value does not exists, it must throw ValueNotFoundError") { + CHECK_THROWS_AS(kvstorage.GetInt64("does_not_exists"), kvstore::ValueNotFoundError); + } + + SECTION("when the value exists, it must retrieve the value") { + kvstorage.PutInt64("foo", 42); + + auto v = kvstorage.GetInt64("foo"); + + CHECK(v == 42); + } +} + +TEST_CASE("kvstore::SqliteStorage::DeleteAll", "[vereign/kvstore]") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto kvstorage = kvstore::SqliteStorage(storage_path); + + kvstorage.PutInt64("foo", 42); + kvstorage.PutInt64("bar", 422); + + CHECK(kvstorage.GetInt64("foo") == 42); + CHECK(kvstorage.GetInt64("bar") == 422); + + kvstorage.DeleteAll(); + + CHECK_THROWS_AS(kvstorage.GetInt64("foo"), kvstore::ValueNotFoundError); + CHECK_THROWS_AS(kvstorage.GetInt64("bar"), kvstore::ValueNotFoundError); +} + +TEST_CASE("kvstore::SqliteStorage::Lock", "[vereign/kvstore]") { + + SECTION("when locked using lock guard, it must unlock on scope exit") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + { + auto kvstorage = kvstore::SqliteStorage(storage_path); + + kvstore::Lock l{kvstorage}; + + kvstorage.PutInt64("foo", 42); + kvstorage.PutInt64("bar", 422); + } + + { + auto kvstorage = kvstore::SqliteStorage(storage_path); + + kvstore::Lock l{kvstorage}; + + CHECK(kvstorage.GetInt64("foo") == 42); + CHECK(kvstorage.GetInt64("bar") == 422); + } + } + + SECTION("when locked, it must unlock on scope exit") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + { + auto kvstorage = kvstore::SqliteStorage(storage_path); + kvstorage.Lock(); + + kvstorage.PutInt64("foo", 42); + kvstorage.PutInt64("bar", 422); + } + + { + auto kvstorage = kvstore::SqliteStorage(storage_path); + kvstorage.Lock(); + + CHECK(kvstorage.GetInt64("foo") == 42); + CHECK(kvstorage.GetInt64("bar") == 422); + } + } + + SECTION("when the storage is already locked, it must fail with LockError") { + auto storage_path = fs::TempFilePath("test_db_"); + fs::RemoveFileGuard rm{storage_path}; + + auto foo_storage = kvstore::SqliteStorage(storage_path); + auto bar_storage = kvstore::SqliteStorage(storage_path); + + foo_storage.Lock(); + + CHECK_THROWS_AS(bar_storage.Lock(), kvstore::LockError); + } +} diff --git a/cpp/tests/vereign/ncrypt/rsa_test.cc b/cpp/tests/vereign/ncrypt/rsa_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..116ed579ca8a3dd518c5e04c40585d34096d706e --- /dev/null +++ b/cpp/tests/vereign/ncrypt/rsa_test.cc @@ -0,0 +1,209 @@ +#include <vereign/crypto/rand.hh> +#include <vereign/ncrypt/rsa.hh> + +#include <vereign/core/scope_guard.hh> +#include <vereign/ncrypt/unique_ptr.hh> +#include <vereign/bytes/view_dump.hh> + +#include <catch2/catch.hpp> +#include <iostream> + +using namespace vereign; + +TEST_CASE("ncrypt::rsa::OpenStorageProvider", "[vereign/ncrypt/rsa][vereign/ncrypt]") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + CHECK(provider.Get() != 0); +} + +TEST_CASE("ncrypt::CreateKey", "[vereign/ncrypt/rsa][vereign/ncrypt]") { + const auto test_key = std::string{"vereign_test_key"}; + + SECTION("when the key does not exists, it must create a new key") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + + // cleanup + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + auto new_key = ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}); + CHECK(new_key.Get() != 0); + + key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + CHECK(key.Get() != 0); + + // cleanup + ncrypt::rsa::DeleteKey(key.Get()); + } + + SECTION("when the key already exists, it must fail with NTE_EXISTS") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + + // cleanup + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + auto new_key = ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}); + CHECK(new_key.Get() != 0); + + CHECK_THROWS_WITH( + ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}), + "creating rsa key failed: NTE_EXISTS" + ); + + key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + CHECK(key.Get() != 0); + + // cleanup + ncrypt::rsa::DeleteKey(key.Get()); + } +} + +TEST_CASE("ncrypt::rsa::LoadKey", "[vereign/ncrypt/rsa][vereign/ncrypt]") { + const auto test_key = std::string{"vereign_test_key"}; + + SECTION("when the key exists, it must load the key") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + + // cleanup + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + auto new_key = ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}); + CHECK(new_key.Get() != 0); + + key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + CHECK(key.Get() != 0); + + // cleanup + ncrypt::rsa::DeleteKey(key.Get()); + } + + SECTION("when the key does not exists, it must fail") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + + // cleanup + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + CHECK(key.Get() == 0); + } +} + +TEST_CASE("ncrypt::rsa::DeleteKey", "[vereign/ncrypt/rsa][vereign/ncrypt]") { + const auto test_key = std::string{"vereign_test_key"}; + + SECTION("when the key exists, it must delete the key") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + + // cleanup + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + auto new_key = ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}); + CHECK(new_key.Get() != 0); + + ncrypt::rsa::DeleteKey(new_key.Get()); + + key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + CHECK(key.Get() == 0); + } + + SECTION("when the key does not exists, it must fail") { + auto provider = ncrypt::rsa::OpenStorageProvider(); + + // cleanup + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + auto new_key = ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}); + CHECK(new_key.Get() != 0); + + key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + CHECK(key.Get() != 0); + + ncrypt::rsa::DeleteKey(new_key.Get()); + + CHECK_THROWS_WITH( + ncrypt::rsa::DeleteKey(key.Get()), + "deleting key failed: NTE_BAD_KEYSET" + ); + } +} + +TEST_CASE("ncrypt::rsa PublicKeyEncrypt/PrivateKeyDecrypt", "[vereign/ncrypt/rsa][vereign/ncrypt]") { + const auto test_key = std::string{"vereign_test_key"}; + auto provider = ncrypt::rsa::OpenStorageProvider(); + auto key = ncrypt::rsa::LoadKey(provider.Get(), test_key); + if (key) { + ncrypt::rsa::DeleteKey(key.Get()); + } + + key = ncrypt::rsa::CreateKey(provider.Get(), 2048, test_key, {}); + REQUIRE(key.Get() != 0); + auto delete_key = core::ScopeGuard([&key] { ncrypt::rsa::DeleteKey(key.Get()); }); + + SECTION("small input") { + const std::string input{"foo bar"}; + bytes::Buffer encrypted; + + ncrypt::rsa::PublicKeyEncrypt(key.Get(), bytes::View(input), encrypted); + + bytes::Buffer decrypted; + ncrypt::rsa::PrivateKeyDecrypt(key.Get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == bytes::View(input)); + } + + SECTION("zero input") { + const std::string input; + bytes::Buffer encrypted; + + CHECK_THROWS_WITH( + ncrypt::rsa::PublicKeyEncrypt(key.Get(), bytes::View(input), encrypted), + "encryption failed: NTE_NULL_REFERENCE_POINTER" + ); + + bytes::Buffer decrypted; + CHECK_THROWS_WITH( + ncrypt::rsa::PrivateKeyDecrypt(key.Get(), encrypted.View(), decrypted), + "decryption failed: NTE_NULL_REFERENCE_POINTER" + ); + } + + SECTION("max size input") { + auto input = crypto::Rand(214); + bytes::Buffer encrypted; + + ncrypt::rsa::PublicKeyEncrypt(key.Get(), input.View(), encrypted); + + bytes::Buffer decrypted; + ncrypt::rsa::PrivateKeyDecrypt(key.Get(), encrypted.View(), decrypted); + + CHECK(decrypted.View() == input.View()); + } + + SECTION("invalid big input") { + auto input = crypto::Rand(215); + bytes::Buffer encrypted; + + CHECK_THROWS_WITH( + ncrypt::rsa::PublicKeyEncrypt(key.Get(), input.View(), encrypted), + "encryption failed: NTE_INVALID_PARAMETER" + ); + + CHECK(encrypted.Size() == 0); + } +} diff --git a/cpp/tests/vereign/restapi/client_session_test.cc b/cpp/tests/vereign/restapi/client_session_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..36a824999a5c725e0d5443d91c91369fac619c51 --- /dev/null +++ b/cpp/tests/vereign/restapi/client_session_test.cc @@ -0,0 +1,62 @@ +#include <vereign/restapi/client.hh> +#include <vereign/restapi/client_session.hh> +#include <vereign/core/scope_guard.hh> +#include <vereign/client_library/types.gen.pb.h> +#include <util/env.hh> +#include <util/protobuf.hh> + +#include <catch2/catch.hpp> + +#include <boost/asio/io_context.hpp> +#include <boost/asio/ssl/context.hpp> +#include <fmt/core.h> + +TEST_CASE("ClientSession::Post", "[vereign/restapi/client_session][.integration]") { + namespace asio = boost::asio; + namespace beast = boost::beast; + asio::io_context ioc; + auto work_guard = boost::asio::make_work_guard(ioc); + asio::ssl::context ctx(asio::ssl::context::tlsv12_client); + + auto publicKey = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + // Verify the remote server's certificate + // ctx.set_verify_mode(ssl::verify_peer); + + vereign::restapi::Client client{ioc, ctx, host, port}; + vereign::restapi::ClientSession client_session{client, publicKey}; + + std::thread ioc_thread([&ioc]{ + ioc.run(); + }); + auto on_exit = vereign::core::MakeScopeGuard( + [&client, &ioc_thread, &work_guard] { + client.Close(); + work_guard.reset(); + ioc_thread.join(); + } + ); + + for (int i = 0; i < 1; i++) { + auto list_result = client_session.Post( + "/passport/listPassports", + std::make_unique<vereign::client_library::ListPassportsForm>(), + std::make_unique<vereign::client_library::ListPassportsFormResponse>() + ); + + auto result = list_result.get(); + + // std::cout << vereign::test::ProtobufToJson(*result.Response) << std::endl; + + auto& list = result.Response; + REQUIRE(list->error() == ""); + CHECK(list->status() == "OK"); + CHECK(list->code() == "200"); + CHECK(list->data().size() > 0); + for (auto& passport : list->data()) { + CHECK(passport.uuid().size() == 36); + } + } +} diff --git a/cpp/tests/vereign/restapi/client_test.cc b/cpp/tests/vereign/restapi/client_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..c0c1a17198abca5ee1e50f85fe57675308d4d597 --- /dev/null +++ b/cpp/tests/vereign/restapi/client_test.cc @@ -0,0 +1,173 @@ +#include <chrono> +#include <vereign/restapi/client.hh> +#include <vereign/client_library/common_types.pb.h> +#include <vereign/client_library/identity_types.pb.h> +#include <vereign/client_library/passport_api.gen.pb.h> +#include <vereign/core/scope_guard.hh> +#include <util/env.hh> + +#include "boost/asio/executor_work_guard.hpp" +#include "boost/beast/core/error.hpp" +#include <catch2/catch.hpp> + +#include <thread> +#include <boost/asio/io_context.hpp> +#include <boost/asio/ssl/context.hpp> +#include <fmt/core.h> +#include <experiment/array.hh> + +TEST_CASE("Client::Post", "[vereign/restapi/client][.integration]") { + namespace asio = boost::asio; + namespace beast = boost::beast; + using namespace vereign; + + asio::io_context ioc; + auto work_guard = boost::asio::make_work_guard(ioc); + asio::ssl::context ctx(asio::ssl::context::tlsv12_client); + + auto publicKey = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + // Verify the remote server's certificate + // ctx.set_verify_mode(ssl::verify_peer); + + // host = "localhost"; + // port = "9292"; + + vereign::restapi::Client client{ioc, ctx, host, port}; + std::thread ioc_thread([&ioc]{ + ioc.run(); + }); + auto on_exit = vereign::core::MakeScopeGuard( + [&client, &ioc_thread, &work_guard] { + client.Close(); + work_guard.reset(); + ioc_thread.join(); + } + ); + + auto req = std::make_unique<client_library::EmptyRequest>(); + auto resp = std::make_unique<client_library::LoginFormPreviousAddedDeviceResponse>(); + + // const vereign::v1pb::EmptyRequest* reqptr = req.get(); + // vereign::v1pb::LoginFormPreviousAddedDeviceResponse* respptr = resp.get(); + + auto result = client.Post( + "/api/identity/loginWithPreviouslyAddedDevice", + std::move(req), + std::move(resp), + std::vector<vereign::restapi::HttpHeader>{ + {"publicKey", publicKey} + } + ); + + auto resp_ptr = result.get().Response; + REQUIRE(resp_ptr->error() == ""); + CHECK(resp_ptr->status() == "OK"); + CHECK(resp_ptr->code() == "200"); + + auto token = resp_ptr->data().session(); + auto uuid = resp_ptr->data().uuid(); + UNSCOPED_INFO(fmt::format("-- session: {}\n", resp_ptr->data().session())); + UNSCOPED_INFO(fmt::format("-- uuid: {}\n", resp_ptr->data().uuid())); + + auto list_result = client.Post( + "/api/passport/listPassports", + std::make_unique<client_library::ListPassportsForm>(), + std::make_unique<client_library::ListPassportsFormResponse>(), + std::vector<vereign::restapi::HttpHeader>{ + {"publicKey", publicKey}, + {"token", token}, + {"uuid", uuid} + } + ); + + auto list = list_result.get().Response; + REQUIRE(list->error() == ""); + CHECK(list->status() == "OK"); + CHECK(list->code() == "200"); + CHECK(list->data().size() > 0); + for (auto& passport : list->data()) { + CHECK(passport.uuid().size() == 36); + } +} + +TEST_CASE("Client load test", "[vereign/restapi/client][.bench]") { + namespace asio = boost::asio; + namespace beast = boost::beast; + using namespace vereign; + + asio::io_context ioc; + auto work_guard = boost::asio::make_work_guard(ioc); + asio::ssl::context ctx(asio::ssl::context::tlsv12_client); + + auto publicKey = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + host = "localhost"; + port = "9292"; + + vereign::restapi::Client client(ioc, ctx, host, port); + std::thread ioc_thread([&ioc]{ + ioc.run(); + }); + + auto on_exit = vereign::core::MakeScopeGuard( + [&client, &ioc_thread, &work_guard] { + client.Close(); + work_guard.reset(); + ioc_thread.join(); + } + ); + + auto start = std::chrono::high_resolution_clock::now(); + std::vector<std::thread> threads; + for (int i = 0; i < 10; i++) { + auto th = i; + + threads.emplace_back( + [&client, th]() mutable { + auto req = std::make_unique<client_library::EmptyRequest>(); + auto resp = std::make_unique<client_library::LoginFormPreviousAddedDeviceResponse>(); + + for (int i = 0; i < 1000; i++) { + auto id = fmt::format("t{}-{}", th, i); + + req->Clear(); + resp->Clear(); + + auto result = client.Post( + "/", + std::move(req), + std::move(resp) + ); + + // std::cout << ">> waiting for result " << id << std::endl; + auto r = result.get(); + req = std::move(r.Request); + resp = std::move(r.Response); + if (resp->error().size() != 0) { + std::cout << ">> read failed with: " << resp->error() << std::endl; + + } else { + // std::cout << ">> result " << resp->code() << std::endl; + if (resp->code() != id) { + std::cout << ">> id do not match" << std::endl; + } + } + } + } + ); + } + + // client.Close(); + for (auto& th : threads) { + th.join(); + } + + auto end = std::chrono::high_resolution_clock::now(); + auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); + fmt::print("elapsed: {}ms\n", elapsed.count()); +} diff --git a/cpp/tests/vereign/service/gen/passport_service_test.cc b/cpp/tests/vereign/service/gen/passport_service_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..bbe2df7c0aaf5bb31dad33039778e439b6606ce6 --- /dev/null +++ b/cpp/tests/vereign/service/gen/passport_service_test.cc @@ -0,0 +1,84 @@ +#include <vereign/service/gen/passport_service.hh> + +#include <vereign/fs/util.hh> +#include <vereign/core/scope_guard.hh> +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/client_library/identity_types.pb.h> +#include <vereign/kvstore/sqlite_storage.hh> +#include <vereign/service/identity_service.hh> +#include <vereign/identity/provider.hh> + +#include <util/env.hh> +#include <util/protobuf.hh> + +#include <catch2/catch.hpp> +#include <boost/asio/io_context.hpp> +#include <boost/asio/ssl/context.hpp> +#include <fmt/core.h> + +TEST_CASE("PassportService::ListPassports", "[vereign/service/gen][.integration]") { + namespace asio = boost::asio; + namespace beast = boost::beast; + asio::io_context ioc; + auto work_guard = boost::asio::make_work_guard(ioc); + asio::ssl::context ctx(asio::ssl::context::tlsv12_client); + + auto publicKey = vereign::test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = vereign::test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = vereign::test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + // Verify the remote server's certificate + // ctx.set_verify_mode(ssl::verify_peer); + + vereign::restapi::Client client{ioc, ctx, host, port}; + vereign::restapi::ClientSession client_session{client}; + vereign::service::gen::PassportService service{client_session}; + + auto storage_path = vereign::fs::TempFilePath("test_db_"); + vereign::fs::RemoveFileGuard rm{storage_path}; + + auto kvstorage = vereign::kvstore::SqliteStorage(storage_path); + vereign::kvstore::CryptoStorage storage{kvstorage}; + vereign::identity::Provider provider{storage}; + vereign::service::IdentityService idenity_service{client_session, provider}; + + std::thread ioc_thread([&ioc]{ + ioc.run(); + }); + auto on_exit = vereign::core::MakeScopeGuard( + [&client_session, &ioc_thread, &work_guard] { + client_session.Close(); + work_guard.reset(); + ioc_thread.join(); + } + ); + + // login + auto req = std::make_unique<vereign::client_library::LoginWithExistingPubKeyForm>(); + auto resp = std::make_unique<vereign::client_library::EmptyResponse>(); + req->set_pubkey(publicKey); + idenity_service.LoginWithExistingPubKey(req.get(), resp.get()); + CHECK(resp->error() == ""); + CHECK(resp->status() == "OK"); + REQUIRE(resp->code() == "200"); + + for (int i = 0; i < 2; i++) { + auto req = std::make_unique<vereign::client_library::ListPassportsForm>(); + auto resp = std::make_unique<vereign::client_library::ListPassportsFormResponse>(); + + auto list_result = service.ListPassports(req.get(), resp.get()); + + auto result = list_result.get(); + + // std::cout << vereign::test::ProtobufToJson(*result.Response) << std::endl; + + auto& list = result.Response; + CHECK(list->error() == ""); + CHECK(list->status() == "OK"); + REQUIRE(list->code() == "200"); + CHECK(list->data().size() > 0); + for (auto& passport : list->data()) { + CHECK(passport.uuid().size() == 36); + } + } +} diff --git a/cpp/tests/vereign/service/identity_service_test.cc b/cpp/tests/vereign/service/identity_service_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..4fa38954ab5c0ec1af69addc32ffccd0a23c8e5a --- /dev/null +++ b/cpp/tests/vereign/service/identity_service_test.cc @@ -0,0 +1,129 @@ +#include <vereign/service/identity_service.hh> + +#include <vereign/client_library/common_types.pb.h> +#include <vereign/client_library/identity_types.pb.h> +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/service/gen/passport_service.hh> +#include <vereign/restapi/client_session.hh> +#include <vereign/identity/provider.hh> +#include <vereign/test/device.hh> +#include <vereign/test/service_context.hh> +#include <vereign/fs/util.hh> + +#include <util/env.hh> +#include <util/protobuf.hh> + +#include <catch2/catch.hpp> + +using namespace vereign; + +TEST_CASE("service::IdentityService::LoginWithNewDevice", "[vereign/service][.integration]") { + auto public_key = test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + // the old device is used later for new device confirmation and authorization + auto old_storage_path = fs::TempFilePath("test_db_"); + auto rm_old_storage_path = fs::RemoveFileGuard{old_storage_path}; + auto old_device_ctx = test::ServiceContext{host, port, old_storage_path}; + auto old_device = test::Device{old_device_ctx}; + old_device.Login(public_key); + + auto storage_path = fs::TempFilePath("test_db_"); + auto rm_storage_path = fs::RemoveFileGuard{storage_path}; + auto service_context = test::ServiceContext{host, port, storage_path}; + auto service = service::IdentityService{ + service_context.ClientSession(), + service_context.IdentityProvider() + }; + + // register new device + auto req = std::make_unique<vereign::client_library::LoginFormNewDevice>(); + auto resp = std::make_unique<vereign::client_library::LoginFormNewDeviceResponse>(); + req->set_pin("foo"); + + service.LoginWithNewDevice(req.get(), resp.get()); + + CHECK(resp->error() == ""); + CHECK(resp->status() == "OK"); + REQUIRE(resp->code() == "200"); + REQUIRE(resp->has_data() == true); + + // confirm and authorize the new device using an old device + old_device.ConfirmNewDevice(resp->data().qrcode(), resp->data().actionid()); + old_device.AuthorizeDevice(service_context.IdentityProvider().GetDeviceHash()); + + // list passports with the new device + auto list_req = std::make_unique<vereign::client_library::ListPassportsForm>(); + auto list_resp = std::make_unique<vereign::client_library::ListPassportsFormResponse>(); + + auto passport_service = service::gen::PassportService{service_context.ClientSession()}; + auto list_result = passport_service.ListPassports(list_req.get(), list_resp.get()); + + auto result = list_result.get(); + + // std::cout << vereign::test::ProtobufToJson(*result.Response) << std::endl; + + auto& list = result.Response; + CHECK(list->error() == ""); + CHECK(list->status() == "OK"); + REQUIRE(list->code() == "200"); + CHECK(list->data().size() > 0); + for (const auto& passport : list->data()) { + CHECK(passport.uuid().size() == 36); + } +} + +TEST_CASE("service::IdentityService::LoginWithPreviouslyAddedDevice", "[vereign/service][.integration]") { + auto public_key = test::RequireEnv("TEST_VEREIGN_PUB_KEY"); + auto host = test::RequireEnv("TEST_VEREIGN_API_HOST"); + auto port = test::GetEnv("TEST_VEREIGN_API_PORT", "https"); + + auto storage_path = fs::TempFilePath("test_db_"); + auto rm_storage_path = fs::RemoveFileGuard{storage_path}; + + // prepare new device + auto old_storage_path = fs::TempFilePath("test_db_"); + auto rm_old_storage_path = fs::RemoveFileGuard{old_storage_path}; + auto old_device_ctx = test::ServiceContext{host, port, old_storage_path}; + auto old_device = test::Device{old_device_ctx}; + old_device.Login(public_key); + auto old_service_context = test::ServiceContext{host, port, storage_path}; + old_device.CreateNewDevice(old_service_context, "pin"); + + auto service_context = test::ServiceContext{host, port, storage_path}; + auto service = service::IdentityService{ + service_context.ClientSession(), + service_context.IdentityProvider() + }; + + auto req = std::make_unique<vereign::client_library::LoginFormPreviousAddedDevice>(); + req->set_pin("pin"); + auto resp = std::make_unique<vereign::client_library::EmptyResponse>(); + + service.LoginWithPreviouslyAddedDevice(req.get(), resp.get()); + + CHECK(resp->error() == ""); + CHECK(resp->status() == "OK"); + REQUIRE(resp->code() == "200"); + + // list passports with the logged device + auto list_req = std::make_unique<vereign::client_library::ListPassportsForm>(); + auto list_resp = std::make_unique<vereign::client_library::ListPassportsFormResponse>(); + + auto passport_service = service::gen::PassportService{service_context.ClientSession()}; + auto list_result = passport_service.ListPassports(list_req.get(), list_resp.get()); + + auto result = list_result.get(); + + // std::cout << vereign::test::ProtobufToJson(*result.Response) << std::endl; + + auto& list = result.Response; + CHECK(list->error() == ""); + CHECK(list->status() == "OK"); + REQUIRE(list->code() == "200"); + CHECK(list->data().size() > 0); + for (const auto& passport : list->data()) { + CHECK(passport.uuid().size() == 36); + } +} diff --git a/cpp/tests/vereign/sync/channel_test.cc b/cpp/tests/vereign/sync/channel_test.cc new file mode 100644 index 0000000000000000000000000000000000000000..a8fb938eb335f304ea1bf41e681ff2e85f980b7a --- /dev/null +++ b/cpp/tests/vereign/sync/channel_test.cc @@ -0,0 +1,214 @@ +#include <vereign/sync/channel.hh> +#include <thread> + +#include <catch2/catch.hpp> + +TEST_CASE("Channel::Channel", "[vereign/sync/channel]") { + vereign::sync::Channel<std::string>{10}; + vereign::sync::Channel<std::unique_ptr<std::string>>{10}; +} + +TEST_CASE("Channel general usage", "[vereign/sync/channel]") { + vereign::sync::Channel<std::string> ch{10}; + std::vector<std::string> input; + for (int i = 0; i < 100; i++) { + input.push_back(std::to_string(i)); + } + + std::thread t1{[&ch, &input]() { + for (auto &s : input) { + ch.Add(std::string(s)); + } + ch.Close(); + }}; + + std::vector<std::string> messages; + std::thread t2{[&ch, &messages]() { + for (;;) { + auto val = ch.Get(); + if (val) { + messages.push_back(val.Value()); + } + + if (val.IsClosed() && val.IsEmpty()) { + return; + } + } + }}; + + t1.join(); + t2.join(); + + REQUIRE_THAT(messages, Catch::Equals(input)); +} + +TEST_CASE("Drain closed channel", "[vereign/sync/channel]") { + vereign::sync::Channel<std::string> ch{10}; + std::vector<std::string> input; + for (int i = 0; i < 10; i++) { + ch.Add(std::to_string(i)); + } + ch.Close(); + + std::vector<std::string> messages; + for (;;) { + auto val = ch.Get(); + if (val) { + messages.push_back(val.Value()); + } + + if (val.IsClosed() && val.IsEmpty()) { + return; + } + } + + REQUIRE_THAT(messages, Catch::Equals(input)); +} + +TEST_CASE("Multiple consumers", "[vereign/sync/channel]") { + vereign::sync::Channel<int> ch{10}; + std::vector<int> input; + for (int i = 0; i < 100; i++) { + input.push_back(i); + } + + std::thread t1{[&ch, &input]() { + for (int val : input) { + ch.Add(val); + } + ch.Close(); + }}; + + std::mutex mu; + std::vector<int> messages; + auto worker = [&ch, &messages, &mu](){ + for (;;) { + auto val = ch.Get(); + if (val) { + std::lock_guard<std::mutex> lock{mu}; + messages.push_back(val.Value()); + } + + if (val.IsClosed() && val.IsEmpty()) { + return; + } + } + }; + + std::vector<std::thread> consumers; + for (int i = 0; i < 10; i++) { + consumers.emplace_back(std::thread{worker}); + } + + t1.join(); + for (auto& th: consumers) { + th.join(); + } + + std::sort(messages.begin(), messages.end()); + + REQUIRE_THAT(messages, Catch::Equals(input)); +} + +TEST_CASE("Unblock all consumers on close", "[vereign/sync/channel]") { + vereign::sync::Channel<int> ch{10}; + + auto worker = [&ch](){ + for (;;) { + auto val = ch.Get(); + if (val) { + } + + if (val.IsClosed() && val.IsEmpty()) { + return; + } + } + }; + + std::vector<std::thread> consumers; + for (int i = 0; i < 10; i++) { + consumers.emplace_back(std::thread{worker}); + } + + std::thread t1{[&ch]() { + ch.Close(); + }}; + t1.join(); + + for (auto& th: consumers) { + th.join(); + } +} + +TEST_CASE("Channel::TryAdd const reference", "[vereign/sync/channel]") { + int value; + vereign::sync::Channel<int> ch{2}; + auto result = ch.TryAdd(value); + CHECK(result); + CHECK(result.IsOk()); + CHECK_FALSE(result.IsClosed()); + CHECK_FALSE(result.IsFull()); + + result = ch.TryAdd(value); + CHECK(result); + CHECK(result.IsOk()); + CHECK_FALSE(result.IsClosed()); + CHECK_FALSE(result.IsFull()); + + result = ch.TryAdd(value); + CHECK_FALSE(result); + CHECK_FALSE(result.IsOk()); + CHECK_FALSE(result.IsClosed()); + CHECK(result.IsFull()); + + ch.Close(); + result = ch.TryAdd(value); + CHECK_FALSE(result); + CHECK_FALSE(result.IsOk()); + CHECK(result.IsClosed()); + CHECK(result.IsFull()); + + vereign::sync::Channel<int> closed_ch{2}; + closed_ch.Close(); + result = closed_ch.TryAdd(value); + CHECK_FALSE(result); + CHECK_FALSE(result.IsOk()); + CHECK(result.IsClosed()); + CHECK_FALSE(result.IsFull()); +} + +TEST_CASE("Channel::TryAdd rvalue reference", "[vereign/sync/channel]") { + vereign::sync::Channel<std::string> ch{2}; + auto result = ch.TryAdd("foo"); + CHECK(result); + CHECK(result.IsOk()); + CHECK_FALSE(result.IsClosed()); + CHECK_FALSE(result.IsFull()); + + result = ch.TryAdd("bar"); + CHECK(result); + CHECK(result.IsOk()); + CHECK_FALSE(result.IsClosed()); + CHECK_FALSE(result.IsFull()); + + result = ch.TryAdd("baz"); + CHECK_FALSE(result); + CHECK_FALSE(result.IsOk()); + CHECK_FALSE(result.IsClosed()); + CHECK(result.IsFull()); + + ch.Close(); + result = ch.TryAdd("baz"); + CHECK_FALSE(result); + CHECK_FALSE(result.IsOk()); + CHECK(result.IsClosed()); + CHECK(result.IsFull()); + + vereign::sync::Channel<std::string> closed_ch{2}; + closed_ch.Close(); + result = closed_ch.TryAdd("foo"); + CHECK_FALSE(result); + CHECK_FALSE(result.IsOk()); + CHECK(result.IsClosed()); + CHECK_FALSE(result.IsFull()); +} diff --git a/cpp/tests/vereign/test/device.cc b/cpp/tests/vereign/test/device.cc new file mode 100644 index 0000000000000000000000000000000000000000..bc47ef4c530a24b7f77e06fd1e9b305fe9b8b2a7 --- /dev/null +++ b/cpp/tests/vereign/test/device.cc @@ -0,0 +1,143 @@ +#include <vereign/test/device.hh> + +#include <vereign/client_library/common_types.pb.h> +#include <vereign/client_library/types.gen.pb.h> +#include <vereign/fs/util.hh> +#include <vereign/fs/path.hh> +#include <vereign/test/service_context.hh> +#include <vereign/restapi/client_session.hh> +#include <vereign/service/identity_service.hh> +#include <vereign/identity/provider.hh> +#include <vereign/client_library/identity_types.pb.h> + +#include <boost/filesystem/operations.hpp> + +namespace vereign::test { + +Device::Device(ServiceContext& service_context) + : service_context_{service_context}, + identity_service_{std::make_unique<service::IdentityService>( + service_context_.ClientSession(), + service_context_.IdentityProvider() + )} +{ +} + +Device::~Device() = default; + +void Device::Login(const std::string& public_key) { + auto req = std::make_unique<vereign::client_library::LoginWithExistingPubKeyForm>(); + auto resp = std::make_unique<vereign::client_library::EmptyResponse>(); + req->set_pubkey(public_key); + + identity_service_->LoginWithExistingPubKey(req.get(), resp.get()); + + if (resp->code() != "200") { + throw std::runtime_error("login to test old device failed with: " + resp->error()); + } +} + +void Device::ConfirmNewDevice(const std::string& qr_code, const std::string& action_id) { + auto req = std::make_unique<vereign::client_library::ConfirmNewDeviceForm>(); + req->set_code(qr_code); + req->set_actionid(action_id); + auto resp = std::make_unique<vereign::client_library::EmptyResponse>(); + + auto result = identity_service_->ConfirmNewDevice(req.get(), resp.get()); + result.wait(); + + if (resp->code() != "200") { + throw std::runtime_error("confirm new device failed with: " + resp->error()); + } +} + +void Device::AuthorizeDevice(const std::string& device_hash) { + auto req = std::make_unique<client_library::EmptyRequest>(); + auto resp = std::make_unique<client_library::ListDevicesHandlerFormResponse>(); + + auto result = identity_service_->ListDevices(req.get(), resp.get()); + result.wait(); + if (resp->code() != "200") { + throw std::runtime_error("authorize device failed with: " + resp->error()); + } + + std::string device_id; + for (auto& device : resp->data()) { + if (device.fingerprint() == device_hash) { + device_id = device.deviceid(); + break; + } + } + + if (device_id.empty()) { + throw std::runtime_error("authorize device failed with: device not found"); + } + + auto auth_req = std::make_unique<client_library::AuthorizeDeviceForm>(); + auth_req->set_deviceid(device_id); + auto auth_resp = std::make_unique<client_library::EmptyResponse>(); + + auto auth_result = identity_service_->AuthorizeDevice(auth_req.get(), auth_resp.get()); + auth_result.wait(); + if (auth_resp->code() != "200") { + throw std::runtime_error("authorize device failed with: " + auth_resp->error()); + } +} + +void Device::CreateNewDevice(ServiceContext& service_context, const std::string& pin) { + auto service = service::IdentityService{ + service_context.ClientSession(), + service_context.IdentityProvider() + }; + + // register new device + auto req = std::make_unique<vereign::client_library::LoginFormNewDevice>(); + auto resp = std::make_unique<vereign::client_library::LoginFormNewDeviceResponse>(); + req->set_pin(pin); + + service.LoginWithNewDevice(req.get(), resp.get()); + if (resp->code() != "200") { + throw std::runtime_error("creating new device failed with: " + resp->error()); + } + + // confirm and authorize the new device using an old device + ConfirmNewDevice(resp->data().qrcode(), resp->data().actionid()); + AuthorizeDevice(service_context.IdentityProvider().GetDeviceHash()); +} + +void PrepareNewDevice( + const std::string& host, + const std::string& port, + const std::string& public_key, + const std::string& pin, + const std::string& storage_path +) { + // the old device is used later for new device confirmation and authorization + auto old_storage_path = fs::TempFilePath("test_db_"); + auto rm_old_storage_path = fs::RemoveFileGuard{old_storage_path}; + auto old_device_ctx = test::ServiceContext{host, port, old_storage_path}; + auto old_device = test::Device{old_device_ctx}; + old_device.Login(public_key); + + auto service_context = test::ServiceContext{host, port, fs::path::Join(storage_path, "db")}; + auto identity_service = service::IdentityService{ + service_context.ClientSession(), + service_context.IdentityProvider() + }; + + // register new device + auto register_req = std::make_unique<vereign::client_library::LoginFormNewDevice>(); + auto register_resp = std::make_unique<vereign::client_library::LoginFormNewDeviceResponse>(); + register_req->set_pin(pin); + + identity_service.LoginWithNewDevice(register_req.get(), register_resp.get()); + if (register_resp->code() != "200") { + throw std::runtime_error("register new device failed with: " + register_resp->error()); + } + + // confirm and authorize the new device using an old device + old_device.ConfirmNewDevice(register_resp->data().qrcode(), register_resp->data().actionid()); + old_device.AuthorizeDevice(service_context.IdentityProvider().GetDeviceHash()); +} + +} // namespace vereign::test diff --git a/cpp/tests/vereign/test/device.hh b/cpp/tests/vereign/test/device.hh new file mode 100644 index 0000000000000000000000000000000000000000..9ad85bd8a42142f35f7c9a589244c2a8b25fd294 --- /dev/null +++ b/cpp/tests/vereign/test/device.hh @@ -0,0 +1,43 @@ +#ifndef __TESTS_VEREIGN_TEST_DEVICE_HH +#define __TESTS_VEREIGN_TEST_DEVICE_HH + +#include <memory> +#include <string> + +namespace vereign::service { +class IdentityService; +} + +namespace vereign::test { + +class ServiceContext; + +class Device { +public: + Device(ServiceContext& service_context); + ~Device(); + + Device(const Device&) = delete; + auto operator=(const Device&) -> Device& = delete; + + void Login(const std::string& public_key); + void ConfirmNewDevice(const std::string& qr_code, const std::string& action_id); + void AuthorizeDevice(const std::string& device_hash); + void CreateNewDevice(ServiceContext& service_context, const std::string& pin); + +private: + ServiceContext& service_context_; + std::unique_ptr<service::IdentityService> identity_service_; +}; + +void PrepareNewDevice( + const std::string& host, + const std::string& port, + const std::string& public_key, + const std::string& pin, + const std::string& storage_path +); + +} // namespace vereign::test + +#endif // __TESTS_VEREIGN_TEST_DEVICE_HH diff --git a/cpp/tests/vereign/test/service_context.cc b/cpp/tests/vereign/test/service_context.cc new file mode 100644 index 0000000000000000000000000000000000000000..a6b5fc85a675920a667cd0890ffe0b632cda516a --- /dev/null +++ b/cpp/tests/vereign/test/service_context.cc @@ -0,0 +1,54 @@ +#include <vereign/test/service_context.hh> + +#include <vereign/kvstore/sqlite_storage.hh> +#include <vereign/kvstore/crypto_storage.hh> +#include <vereign/restapi/client.hh> +#include <vereign/restapi/client_session.hh> +#include <vereign/identity/provider.hh> + +#include <boost/filesystem/operations.hpp> + +namespace vereign::test { + +ServiceContext::ServiceContext( + const std::string& vereign_host, + const std::string& vereign_port, + std::string storage_path +) : work_guard_{boost::asio::make_work_guard(ioc_)}, + ssl_context_{boost::asio::ssl::context::tlsv12_client}, + client_{std::make_unique<restapi::Client>( + ioc_, ssl_context_, vereign_host, vereign_port + )}, + client_session_{std::make_unique<restapi::ClientSession>(*client_)}, + storage_path_{std::move(storage_path)}, + sqlite_storage_{std::make_unique<kvstore::SqliteStorage>(storage_path_)}, + storage_{std::make_unique<kvstore::CryptoStorage>(*sqlite_storage_, true)}, + identity_provider_{std::make_unique<identity::Provider>(*storage_)} +{ + service_thread_ = std::thread([this]() { + ioc_.run(); + }); +} + +auto ServiceContext::IdentityProvider() -> identity::Provider& { + return *identity_provider_; +} + +auto ServiceContext::ClientSession() -> restapi::ClientSession& { + return *client_session_; +} + +void ServiceContext::Shutdown() { + client_session_->Close(); + + work_guard_.reset(); + if (service_thread_.joinable()) { + service_thread_.join(); + } +} + +ServiceContext::~ServiceContext() { + Shutdown(); +} + +} diff --git a/cpp/tests/vereign/test/service_context.hh b/cpp/tests/vereign/test/service_context.hh new file mode 100644 index 0000000000000000000000000000000000000000..7666e29eba7aa135f3a048ef13d1162fd346ce4d --- /dev/null +++ b/cpp/tests/vereign/test/service_context.hh @@ -0,0 +1,63 @@ +#ifndef __TESTS_VEREIGN_TEST_SERVICE_CONTEXT_HH +#define __TESTS_VEREIGN_TEST_SERVICE_CONTEXT_HH + +#include <boost/asio/io_context.hpp> +#include <boost/asio/ssl/context.hpp> +#include <boost/asio/executor_work_guard.hpp> +#include <boost/filesystem/path.hpp> + +#include <thread> + +namespace vereign { + +namespace restapi { +class Client; +class ClientSession; +} + +namespace kvstore { +class SqliteStorage; +class CryptoStorage; +} + +namespace identity { +class Provider; +} + +} + +namespace vereign::test { + +class ServiceContext { +public: + ServiceContext( + const std::string& vereign_host, + const std::string& vereign_port, + std::string storage_path + ); + ~ServiceContext(); + + ServiceContext(const ServiceContext&) = delete; + auto operator=(const ServiceContext&) -> ServiceContext& = delete; + + auto IdentityProvider() -> identity::Provider&; + auto ClientSession() -> restapi::ClientSession&; + + void Shutdown(); + +private: + boost::asio::io_context ioc_; + boost::asio::executor_work_guard<boost::asio::io_context::executor_type> work_guard_; + boost::asio::ssl::context ssl_context_; + std::unique_ptr<restapi::Client> client_; + std::unique_ptr<restapi::ClientSession> client_session_; + std::string storage_path_; + std::unique_ptr<kvstore::SqliteStorage> sqlite_storage_; + std::unique_ptr<kvstore::CryptoStorage> storage_; + std::unique_ptr<identity::Provider> identity_provider_; + std::thread service_thread_; +}; + +} // namespace vereign::test + +#endif // __TESTS_VEREIGN_TEST_SERVICE_CONTEXT_HH diff --git a/cpp/vendor/CMakeLists.txt b/cpp/vendor/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c0f4ec13688b907308716fb24ca8e50b1f074f5a --- /dev/null +++ b/cpp/vendor/CMakeLists.txt @@ -0,0 +1,71 @@ +cmake_minimum_required (VERSION 3.16.5) + +project (vereign-vendor) + +if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + add_definitions(-D_WIN32_WINNT=0x0601) + + set(CMAKE_C_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3") + set(CMAKE_CXX_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3 /GR /EHsc") + + set(CMAKE_C_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1") + set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1") + + set(CMAKE_CXX_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL") + set(CMAKE_C_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL") + + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Release>:Release>") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") + + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDebugDLL") + endif() +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_C_FLAGS_RELEASE "-g -O3 -Wall -Wextra -pedantic") + set(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wall -Wextra -pedantic") + set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -Wall -Wextra -pedantic") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wextra -pedantic") +endif() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_C_FLAGS_RELEASE "-g -O3 -Wall -Wextra -pedantic") + set(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wall -Wextra -pedantic") + set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -Wall -Wextra -pedantic") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wextra -pedantic") +endif() + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_EXTENSIONS OFF) + +string(TOLOWER "${CMAKE_BUILD_TYPE}" _build_type) +set(VENDOR_INSTALL_DIR ${CMAKE_SOURCE_DIR}/../cmake-install-vendor-${_build_type} CACHE STRING "vendor directory") +set(CMAKE_PREFIX_PATH ${VENDOR_INSTALL_DIR} CACHE STRING "") +option(CMAKE_FIND_USE_CMAKE_SYSTEM_PATH NO) + +include(FetchContent) +include(ExternalProject) + +include(fmt.cmake) +include(boring_ssl.cmake) +include(boost.cmake) +include(grpc.cmake) +include(nlohmann.cmake) +include(sqlite3.cmake) + +string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type) +message(STATUS "Summary: + + Vendor install dir: ${VENDOR_INSTALL_DIR} + Compiler: + Build type: ${CMAKE_BUILD_TYPE} + C compiler: ${CMAKE_C_COMPILER} + CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS} + C++ compiler: ${CMAKE_CXX_COMPILER} + CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS} + WARNCFLAGS: ${WARNCFLAGS} + CXX1XCXXFLAGS: ${CXX1XCXXFLAGS} + CMAKE_MSVC_RUNTIME_LIBRARY: ${CMAKE_MSVC_RUNTIME_LIBRARY} +") diff --git a/cpp/vendor/boost.cmake b/cpp/vendor/boost.cmake new file mode 100644 index 0000000000000000000000000000000000000000..4d49081cc71229db423067033cdcd9551195644a --- /dev/null +++ b/cpp/vendor/boost.cmake @@ -0,0 +1,38 @@ +include(ExternalProject) + +set(_boost_libs regex system thread date_time filesystem) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + list(TRANSFORM _boost_libs PREPEND --with-) + + set(_configure_command <SOURCE_DIR>/bootstrap.bat) + set(_build_command <SOURCE_DIR>/b2 install --prefix=<INSTALL_DIR> ${_boost_libs} link=static) + set(_install_command "") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(_boost_toolset clang) + set(_boost_cxx_flags "-std=c++${CMAKE_CXX_STANDARD} -fPIC") + set(_boost_c_flags "-fPIC") + string(REPLACE ";" "," _boost_libs "${_boost_libs}") + + set(_configure_command <SOURCE_DIR>/bootstrap.sh --prefix=<INSTALL_DIR> --with-toolset=${_boost_toolset} --with-libraries=${_boost_libs}) + set(_build_command <SOURCE_DIR>/b2 toolset=${_boost_toolset} cxxflags=${_boost_cxx_flags} cflags=${_boost_c_flags}) + set(_install_command <SOURCE_DIR>/b2 install) +endif() + +ExternalProject_Add(boostlib + PREFIX boost + URL https://dl.bintray.com/boostorg/release/1.72.0/source/boost_1_72_0.zip + URL_HASH SHA256=8c20440aaba21dd963c0f7149517445f50c62ce4eb689df2b5544cc89e6e621e + BUILD_IN_SOURCE ON + INSTALL_DIR ${VENDOR_INSTALL_DIR}/boost + + USES_TERMINAL_DOWNLOAD ON + USES_TERMINAL_UPDATE ON + USES_TERMINAL_CONFIGURE ON + USES_TERMINAL_BUILD ON + USES_TERMINAL_INSTALL ON + + CONFIGURE_COMMAND "${_configure_command}" + BUILD_COMMAND "${_build_command}" + INSTALL_COMMAND "${_install_command}" +) diff --git a/cpp/vendor/boring_ssl.cmake b/cpp/vendor/boring_ssl.cmake new file mode 100644 index 0000000000000000000000000000000000000000..91cfaa725dd36053bec5ea75a9f22dfb496e5ed6 --- /dev/null +++ b/cpp/vendor/boring_ssl.cmake @@ -0,0 +1,44 @@ + +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(_install_command + ${CMAKE_COMMAND} -E copy crypto.lib <INSTALL_DIR>/lib/crypto.lib + COMMAND ${CMAKE_COMMAND} -E copy ssl.lib <INSTALL_DIR>/lib/ssl.lib + COMMAND ${CMAKE_COMMAND} -E copy_directory <SOURCE_DIR>/src/include <INSTALL_DIR>/include + ) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(_install_command + ${CMAKE_COMMAND} -E copy libcrypto.a <INSTALL_DIR>/lib/libcrypto.a + COMMAND ${CMAKE_COMMAND} -E copy libssl.a <INSTALL_DIR>/lib/libssl.a + COMMAND ${CMAKE_COMMAND} -E copy_directory <SOURCE_DIR>/src/include <INSTALL_DIR>/include + ) +endif() + +ExternalProject_Add(boringssllib + PREFIX boringssl + GIT_REPOSITORY git@github.com:google/boringssl.git + GIT_TAG 1c2769383f027befac5b75b6cedd25daf3bf4dcf + INSTALL_DIR ${VENDOR_INSTALL_DIR}/boringssl + + USES_TERMINAL_DOWNLOAD ON + USES_TERMINAL_UPDATE ON + USES_TERMINAL_CONFIGURE ON + USES_TERMINAL_BUILD ON + USES_TERMINAL_INSTALL ON + + CMAKE_CACHE_ARGS + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY} + -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG} + -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE} + -DBUILD_SHARED_LIBS:BOOL=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON + + INSTALL_COMMAND "${_install_command}" +) diff --git a/cpp/vendor/cmake/sqlite3/CMakeLists.txt b/cpp/vendor/cmake/sqlite3/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c203d8643bb166579d9785a215cedc7ddfa5b104 --- /dev/null +++ b/cpp/vendor/cmake/sqlite3/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required (VERSION 3.16.5) + +project (sqlite3) + +add_library(sqlite3 STATIC + sqlite3.c +) + +install(TARGETS sqlite3 DESTINATION lib) +install(FILES sqlite3.h sqlite3ext.h DESTINATION include) diff --git a/cpp/vendor/fmt.cmake b/cpp/vendor/fmt.cmake new file mode 100644 index 0000000000000000000000000000000000000000..55359ac9333f8f58e3ce1a95d03b2165913ecb7e --- /dev/null +++ b/cpp/vendor/fmt.cmake @@ -0,0 +1,28 @@ + +ExternalProject_Add(fmtlib + PREFIX fmt + GIT_REPOSITORY git@github.com:fmtlib/fmt.git + GIT_TAG 6.2.0 + INSTALL_DIR ${VENDOR_INSTALL_DIR}/fmt + + USES_TERMINAL_DOWNLOAD ON + USES_TERMINAL_UPDATE ON + USES_TERMINAL_CONFIGURE ON + USES_TERMINAL_BUILD ON + USES_TERMINAL_INSTALL ON + + CMAKE_CACHE_ARGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY} + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG} + -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE} + -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON + -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> + -DFMT_TEST:BOOL=OFF +) diff --git a/cpp/vendor/grpc.cmake b/cpp/vendor/grpc.cmake new file mode 100644 index 0000000000000000000000000000000000000000..a33a809c38cf41bcf9c0136dc51fab3f9bb4176a --- /dev/null +++ b/cpp/vendor/grpc.cmake @@ -0,0 +1,33 @@ + +ExternalProject_Add(grpclib + PREFIX grpc + GIT_REPOSITORY git@github.com:grpc/grpc.git + GIT_TAG v1.28.1 + GIT_SHALLOW ON + INSTALL_DIR ${VENDOR_INSTALL_DIR}/grpc + DEPENDS boringssllib + + USES_TERMINAL_DOWNLOAD ON + USES_TERMINAL_UPDATE ON + USES_TERMINAL_CONFIGURE ON + USES_TERMINAL_BUILD ON + USES_TERMINAL_INSTALL ON + + CMAKE_CACHE_ARGS + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY} + -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG} + -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE} + -DBUILD_SHARED_LIBS:BOOL=OFF + -DgRPC_SSL_PROVIDER:STRING=package + -DOPENSSL_USE_STATIC_LIBS:BOOL=ON + -DOPENSSL_ROOT_DIR:STRING=${VENDOR_INSTALL_DIR}/boringssl + -DgRPC_INSTALL:BOOL=ON +) diff --git a/cpp/vendor/nlohmann.cmake b/cpp/vendor/nlohmann.cmake new file mode 100644 index 0000000000000000000000000000000000000000..93272436440658733a42926a90b4cc156767bae6 --- /dev/null +++ b/cpp/vendor/nlohmann.cmake @@ -0,0 +1,27 @@ + +ExternalProject_Add(nlohmannlib + PREFIX nlohmann + GIT_REPOSITORY git@github.com:nlohmann/json.git + GIT_TAG v3.7.3 + INSTALL_DIR ${VENDOR_INSTALL_DIR}/nlohmann + + USES_TERMINAL_DOWNLOAD ON + USES_TERMINAL_UPDATE ON + USES_TERMINAL_CONFIGURE ON + USES_TERMINAL_BUILD ON + USES_TERMINAL_INSTALL ON + + CMAKE_CACHE_ARGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY} + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG} + -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE} + -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> + -DJSON_BuildTests:BOOL=OFF +) diff --git a/cpp/vendor/sqlite3.cmake b/cpp/vendor/sqlite3.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6c39ac93514e8c9795628a98d9007df8181fddf0 --- /dev/null +++ b/cpp/vendor/sqlite3.cmake @@ -0,0 +1,29 @@ + +ExternalProject_Add(sqlite3lib + PREFIX sqlite3 + URL https://www.sqlite.org/2020/sqlite-amalgamation-3320300.zip + URL_HASH SHA1=0c805bea134712a903290a26b2a61c3a8a3bd8cc + INSTALL_DIR ${VENDOR_INSTALL_DIR}/sqlite3 + + USES_TERMINAL_DOWNLOAD ON + USES_TERMINAL_UPDATE ON + USES_TERMINAL_CONFIGURE ON + USES_TERMINAL_BUILD ON + USES_TERMINAL_INSTALL ON + + UPDATE_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/cmake/sqlite3/CMakeLists.txt <SOURCE_DIR>/CMakeLists.txt + + CMAKE_CACHE_ARGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY} + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG} + -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE} + -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON + -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> +)